React组件间通信
组件间通信1.父组件中放入子组件,将自身属性与方法传给子组件,子组件即父组件的一部分,所以只要父组件重新render,子组件也必定重新render. import React,{ Component } from 'react'; import { render } from 'react-dom'; import Example from '../components/Example.js'; class App extends Component { constructor(props) { super(props); this.state = { a: 1 }; } add = () => { this.setState({ a: this.state.a + 1 }); } render() { return ( <div> <div> { this.state.a } <Example a = { this.state.a } add={ this.add } /> </div> </div> ); } } render(<App />,document.getElementById('root')); import React,{ Component } from 'react'; import { render } from 'react-dom'; class Example extends Component { constructor(props) { super(props); this.state = { a: 10 }; } componentWillReceiveProps(nextProps) { this.setState({ a: nextProps.a }); } add = () => { this.setState({ a: this.state.a + 1 }); } render() { return ( <div> <p>父组件: { this.props.a }</p> <p>子组件: { this.state.a }</p> <button onClick={ this.add }>调用子组件自己的add方法</button> <button onClick={ this.props.add }>调用父组件add方法</button> </div> ); } } export default Example; 父组件向子组件通信React数据流动是单向的,父组件向子组件的通信也是最常见的方式. import React,{ Component } from 'react'; import { render } from 'react-dom'; import ListTitle from '../components/ListTitle.js'; import ListItem from '../components/listItem.js'; class List extends Component { render() { let title = '父组件向子组件通信'; let list = [1,2,3,4,5]; return ( <div> <ListTitle title={ title } /> <ul> { list.map((item,index) => { return ( <ListItem key={ index } value={ item } /> ) }) } </ul> </div> ); } } render(<List />,document.getElementById('root')); 子组件向父组件通信setState一般与回调函数均会成对出现,这是因为回调函数即是转换内部状态时的函数传统. onItemChange = (item) => { const { list } = this.state; this.setState({ list: list.map((prevItem) => { return { text: prevItem.text,checked: prevItem.text === item.text ? !prevItem.checked : prevItem.checked } }) }); } onTitleChange = () => { this.setState({ title: '利用回掉函数,子组件向父组件通信' }) } 跨级组件通信当需要让子组件跨级访问信息时,我们可以像之前说的方法那样向更高级别的组件层层传递props. static childContextTypes = { txt: React.PropTypes.string }; getChildContext() { return { txt: 'aaaa' }; } 2.子组件 static contextTypes = { txt: React.PropTypes.string }; <span>span: { this.context.txt }</span> 没有嵌套关系的组件通信1.没有嵌套关系的,那只能通过可以影响全局的一些机制去考虑,自定义事件机制不失为一种上佳的方法.2.在componentDidMount事件中,如果组件完成挂载,再订阅事件.当组件卸载的时候,在componentWillUnmount事件中取消事件的订阅. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |