ReactJS:控制孩子和父母的子女状态
|
我有一个相当简单的问题,我不知道如何用React的单向数据流来解决它.
假设你有一个显示模态的父母中的链接 在模态中,你有一个关闭它的“X”. 我知道我可以通过道具从父母改变模态的状态 // In the parent
<Modal display={this.state.showModal} />
// In the modal
<div className={this.props.display ? "show" : "hide"}>
<a className="close">×</a>
...
</div>
我知道如何关闭模态,但不是两者.不确定如何保持由父母和子女模态共享和控制的状态. UPDATE 为了尽可能地保持模块化,我认为React的方法是将开/关逻辑存储在模态变量中. var ParentThing = React.createClass({
...
render (
<Modal /> // How can I call this.open in the modal from here?
)
});
var Modal = React.createClass({
setInitialState: function() {
return {
display: false
}
},close: function() {
this.setState({ display: false });
},open: function() {
this.setState({ display: true });
},render: function() {
return (
<div className={this.state.display ? "show" : "hide"}>
<a className="close" onClick={this.close}>×</a>
</div>
)
}
});
我看到这个方法,但似乎比我需要做的更多一点. Reactjs: how to modify child state or props from parent?
在React中有两种处理这种事情的方法:
>让孩子“受控”,就像一个带有值和onChange属性的表单输入,其中输入的所有者控制输入. 第二选择似乎比前面更快,但就像在React中管理表单输入的集合一样,使用完全控制的组件的优点变得显而易见,因为复杂性的构建和需要在任何时间点上完全描述您的UI. (见FakeRainBrigand的this excellent answer,如果您好奇,为什么受控组件在多数情况下比不受控制的要好) 然而,就像表单输入一样,没有理由不能控制或不控制您的组件.如果用户传递显示和onClose属性(如Austin Greco’s answer),则具有受控模式,父级会完全决定何时显示或隐藏模态. 如果用户没有,您可以跳过使用属性,而是转换为在模态组件上由公共方法管理的内部状态: var ParentThing = React.createClass({
...
render: function() {
return <Modal ref="modal" />;
},handleSomeClick: function() {
this.refs.modal.open();
}
});
var Modal = React.createClass({
setInitialState: function() {
return {
display: false
}
},render: function() {
return (
<div className={this.state.display ? "show" : "hide"}>
<a className="close" onClick={this.close}>×</a>
</div>
)
}
});
如果您喜欢受控Modal组件的想法,但不想做所有的样板打字,甚至可以实现像Modal这样的valueLink属性来简化此模式. var ParentThing = React.createClass({
...
mixins: [React.addons.LinkedStateMixin],getInitialState: function() {
return { showModal: false };
},render: function() {
return <Modal displayLink={this.linkState("showModal")} />;
},handleSomeClick: function() {
this.setState({showModal: true});
}
});
var Modal = React.createClass({
close: function() {
this.props.displayLink.requestChange(false);
},render: function() {
return (
<div className={this.props.displayLink.value? "show" : "hide"}>
<a className="close" onClick={this.close}>×</a>
</div>
)
}
});
(见my blog post on creating custom components that work with 所以现在,您可以使用完全由父控制的Modal获得好处,但是您已经删除了一部分样板,创建了将该值设置为false并将其传递给模态的函数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在Swift中,Array [String]切片返回类型似乎不是[String]
- System.Data.SQLite错误,
- C# yield在WCF中的错误使用(二)
- Flex4 动态生成,LineChart,AreaChart,ColumnChart,PieC
- c# – Linq lambda表达式中的布尔短路评估
- 一个简单的ajax请求数据
- ruby-on-rails – 使用I18n惰性查找在rspec中测试帮助程序
- xml – 如何使用xpath选择具有X作为后代的节点
- sqoop2-1.99.2-cdh4.5.0依赖的所有jar包
- c# – ASP.Net MVC 4使用Attribute还是BaseController?
