React:如何将“const Todo =({todo,todoList,remove})=> {”更改为“export default class Todo extends React.Component {”
2017-10-30
229
我有这个组件(至少,我认为它被称为“组件”!):
const Todo = ({todo, todoList, remove}) => {
let status = todo.opened ? 'opened' : 'closed';
return (
<li className={"todo " + status} data-endpoint={todo['@id']}>
<form onChange={this.changeStatus}>
<a href={window.Routing.generate('todo_list_todo_show', {account: todoList.account.id, list: todoList.id, todo: todo.id}, true)}>{todo.name}</a>
</form>
</li>
);
}
export default Todo
现在我想添加一些其他方法来简单地改变 Todo 的状态,将其设置为打开或关闭选中一个简单的复选框。
所以我想将语法更改为此:
export default class Todo extends React.Component {
constructor(props) {
super(props);
}
render({todo, todoList, remove}) {
let status = todo.opened ? 'opened' : 'closed';
return (
<li className={"todo " + status} data-endpoint={todo['@id']}>
<form onChange={this.changeStatus}>
<a href={window.Routing.generate('todo_list_todo_show', {account: todoList.account.id, list: todoList.id, todo: todo.id}, true)}>{todo.name}</a>
</form>
</li>
);
}
}
这会触发错误:
Todo.jsx:21 Uncaught TypeError: Cannot read property 'todo' of undefined
第 21 行是
render
方法的签名:
render({todo, todoList, remove}) {
为什么我会收到此错误?
这两种语法之间有什么变化?是否与 JSX 有关以及组件如何用纯 Javascript 进行转译?
如何使用“完整”语法?
哪些名称正确,可以识别第一种语法和第二种语法?
2个回答
第一种是无状态组件,或者说是函数组件,它将 props 和 context 作为参数传递。第二种是类组件,并且 props 被分配给
this.props
。请参阅文档中的
组件和 Props
。
props 不会作为参数传递给
render()
。将
this.props
解构为您的变量。
render() {
const {todo, todoList, remove} = this.props;
const status = todo.opened ? 'opened' : 'closed';
return (
<li className={"todo " + status} data-endpoint={todo['@id']}>
<form onChange={this.changeStatus}>
<a href={window.Routing.generate('todo_list_todo_show', {account: todoList.account.id, list: todoList.id, todo: todo.id}, true)}>{todo.name}</a>
</form>
</li>
);
}
Ori Drori
2017-10-30
当使用函数作为组件时,该函数会传递 props。从
React.Component
扩展时,render 不会传递任何内容,但 props 在实例上可用作
this.props
。
因此 render 需要变成:
render() {
const { todo, todoList, remove } = this.props;
// do your thing
}
Alex Guerra
2017-10-30