React中 子组件传递父组件的方法是:父组件通过给props传递一个接收方法,子组件通过 在 调用自身的方法 中 调用这个 父组件传递过来的方法将参数抛过去
例如:
class Test extends React.Component{ state = { name:'张三' } handleClick = () => { this.props.getChildMsg(this.state.name)
} render() { return ( <div> 这是子组件 <button onClick={this.handleClick }>传递信息给父组件</button>
</div> ) } }
export default class TestParent extends React.Component{ getChildMsg= (data) => {
console.log('子组件传递过来的信息:',data) } render() { return ( <div> 这是test组件 <Test getChildMsg={this.getChildMsg} ></Test>
</div> ) } }
通过上面代码,会发现子传父,需要子组件去调用一下这个fun,若子组件在初始化的时候就自动调用了这个function呢
例如更改 父子组件:
//Test组件更改 render中返回:
render() { (
return (this.props.getChildMsg(this.state.name)
)
}
//TestParent组件更改 render 中返回
render() { return ( <div> 这是test组件 <Test getChildMsg={ data => { data => { return ( <p> {data}</p> ) }} ></Test>
</div>
)
}
运行后不难发现我们可以直接获取到test组件中 name的值。若我们给test中写入一个 function 去更改其state中的值呢。
例如:在test组件中去获取当前鼠标的位置:
state = {
name:'张三',
mousex:0,
mousey:0
}
moveNouse = e => {
this.setState({
mousex:e.clientX,
mousey:e.clientY
})
}
//在render中将整个state抛出
this.props.getChildMsg(this.state)
//在test组件创建前去获取当前鼠标的位置,更改state值
componentDidMount(){
window.addEventListener('mousemove',this.moveNouse)
}
//组件销毁时解除绑定事件
componentWillUnmount() {
window.removeEventListener('mousemove',this.moveNouse)
}
//父组件中
<Test getChildMsg={ mouse => { return ( <p>鼠标位置:{mouse.mousex} {mouse.mousey}</p> ) }} ></Test>
不难发现我们会实时获取到当前鼠标的位置
原理:在test组件创建时,我们给window绑定了鼠标移动事件,去更改 test组件中的 state值,这样,会导致组件更新,触发 render方法,调用父组件传递过来接收信息的方法(类似子传父)
***通过this.props.children进行更改***
//子组件 render方法
render() {
return this.props.children(this.state)
}
//父组件
<Test>
{ mouse => { return (<p>鼠标位置:{mouse.mousex} {mouse.mousey}</p>)}}
</Test>
这是通过props自带的children属性:<Child> 中间输入的 就可以通过props.children属性去获得 </Child>