从子元素到父元素的反应状态绑定 [英] react state bind from child to parent element

查看:99
本文介绍了从子元素到父元素的反应状态绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是ReactJS的新手

I am new to reactJS

我有一个包含任务的JSON数组.我已经将数组渲染为2 ul列表.一个完成了任务,另一个完成了任务.如果我单击任务,状态会发生变化,但不会在其他元素中更新.但是如果我在输入状态下输入一些文本,则会设置为其他元素.为什么单击任务时状态没有立即设置?

I have an JSON array which consists of task. I have rendered the the array to 2 ul list. One has completed tasks and the other has uncompleted tasks. If i click on the task the status is changing but it is not updated in other element. However if I enter some text in the input state is set to other elements. Why the state is not set immediately when I click on task?

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script>

<body>
<div id="todo">
</div>
<script type="text/jsx">
    var TodoList = React.createClass({
        clickHandle: function(index) {
            this.props.items[index].completed=!this.props.items[index].completed;
            console.log(this.props);
            this.setState({items: this.props.items});
        },
        render: function() {
          var createItem = function(itemText, index) {
            if(itemText.completed===this.props.completed)
                return <li key={index} onClick={this.clickHandle.bind(this,index)}>{itemText.text}</li>;
          };
          return <ul>{this.props.items.map(createItem, this)}</ul>;
        }
      });
      var TodoApp = React.createClass({
        getInitialState: function() {
          return {items: [{"text":"1true","completed":true},{"text":"2true","completed":true},{"text":"1false","completed":false}], text: ''};
        },
        onChange: function(e) {
          this.setState({text: e.target.value});
        },
        handleSubmit: function(e) {
          e.preventDefault();
          if(this.state.text!=''){
              this.state.items.push({"text":this.state.text,"completed":false});
              var nextText = '';
              this.setState({items:this.state.items,text: nextText});
          }
          else{
            alert("Enter some text!");
          }
        },
        render: function() {
          return (
            <div>
              <h3>TODO</h3>
              <TodoList items={this.state.items} completed={false}/>
              <TodoList items={this.state.items} completed={true}/>
              <form onSubmit={this.handleSubmit}>
                <input onChange={this.onChange} value={this.state.text} />
                <button>{'Add #' + (this.state.items.length + 1)}</button>
              </form>
            </div>
          );
        }
      });

      React.render(<TodoApp />, document.getElementById('todo'));

</script>

JSFiddle

推荐答案

之所以会这样,是因为呈现两个列表的父组件TodoApp不知道其中一个发生了变化.为此,子组件应将其通知父组件.

This is happening because the parent component, TodoApp which renders the two lists does not know that something has changed in one of the them. For this the child component should notify the parent component about it.

像这样将onStatusUpdate属性添加到TodoList

Add a onStatusUpdate attribute to TodoList like this

<TodoList items={this.state.items} completed={false} onStatusUpdate={this.update}/>

这是定义更新方法的方式

This is how the update method can be defined

update: function(items){
  this.setState({items: items});
}

在子组件的点击处理程序中,执行以下操作

In the click handler of child component do something like this

clickHandle: function(index {
  this.props.items[index].completed=!this.props.items[index].completed;
  this.props.onStatusUpdate(this.props.items); // <-- this triggers the onStatusUpdate attribute defined in TodoList component
},

这里是更新的演示 https://jsfiddle.net/dhirajbodicherla/aqqcg1sa/2 /`

Here is an updated demo https://jsfiddle.net/dhirajbodicherla/aqqcg1sa/2/`

这篇关于从子元素到父元素的反应状态绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆