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

Eni*_*lek 9 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>
    );
  }
});
Run Code Online (Sandbox Code Playgroud)

我想从子组件更改父状态值.在react.js有可能吗?

Hen*_*son 8

,但它并不打算这样工作的反应.双向数据绑定不是React的方法,摘自文档.

在React中,数据以一种方式流动:从所有者到子.

因此,如果要在子组件中操作父状态,则要执行的操作是传递侦听器.

//parent component's render function
return (
   <Child listenerFromParent={this.doSomething} />
)

//child component's render function
return (
  <div onClick={this.props.listenerFromParent}></div>
)
Run Code Online (Sandbox Code Playgroud)


Seb*_*ber 2

您可以使用“limelights”解决方案,即将函数从父级传递给子级。

或者您也可以使用像React-Cursor这样的项目,它允许轻松地操作从子组件中的父组件传递的状态。


我制作了我的自制框架(Atom-React,这里有一些细节),它也使用游标(受到 Om 的启发),并且您可以以某种方式轻松实现与游标的双向数据绑定,从而允许操作由父组件管理的状态。

这是一个用法示例:

<input type="text" valueLink={this.linkCursor(this.props.inputTextCursor)}/>
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

所以你可以轻松地将这种行为移植到React-Cursor