【发布时间】:2017-12-20 18:50:13
【问题描述】:
我正在开发一个简单的“待办事项”反应应用程序(React.js 的新功能)。我已将项目添加到列表中,但删除项目会引发问题。在我的父反应组件中,我有以下代码:
import ToDoEntries from './to_do_entries.jsx';
class ToDoList extends React.Component {
constructor(props) {
super(props);
this.state = { list: [] }
this.add = this.addItem.bind(this);
this.removeItem = this.removeItem.bind(this);
}
addItem(e) { //removed to avoid tl:dr }
render() {
return(
<form onSubmit={this.add}>
<input placeholder='Enter item' type='text' ref={(el) => {this._input = el;} }/>
<button>Add</button>
</form>
<ToDoEntries entries={this.state.list}
removeCallback={this.removeItem}
/>
);
}
}
我的to_do_entries.jsx 组件:
class ToDoEntries extends React.Component {
constructor(props) {
super(props);
}
renderItems() {
const { entries, removeCallback } = this.props;
function createTasks(item) {
return <li key={item.key}>{item.text}</li>
}
var listItems = entries.map(function(item) {
return(<li onClick={removeCallback} key={item.key}>{item.text}</li>)
})
return listItems;
}
render() {
var todoEntries = this.renderItems();
return(
<ul>
{todoEntries}
</ul>
);
}
}
export default ToDoEntries;
运行这段代码带来:
警告:setState(…):在现有状态期间无法更新 过渡
问题:
为什么to_do_entries.jsx的渲染在添加项目时立即执行回调,即:
var listItems = entries.map(function(item) {
return(<li onClick={removeCallback(id)} key={item.key}>{item.text}</li>)
})
但是,将.bind(null, id) 添加到 removeCallback 即。 <li onClick={removeCallback.bind(null, id)} /> 没有?
【问题讨论】:
-
所以,如果我理解正确,您是在问为什么
onClick={removeCallback(id)}会立即触发/调用 removeCallback 以及为什么onClick={removeCallback.bind(null, id)}不会立即触发/调用 removeCallback? -
完全正确。 Javascript 的
this上下文和函数回调,即functionName()与function已经让我难以置信一段时间了。 @约翰
标签: javascript reactjs