列表渲染


使用 Javascript 中的 map() 方法遍历数组,将数组中每个元素变成 <li> 标签,最后将得到的数组赋值给 list

  1. const numbers = [1, 2, 3, 4, 5];
  2. const list = numbers.map((number) => <li key={number.toString()}>{number}</li>);

需要为每个列表元素分配一个 key 属性以免出现警告。

然后将整个 list 插入到 <ul> 标签中,渲染 DOM。

  1. ReactDOM.render(
  2. <ul>{list}</ul>,
  3. document.getElementById('root')
  4. );


Key


Key 相当于数组中每个元素的标识符,帮助 React 对元素识别。元素的 key 最好是这个元素在列表中独一无二的字符串,例如 id。也可以使用元素索引 index 作为 key:

  1. const todoItems = todos.map((todo, index) =>
  2. <li key={index}>
  3. {todo.text}
  4. </li>
  5. );

不建议使用索引作为 key 值,因为当列表项目的顺序变化时,会导致性能变差,还可能引起组件状态的问题。


表单


受控组件

渲染表单的 React 组件控制着用户输入过程中表单发生的操作,这样的表单输入元素叫做“受控组件”。例如,当我们想在输入一个表单的同时在屏幕上展示相同的内容,可以将表单写为受控组件:

  1. class Form extends React.Component {
  2. constructor(props) {
  3. super(props);
  4. this.state = { value: '' };
  5. this.handleChange = this.handleChange.bind(this);
  6. this.handleSubmit = this.handleSubmit.bind(this);
  7. }
  8. handleChange(event) {
  9. this.setState({
  10. value: event.target.value
  11. });
  12. }
  13. handleSubmit(event) {
  14. alert('提交的名字: ' + this.state.value);
  15. event.preventDefault();
  16. }
  17. render() {
  18. return (
  19. <form onSubmit={this.handleSubmit}>
  20. <label>
  21. 名字:
  22. <input type="text" value={this.state.value} onChange={this.handleChange} />
  23. </label>
  24. <input type="submit" value="提交" />
  25. </form>
  26. );
  27. }
  28. }

将表单元素的 value 属性设置为 this.state.value,使得 React 的 state 成为其唯一数据源。而事件处理方法 handlechange 在每次按键时都会执行并更新 React 的 state,因此 this.state.value 的值将随着用户输入而更新。


处理多个输入

当组件中包含多个表单元素时,我们可以给每个元素添加与组件 state 同名的 name 属性,并让处理函数根据 event.target.name 的值选择要执行的操作。事件处理方法 handleChange 改写为如下形式:

  1. handleChange(event) {
  2. const name = event.target.name
  3. const value = event.target.value
  4. this.setState({
  5. [name]: value
  6. });
  7. }