gpt4 book ai didi

ReactJS:从子级和父级控制子级状态

转载 作者:行者123 更新时间:2023-12-03 13:16:22 27 4
gpt4 key购买 nike

我有一个相当简单的问题,我不知道如何用 React 的单向数据流来解决它。

假设您在父级中有一个显示模式的链接

在模式中,有一个“X”将其关闭。

我知道我可以通过 props 从父级更改模式的状态

// In the parent
<Modal display={this.state.showModal} />

// In the modal
<div className={this.props.display ? "show" : "hide"}>
<a className="close">&times;</a>
...
</div>

我知道如何关闭模式,但不知道如何关闭两者。不确定如何保持父模态和子模态共享且可控的状态。

更新

为了尽可能保持模块化,我认为 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}>&times;</a>
</div>
)
}
});

我看到了这个方法,但它似乎比我在这里需要做的要多一些。 Reactjs: how to modify child state or props from parent?

最佳答案

React中有两种方法处理这种事情:

  1. 使子项成为“受控”,就像具有 valueonChange 属性的表单输入一样,其中输入控件的所有者输入。
  2. 使子项“不受控制”,就像没有的表单输入一样。

第二个选择在前面看起来更快,但就像在 React 中管理表单输入的集合一样,随着复杂性的增加以及在任何时候全面描述 UI 的需要,使用完全受控组件的优势变得显而易见 em>点和时间增加。 (如果您想知道为什么受控组件在大多数情况下比不受控组件更好,请参阅 FakeRainBrigand 的 this excellent answer。)

但是,就像表单输入一样,您的组件没有理由不能受控不受控制。如果用户传递 displayonClose 属性,例如 Austin Greco's answer ,您有一个受控模态,并且父级完全决定何时显示或隐藏模态。

如果用户不这样做,您可以跳过使用属性,而是委托(delegate)给由模态组件上的公共(public)方法管理的内部状态:

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
}
},
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}>&times;</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}>&times;</a>
</div>
)
}
});

(参见 my blog post on creating custom components that work with linkState/valueLink for more info 。)

现在您可以享受到使用完全由父级控制的 Modal 带来的好处,但是您已经删除了创建一个将值设置为 false 的函数并将其传递给模态。

关于ReactJS:从子级和父级控制子级状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29528334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com