react-自定义事件
没有嵌套关系的组件(如兄弟组件)之间的通信,只能通过自定义事件的方式来进行。
var EventEmitter = require('events').EventEmitter;
import React,{Component} from 'react';
import ReactDOM from 'react-dom';
let emitter = new EventEmitter();
class ListItem extends Component{
static defaultProps = {
checked: false
};
constructor(props){
super(props);
}
render(){
return (
<li>
<input type="checkbox" checked={this.props.checked} onChange={this.props.onChange} />
<span>{this.props.value}</span>
</li>
);
}
}
class List extends Component{
constructor(props){
super(props);
this.state = {
list: this.props.list.map(entry=>({
text:entry.text,
checked:entry.checked || false
}))
};
console.log(this.state);
}
onItemChange(entry){
const {list} = this.state;
this.setState({
list:list.map(prevEntry=>({
text: prevEntry.text,
checked:prevEntry.text === entry.text? !prevEntry.checked : prevEntry.checked
}))
});
//这里触发事件
emitter.emit('ItemChange',entry);
}
render(){
return (
<div>
<ul>
{this.state.list.map((entry,index)=>{
return (<ListItem
key={`list-${index}`}
value = {entry.text}
checked = {entry.checked}
onChange = {this.onItemChange.bind(this, entry)}
/>);
})}
</ul>
</div>
);
}
}
class App extends Component{
constructor(props){
super(props);
}
componentDidMount(){
this.itemChange = emitter.addListener('ItemChange',(msg,data)=>console.log(msg));//注册事件
}
componentWillUnmount(){
emitter.removeListener(this.itemChange);//取消事件
}
render(){
return (
<List list={[{text:1},{text:2}]}/>
)
}
}
ReactDOM.render(
<App/>,
document.getElementById('root')
);
注意:在 componentDidMount
中注册事件,在componentWillUnmount
中取消事件注册。
作者:禅楼望月
出处:http://www.cnblogs.com/yaoyinglong
如果,您认为阅读这篇博文让您有些收获,不妨点击一下右下角的【推荐】
如果,您希望这篇博文也能帮助到其他人,不妨点击一下右边的【分享到…】
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【禅楼望月】
本文版权归作者和博客园共有,欢迎转载,但请注明出处,且在文章页面明显位置给出原文连接。
*\\(^o^)/* 请您毫不留情的指出错误和不足,或者发表您的见解(ɔˆ ³(ˆ⌣ˆc)我们共同进步(ง •̀_•́)ง