赵走x博客
网站访问量:151966
首页
书籍
软件
工具
古诗词
搜索
登录
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
28、JSX 和表单
资源编号:76078
书籍
React快速上手开发
热度:76
接下来,我们将介绍在处理表单时JSX 和HTML 的一些区别。
接下来,我们将介绍在处理表单时JSX 和HTML 的一些区别。 # 1、onChange 处理器 在使用表单元素时,用户会与表单进行交互,并改变元素值。在React 中,你可以通过onChange 属性订阅这些属性发生的更改。该方法可以监听单选按钮和选择框的checked 属性变化,以及`
`下拉框的selected 属性变化,此外还可以监听文本框和`
` 的输入内容变化,onChange 事件会在用户输入时触发,相比于在元素失去焦点时才触发的onchange 原生事件,前者更具实用性。这意味着,我们不需要为了监听用户输入而订阅所有的鼠标事件和键盘事件了。 # 2、value 和defaultValue 的区别 在HTML 中,如果你创建一个输入框`
`,然后在输入框中键入bye,你会发现: ``` i.value; // "bye" i.getAttribute('value'); // "hello" ``` 而在React 中,value 属性总是和文本输入框的最新内容保持一致。如果你想指定默认值,可以使用defaultValue 属性。 在下面这个代码片段中,你拥有一个`
` 组件。该组件预先填充的内容为hello,还绑定了一个onChange 处理器。当把hello 的最后一个字符o 删掉时,value 的值变为hell,而defaultValue 的值仍然是hello: ``` function log(event) { console.log("value: ", event.target.value); console.log("defaultValue: ", event.target.defaultValue); } React.render(
, document.getElementById('app') ); ``` 你应当把这种模式应用到自定义组件中:如果你需要接收一个属性,并暗示用户该属性应该一直是最新的(比如value、data),就让其保持更新。否则请把属性名改为initialData(在第3 章讨论过)或者defaultValue,以保证结果符合预期。 # 3、`textarea` 的值 为了和文本输入框保持一致,React 版本的`
`组件同样能够接收value 和defaultValue 属性,其中value 属性值保持最新,而defaultValue 则和原来的值保持一致。如果你依然坚持HTML 风格,也就是使用`
` 的子节点来定义值(不推荐这样做),React 会把子节点的值定义为defaultValue。 在HTML 中,`
`(按照W3C 的定义)之所以要把子节点作为值,是为了方便开发者在输入内容中进行换行。然而,基于JavaScript 的React 不会受到这样的限制。当你需要换行时,只需要使用`\n `即可。 请思考下面这个例子的输出结果,答案如图4-9 所示: ``` function log(event) { console.log(event.target.value); console.log(event.target.defaultValue); } React.render(
, document.getElementById('app1') ); React.render(
, document.getElementById('app2') ); React.render(
hello world
, document.getElementById('app3') ); React.render(
{"hello\n\ world"}
, document.getElementById('app4') ); ```  图4-9:在`
` 中换行 要注意文本串"hello\nworld" 与JavaScript 字符串{"hello\nworld"} 作为属性值时的区别。 此外还要注意,在JavaScript 中,多行字符串需要使用\ 进行转义(参见第4 个例子)。 在这个例子的最后,React 会在使用传统方法设置`
`子节点的值时,在控制台中发出警告。 # 4、select 的值 当你在HTML 中使用`
` 标签时,可以通过`
`指定预先选择的项,比如这样: ```
Should I stay
or should I go
``` 在React 中,则可以通过value 或者更好的defaultValue 来给`
`元素指定值: ``` // React/JSX
Should I stay
or should I go
``` 这同样适用于多重选择的情况,只需提供一个包含预选择值的数组: ```
Should I stay
or should I go
If I stay it will be trouble
``` 如果你把上述两种方式搞混了,React 会在你为`
` 标签设置selected属性时给予警告提示。 也可以使用`
` 代替`
`,但是不推荐这样做,因为这需要你手动更新用户看到的值。否则,当用户选择了一个不同的选项时,`
` 显示的内容不会发生变化。换而言之,你需要进行类似这样的处理: ``` var MySelect = React.createClass({ getInitialState: function() { return {value: 'move'}; }, _onChange: function(event) { this.setState({value: event.target.value}); }, render: function() { return (
Should I stay
or should I go
If I stay it will be trouble
); } }); ```