赵走x博客
网站访问量:151498
首页
书籍
软件
工具
古诗词
搜索
登录
49、Flux:理念、回顾Whinepad
48、lint、Flow、测试与复验:测试
47、lint、Flow、测试与复验:Flow
46、lint、Flow、测试与复验:ESLint
45、lint、Flow、测试与复验:package.json
44、构建实例应用:<Whinepad>
43、构建实例应用:应用配置
43、构建实例应用:<Excel>:改进的新版本
42、构建实例应用:组件:对话框
41、构建实例应用:组件:Actions
39、构建实例应用:表单:Form
38、构建实例应用:表单:<FormInput>“工厂组件”
37、构建实例应用:表单:Rating组件
36、构建实例应用:表单:Suggest
35、构建实例应用:Button组件
34、构建实例应用:组件
33、构建实例应用:Whinepad v.0.0.1
32、发布
31、开始构建
30、安装必备工具
29、为应用开发做准备:一个模板应用
28、JSX 和表单
27、JSX 和HTML 的区别
26、在JSX 中返回多个节点
25、展开属性
24、HTML 实体
23、JSX入门
22、Excel:一个出色的表格组件:下载表格数据
21、Excel:一个出色的表格组件:即时回放
20、Excel:一个出色的表格组件:搜索
19、Excel:一个出色的表格组件:编辑数据
18、Excel:一个出色的表格组件:排序
17、Excel:一个出色的表格组件
16、 PureRenderMixin
15、 性能优化:避免组件更新
14、 生命周期示例:使用子组件
13、组件生命周期示例:使用mixin
12、组件:生命周期方法
11、中途改变属性
10、从外部访问组件
9、在初始化state 时使用props:一种反模式
8、 props 与state
7、关于DOM 事件的说明
6、组件:带状态的文本框组件
5、组件的state
4、组件的propTypes
3、组件的属性
2、组件的基础
1、Hello World
50、Flux:Store
42、构建实例应用:组件:对话框
资源编号:76095
书籍
React快速上手开发
热度:98
接下来建立一个通用的对话框组件,用于显示所有的消息通知(代替alert())或弹出窗口(如图6-9 所示)。比如在添加/ 编辑表单时,需要在数据表格的顶部显示一个模态对话框。
接下来建立一个通用的对话框组件,用于显示所有的消息通知(代替alert())或弹出窗口(如图6-9 所示)。比如在添加/ 编辑表单时,需要在数据表格的顶部显示一个模态对话框。  图6-9:对话框 具体用法: ```
alert(type)}> Anything goes here,see:
A Button
``` 该组件的实现方式和`
` 类似——没有状态(只需实现render() 方法),而且用户点击对话框的底部按钮时,将会触发onAction 回调函数。 ``` import React from 'react' // 从 React v15.5 开始 ,React.PropTypes 助手函数已被弃用,我们建议使用 prop-types 库 来定义contextTypes。 import PropTypes from 'prop-types' import Button from './Button' class Dialog extends Component{ } Dialog.propTypes={ header:PropTypes.string.isRequired, confirmLabel:PropTypes.string, modal:PropTypes.bool, onAction:PropTypes.func, hasCancel:PropTypes.bool }; Dialog.defaultProps={ confirmLabel:'ok', modal:false, onAction:()=>{}, hasCancel:true }; export default Dialog ``` 然而,这个组件是通过类定义的,而非箭头函数,因为该组件需要定义两个额外的生命周期方法: ``` componentWillUnmount(){ document.body.classList.add('DialogModalOpen'); } componentDidMount(){ if(this.props.modal){ document.body.classList.add('DialogModalOpen'); } } ``` 在显示模态对话框时,需要给document.body 添加一个类名,以便控制整个页面的样式(添加一个灰色的蒙层)。 最后,render() 方法负责把模态框的包裹层、头部、内容区域以及底部组合起来。内容区域可以容纳其他任何组件(或者纯文本);对话框本身没有对内容作过多限制: ``` render(){ return (
{this.props.header}
{this.props.children}
{this.props.hasCancel?
:null }
{this.props.confirmLabel}
); } ``` 此外还有一些优化点,供读者思考。 * 除了提供单个onAction 属性以外,另一种方案是分别提供onConfirm(用户点击确认按钮触发)以及onDismiss(用户点击取消按钮触发)。 * 一个可优化的点是在用户按下Esc 键时关闭模态框。你有办法实现这个功能吗? * 包裹层的div 的类名需要进行条件判断,可以借助classnames 模块进行优化,用法如下所示。 修改前: ```
``` 修改后: ```
```