对组件进行适当的拆分有利于项目维护。
例子:结合上一节TodoList的项目,将list中的每一项都拆分成一个组件
新建一个组件文件(即list中的某一项)TodoItem.js
实现添加功能
content :父组件通过属性的方式向子组件传值(告诉子组件我们要传递的内容)
this.props :子组件接收父组件传递的值
//TodoItem.js
import React,{ Component } from 'react';
class TodoItem extends Component{
render() {
// const content = this.props.content;
const { content } = this.props;//es6写法,与上面等价
return <li>{content}</li>
}
}
export default TodoItem;
//TodoList.js
//1、引入子组件
import TodoItem from './TodoItem';
//2、修改getListItems函数中的代码
getListItems() { return this.state.list.map((value,index) => { return (<TodoItem content = {value} key = {index}/>); }) }
实现删除功能
需求:点击list中的某一项,将其删除。
相当于在子组件中修改父组件中的数据。
父组件除了可以给子组件传值还可以给子组件传方法。
为TodoItem中的li标签绑定onClick事件。
❌TodoList.js:32 Uncaught TypeError: Cannot read property 'list' of undefined
报错的原因还是this指向不对,此时this指向TodoItem,在constructor中将this强制指向TodoList即可。
//TodoItem.js
import React,{ Component } from 'react';
class TodoItem extends Component{
constructor(props) {
super(props);
this.handleItemClick = this.handleItemClick.bind(this);
}
handleItemClick() {
//改变父组件中list的数据
// console.log(this);//TodoItem
// this.props.deleteFunction(this.props.index);
const { deleteFunction,index } = this.props;//es6解构赋值
deleteFunction(index);
}
render() {
// const content = this.props.content;
const { content } = this.props;//es6写法,与上面等价
return <li onClick = {this.handleItemClick}>{content}</li>
}
}
export default TodoItem;
//TodoList.js
//在constructor中添加handleItemClick函数的this指向
this.handleItemClick = this.handleItemClick.bind(this);
//修改getListItems函数
getListItems() {
return this.state.list.map((value,index) => {
return (<TodoItem content = {value} index = {index} key = {index} deleteFunction = {this.handleItemClick}/>);
})
}
组件树⬇️:
