向输入字段添加箭头函数会导致错误
Adding an arrow function to input field results an error
这是一个 React class 我正在研究:
import React from 'react';
export default class ExpenseForm extends React.Component {
state = {
title: ''
};
onTitleChange = (e) => {
const title = e.target.value;
this.setState(() => ({title}));
};
render() {
return (
<div>
<form>
<input
type='text'
placeholder='title'
value={this.state.title}
onChange={(e) => this.setState(() => ({title: e.target.value}))}
required autoFocus/>
<textarea placeholder='Add a note for your expense'/>
<input type='number' placeholder='amount' required/>
<input type='submit' value='Add Expense'/>
</form>
</div>
);
}
}
这会在执行 onChange
时引发错误 Uncaught TypeError: Cannot read property 'value' of null
。
但是当我将 onChange
的内部 js 重组为一个单独的函数 onTitleChange
并调用该函数时:onChange={this.onTitleChange}
,它工作得很好。这种行为背后的原因可能是什么?
我猜,你的参数 e 在内部箭头函数中是未知的。
你可以这样写:
<input
type='text'
placeholder='title'
value={this.state.title}
onChange={e => this.setState({ title: e.target.value })}
required
autoFocus
/>
这是因为 React 正在利用 event pooling 并且 setState 是在异步上下文中执行的函数,因此您在异步 setState
回调中将它们观察为空值。
您需要使用 e.persist()
来持久化事件,或者将 event
的值保存到变量中,就像在您的方法中一样。
此处您将 onchange 事件指定为 onChange={(e) => this.setState(() => ({title: e.target.value}))}
,此处 e.target.value
将不起作用,因为它在 setState()
范围内。
扩展你的功能,我们将得到
function(e){
this.setState(function(){
return {
title: e.target.value
}
})
}
这里setSate()
里面的函数里没有e
,所以e.target.value
会报错;
由于不想与之前的值进行比较,只需要将值设置为title,可以使用like
onChange={(e) => this.setState({title: e.target.value})}
setState
里面不需要额外的函数
不需要在setstate
中使用箭头函数。
改变
onChange={(e) => this.setState(() => ({title: e.target.value}))}
致:
onChange={(e) => this.setState({title: e.target.value})}
这是一个 React class 我正在研究:
import React from 'react';
export default class ExpenseForm extends React.Component {
state = {
title: ''
};
onTitleChange = (e) => {
const title = e.target.value;
this.setState(() => ({title}));
};
render() {
return (
<div>
<form>
<input
type='text'
placeholder='title'
value={this.state.title}
onChange={(e) => this.setState(() => ({title: e.target.value}))}
required autoFocus/>
<textarea placeholder='Add a note for your expense'/>
<input type='number' placeholder='amount' required/>
<input type='submit' value='Add Expense'/>
</form>
</div>
);
}
}
这会在执行 onChange
时引发错误 Uncaught TypeError: Cannot read property 'value' of null
。
但是当我将 onChange
的内部 js 重组为一个单独的函数 onTitleChange
并调用该函数时:onChange={this.onTitleChange}
,它工作得很好。这种行为背后的原因可能是什么?
我猜,你的参数 e 在内部箭头函数中是未知的。 你可以这样写:
<input
type='text'
placeholder='title'
value={this.state.title}
onChange={e => this.setState({ title: e.target.value })}
required
autoFocus
/>
这是因为 React 正在利用 event pooling 并且 setState 是在异步上下文中执行的函数,因此您在异步 setState
回调中将它们观察为空值。
您需要使用 e.persist()
来持久化事件,或者将 event
的值保存到变量中,就像在您的方法中一样。
此处您将 onchange 事件指定为 onChange={(e) => this.setState(() => ({title: e.target.value}))}
,此处 e.target.value
将不起作用,因为它在 setState()
范围内。
扩展你的功能,我们将得到
function(e){
this.setState(function(){
return {
title: e.target.value
}
})
}
这里setSate()
里面的函数里没有e
,所以e.target.value
会报错;
由于不想与之前的值进行比较,只需要将值设置为title,可以使用like
onChange={(e) => this.setState({title: e.target.value})}
setState
不需要在setstate
中使用箭头函数。
改变
onChange={(e) => this.setState(() => ({title: e.target.value}))}
致:
onChange={(e) => this.setState({title: e.target.value})}