本节将介绍
React
中父子组件如何传值的方法。
1. 父组件向子组件传值
目前最简单,最实用,最容易上手的方法。就是实用组件属性的形式父组件给子组件传值。例如:在ChildItem
组件中加入content
属性,然后给属性传递{item}
,这样就可以父组件向子组件传值。
<ChildItem content = {item} />
此时,父组件值已经传递给子组件,子组件这时候可以使用this.props.xxx
的形式接收,比如传递过来的值,可以使用如下代码进行接收。
import React, { Component } from 'react'
class ChildItem extends Component {
render() {
<div>{this.props.content}</div>
}
}
export default ChildItem
父组件向子组件传值:是通过在父组件添加属性,在子组件通过this.props.xxx
的形式传值。
2. 子组件向父组件传递数据
现在的需求是这样的:点击组件中的菜单项后,删除该菜单项。根据前面的组件拆分,此时菜单项和父组件已不在一个组件内。所以此处就涉及了一个子组件向父组件传递数据的知识。
1. 先绑定事件,此时需要在ChildItem
组件中绑定。如下:
import React, { Component } from 'react'
class ChildItem extends Component {
render() {
<div onClick = {this.props.hangleClick.bind(this)}>{this.props.content}</div>
}
handleClick() {
console.log('test')
}
}
export default ChildItem
此时打开控制台再点击菜单项,就会打印出console
。不过这时候会报warning
警告,大致意思是循环时必须设置key
值。
此时修改添加key
值。在Child.js
组件内修改render代码。 如下:
// 省略上面部分代码...
<ul>
{
this.state.list.map((item, index) => {
return (
<Child
key = {item + index}
content = {item}>
</Child>
)
})
}
</ul>
// 省略下面部分代码...
绑定成功后,就需要通过操作子组件删除父组件里的数据了。但是React
里明确规定,子组件不能操作父组件的数据。所以需要借助一个父组件方法,来修改父组件的内容。之前Child.js
组件内有一个删除方法delItem
,现在子组件就借用这个方法。
delItem(index) {
let list = this.state.list
list.splice(index, 1)
this.setState({
list: list
})
}
获取数组索引下标
需要删除菜单某一项,就必须知道该项的索引值,还是要通过父组件传递给子组件, 所以还是通过props
属性进行传递
<ul>
{
this.state.list.map((item, index) => {
return (
<Child
key = {item + index}
content = {item}
index = {index} />
)
})
}
</ul>
然后修改ChildItem.js
组件,在handleClick
方法内,写下面代码
handleClick() {
console.log(this.props.index)
}
此时打开浏览器点击菜单项,看是否能正确console
出index
,如果报错,可能会是未绑定this
。可以在ChildItem.js
采用如下方式
return (
<div onClick = {this.handleClick.bind(this)}>
{this.props.content}
</div>
)
当然绑定this
的方式有很多种。感兴趣的可以去看看之前的 绑定this的4种方式。在页面最底部。也写出了几种方式的优缺点。
子组件调用父组件方法
如果子组件要调用父组件方法,其实和传递数据差不多,只需要在调用组件时,把方法传递给子组件就可以了。记得传递的时候也需要绑定this
,不然子组件没办法找到这个父组件。
<ul>
{
this.state.list.map((item, index) => {
return (
<Child
key = {item + item}
content = {item}
index = {index}
// 关键代码 start
delItem = {this.delItem.bind(this)}
// 关键代码 end
)
})
}
</ul>
传递后,在子组件直接调用就好了。代码如下:
handleClick() {
this.props.delItem(this.props.inedx)
}
至此,React
中父子传值就结束了。本节比较重要。建议反复多练习几遍。