列表渲染
使用 Javascript 中的 map()
方法遍历数组,将数组中每个元素变成 <li>
标签,最后将得到的数组赋值给 list
。
const numbers = [1, 2, 3, 4, 5];
const list = numbers.map((number) => <li key={number.toString()}>{number}</li>);
需要为每个列表元素分配一个 key 属性以免出现警告。
然后将整个 list
插入到 <ul>
标签中,渲染 DOM。
ReactDOM.render(
<ul>{list}</ul>,
document.getElementById('root')
);
Key
Key 相当于数组中每个元素的标识符,帮助 React 对元素识别。元素的 key 最好是这个元素在列表中独一无二的字符串,例如 id。也可以使用元素索引 index 作为 key:
const todoItems = todos.map((todo, index) =>
<li key={index}>
{todo.text}
</li>
);
不建议使用索引作为 key 值,因为当列表项目的顺序变化时,会导致性能变差,还可能引起组件状态的问题。
表单
受控组件
渲染表单的 React 组件控制着用户输入过程中表单发生的操作,这样的表单输入元素叫做“受控组件”。例如,当我们想在输入一个表单的同时在屏幕上展示相同的内容,可以将表单写为受控组件:
class Form extends React.Component {
constructor(props) {
super(props);
this.state = { value: '' };
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({
value: event.target.value
});
}
handleSubmit(event) {
alert('提交的名字: ' + this.state.value);
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
名字:
<input type="text" value={this.state.value} onChange={this.handleChange} />
</label>
<input type="submit" value="提交" />
</form>
);
}
}
将表单元素的
value
属性设置为this.state.value
,使得 React 的 state 成为其唯一数据源。而事件处理方法handlechange
在每次按键时都会执行并更新 React 的 state,因此this.state.value
的值将随着用户输入而更新。
处理多个输入
当组件中包含多个表单元素时,我们可以给每个元素添加与组件 state 同名的 name
属性,并让处理函数根据 event.target.name
的值选择要执行的操作。事件处理方法 handleChange
改写为如下形式:
handleChange(event) {
const name = event.target.name
const value = event.target.value
this.setState({
[name]: value
});
}