赵走x博客
网站访问量:151882
首页
书籍
软件
工具
古诗词
搜索
登录
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
39、构建实例应用:表单:Form
资源编号:76093
书籍
React快速上手开发
热度:81
是时候建立一个`<Form> `组件把以上组件组合到一起了
现在你已经拥有了以下组件: * 自定义输入元素(比如`
`); * 内置的输入元素(比如`
`); * `
`,一个根据type 属性创建输入元素的工厂组件。 是时候建立一个`
`组件把以上组件组合到一起了(如图6-7 所示)。  图6-7:表单 表单组件应该是可重用的,因此不应该把关于这个评价应用的逻辑硬编码到该组件中。(更进一步说,关于酒的一切都不应该被硬编码,这样组件才能重新被应用到供用户抱怨上。)这个
组件可以通过fields 数组进行表单域的配置,而每项表单域的定义内容包括: * 输入类型type,默认值为input; * id 属性,以便在随后找到这个输入元素; * label 属性,即输入元素的标签内容; * 可选属性options,用于传递自动建议的内容列表。 此外,
组件还接收一个包含了默认值的对象,并且配置是否只读的选项,用于阻止用户编辑表单内容: ``` import React,{Component} from 'react' // 从 React v15.5 开始 ,React.PropTypes 助手函数已被弃用,我们建议使用 prop-types 库 来定义contextTypes。 import PropTypes from 'prop-types' class Form extends Component{ getData(){} render(){} } Form.propTypes={ field:PropTypes.arrayOf(PropTypes.shape({ id:PropTypes.string.isRequired, label:PropTypes.string.isRequired, type:PropTypes.string, options:PropTypes.arrayOf(PropTypes.string), })).isRequired, initialData:PropTypes.object, readonly:PropTypes.bool }; export default Form ``` 注意这里使用了PropTypes.shape。该方法具体地表明了对象希望接收的内容。这种用法比起概括性地使用fields: PropTypes.arrayOf(PropTypes.object) 或者fields: PropTypes.array 更为严格,而且当其他开发者开始使用你的组件时,这样做有助于减少错误情况的发生。 initialData 是一个键值型的对象字典({fieldname: value}),与组件的getData() 方法所返回的数据格式一致。 以下是`
`组件的示例用法,放置在发现工具中: ```
Form
``` 现在回到组件的逻辑实现。这个组件还需要实现getData() 与render() 方法: ``` getData(){ let data={}; this.props.fields.forEach(field=> data[field.id]=this.refs[field.id].getValue() ); return data; } ``` 如你所见,这个方法只需要把render() 方法中设置的ref 属性循环一遍,并且调用输入元素的getValue() 方法。 render() 方法本身也相当简单,没有用到任何新语法或新特性: ``` render(){ return (
{this.props.fields.map(field=>{ const prefilled=this.props.initialData && this.props.initialData[field.id]; if(!this.props.readonly){ return (
{field.label}
); } if(!prefilled){ return null; } return (
{field.label}
{ field.type==='rating'?
:
{prefilled}
}
); },this)}
) } ```