gpt4 book ai didi

javascript - react 从子元素到父元素的状态绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 09:33:00 25 4
gpt4 key购买 nike

我是reactJS新手

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

<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 不知道其中之一发生了某些变化。为此,子组件应该通知父组件。

向 TodoList 添加 onStatusUpdate 属性,如下所示

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

这就是定义更新方法的方式

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

在子组件的点击处理程序中执行类似的操作

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/ `

关于javascript - react 从子元素到父元素的状态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31435467/

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