是否有任何方式将状态从父组件传递到子组件,如:
var ParentComponent = React.createClass({
getInitialState: function() {
return {
minPrice: 0
}
},
render: function() {
return (
<div onClick={this.doSomething.bind(this, 5)}></div>
);
}
});
var ChildComponent = React.createClass({
getInitialState: function() {
return {
minPrice: // Get from parent state
}
},
doSomething: function(v) {
this.setState({minPrice: v});
},
render: function() {
return (
<div></div>
);
}
});
我想从子组件更改父状态值。在react.js有可能吗?
答案 0 :(得分:8)
There is但它并不打算像React那样工作。 双向数据绑定不是React的方法,摘自文档。
在React中,数据以一种方式流动:从所有者到孩子。
因此,如果要在子组件中操作父状态,则要执行的操作是传递侦听器。
//parent component's render function
return (
<Child listenerFromParent={this.doSomething} />
)
//child component's render function
return (
<div onClick={this.props.listenerFromParent}></div>
)
答案 1 :(得分:2)
您可以使用limelight解决方案,即将函数从父级传递给子级。
或者您也可以使用像React-Cursor这样的项目,它们可以轻松地操纵从子组件中传递的状态。
我已经制作了自制框架(Atom-React,some details here),它也使用游标(受Om启发),你可以通过游标轻松实现双向数据绑定,允许操纵状态管理由父组件组成。
以下是一个例子:
<input type="text" valueLink={this.linkCursor(this.props.inputTextCursor)}/>
inputTextCursor
是从父级传递给子组件的游标,因此子级可以轻松地无条件地更改父级的数据。
我不知道其他基于游标的React包装器是否使用了这种技巧,但linkCursor
函数很容易通过简单的mixin实现:
var ReactLink = require("react/lib/ReactLink");
var WithCursorLinkingMixin = {
linkCursor: function(cursor) {
return new ReactLink(
cursor.getOrElse(""),
function setCursorNewValue(value) {
cursor.set(value);
}
);
}
};
exports.WithCursorLinkingMixin = WithCursorLinkingMixin;
因此,您可以轻松将此行为移至React-Cursor