我有一个TodoList组件,它是App组件的子组件。我希望更改App组件的待办事项列表的状态。我正在尝试将TodoList组件中的toggleComplete函数传递给Todo组件,因此在onClick事件中它将触发并运行到App组件,以便我可以更新状态。
我得到一个"未捕获的TypeError:无法读取属性' toggleComplete'未定义"在TodoList.js
中〜/ SRC /组件/ Todo.js
import React, {PropTypes} from 'react';
export default class Todo extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<li className={this.props.todo.done ? 'completed' : 'view'}>
<div className="view">
<input onClick={this.props.toggleComplete(this.props.id)} className="toggle" type="checkbox" checked={this.props.todo.done} />
<label>{this.props.id}: {this.props.todo.title}</label>
<button className="destroy"></button>
</div>
</li>
);
}
}
〜/ SRC /组件/ TodoList.js
import React, {PropTypes} from 'react';
import Todo from './Todo'
export default class TodoList extends React.Component {
constructor(props) {
super(props);
}
toggleComplete(todoID){
console.log('hit toggleComplete TodoList');
}
render() {
return (
<section className="main">
<ul className="todo-list">
{this.props.todos.map(function(todo, index){
return <Todo todo={todo} toggleComplete={this.toggleComplete} id={index + 1} key={index+1}/>;
})}
</ul>
</section>
);
}
}
〜/ SRC / App.js
import React, { Component } from 'react';
import Header from './component/Header'
import TodoList from './component/TodoList'
import TodoFooter from './component/TodoFooter'
import Footer from './component/Footer'
export default class App extends Component {
constructor(){
super();
this.state = {
todos: [
{title: 'Taste JavaScript', done: true},
{title: 'Buy Unicorn', done: false},
{title: 'eat all day', done: false},
{title: 'sleep all night', done: true}
]
}
}
render() {
return (
<div>
<section className="todoapp">
<Header />
<TodoList todos={this.state.todos} />
<TodoFooter />
</section>
<Footer />
</div>
);
}
}
答案 0 :(得分:3)
您的问题似乎在函数进入子组件之前发生,因为错误来自您的父组件。您的map function无法访问正确的内容,因此将其视为未定义 - 请尝试此操作:
{this.props.todos.map(function(todo, index){
return <Todo todo={todo} toggleComplete={this.toggleComplete} id={index + 1} key={index+1}/>;
}, this)} // use the optional "this" argument to the map function
这里有一个小提琴,可以展示父母为父母的范围提供相同参考的父母的简单例子:https://jsfiddle.net/v5wd6Lrg/1/
答案 1 :(得分:0)
上面的答案也可以使用箭头功能而无需绑定
{this.props.todos.map((todo, index) => {
return <Todo todo={todo} toggleComplete={this.toggleComplete} id={index + 1} key={index+1}/>;
});