如何将带父项的状态传递给子组件

时间:2014-10-23 06:38:03

标签: javascript reactjs

是否有任何方式将状态从父组件传递到子组件,如:

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有可能吗?

2 个答案:

答案 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