【发布时间】:2018-05-11 02:12:39
【问题描述】:
我正在创建一个 Todo 应用。尽管我能够创建待办事项并显示它们,但我创建的每个待办事项都带有一个输入标签,该标签应该更改待办事项的名称。
我的代码:
const Hello = props => {
return (
<div>
<ul>
{props.todos.map((todo, id) => {
return (
<div>
<p key={todo.id}>{todo}</p>
<input type="text" onChange={() => props.changed(event, id)} />
</div>
);
})}
</ul>
</div>
);
};
class App extends React.Component {
state = {
todoItem: [],
todoText: "",
id: 0
};
addTodoHanlder = event => {
let todoValue = this.state.todoText;
let incID = this.state.id + 1;
this.setState({
todoItem: [...this.state.todoItem, todoValue],
id: incID
});
this.clearTodoText();
todoValue = "";
};
clearTodoText() {
this.setState({ todoText: "" });
}
handleChange = event => {
this.setState({ todoText: event.target.value });
};
todoNameChangeHandler = (event, id) => {
let todoVal = event.target.value;
const todoIndex = this.state.todoItem.findIndex(el => {
return el.id == id;
});
let todoUpdate = {...this.state.todoItem[todoIndex]}
todoUpdate = todoVal;
this.setState({
todoItem: todoUpdate
});
};
render() {
return (
<div>
<input
type="text"
placeholder="Enter Todo"
value={this.state.todoText}
onChange={this.handleChange}
/>
<button onClick={this.addTodoHanlder}>AddTodo</button>
<Hello
todos={this.state.todoItem}
changed={this.todoNameChangeHandler}
/>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="http://requirejs.org/docs/release/2.2.0/minified/require.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
我只想将找到的带有 id 的 todoItem 分配给:
let todoUpdate = {...this.state.todoItem[todoIndex]}
然后通过setState 更新它。
但是很难做到这一点,而且我遇到了错误。
TypeError
Cannot read property 'map' of undefined
hello
/src/Hello.js:7:21
4 | return (
5 | <div>
6 | <ul>
> 7 | {props.todos.map((todo, id) => {
|
^
另外,我不想使用reduce 方法。
【问题讨论】:
-
工作示例如中?你的意思是在我的代码工作的地方分开吗?
标签: javascript arrays reactjs