SetState 不是 OnChange 上的函数
SetState Is Not A Function on OnChange
正在努力获取滑块以更改 "text" 在 React 状态下的值。
不断出现错误:
"App.js:90 Uncaught TypeError: this.setState is not a function" 尽管我已尽最大努力排除故障。
修复方法是什么?
class App extends Component {
constructor(props) {
super(props);
this.state = {list: [{x: "Before Pool", y:85000}, {x: "After Pool", y:82000}], text: 0, options: {bathrooms:'', bedrooms:'', sqft:''}};
}
componentDidMount() {
setTimeout(() => {
this.setState({list: [{x: "Before Pool", y:60000}, {x: "After Pool", y:30000}]});
console.log("testing", this.state.text);
}, 2000) ;
}
handleChange (event) {
console.log("from handle change", event);
this.setState({text : event });
}
render() {
return (
<div className="App">
<div>
<div style={wrapperStyle}>
<p># of Bathrooms</p>
<Slider min={0} max={20} defaultValue={3} onChange={this.handleChange} />
</div>
你需要绑定handleChange
方法
<Slider min={0} max={20} defaultValue={3} onChange={this.handleChange.bind(this)}
您需要将您的状态绑定到 setTimeout
中的回调,因为您处于不同的上下文中。
我相信这会成功:
setTimeout(() => {
this.setState({list: [{x: "Before Pool", y:60000}, {x: "After Pool", y:30000}]});
console.log("testing", this.state.text);
}.bind(this), 2000) ;
答案很简单:你看错了this
。
由于您是在闭包中编写回调,因此请务必了解您无法从外部访问 this
。它总是指当前上下文。
作为解决方法,定义您自己的变量(通常称为 self
)以在闭包内使用:
componentDidMount() {
var self = this; // copy the reference
setTimeout(() => {
self.setState({list: [{x: "Before Pool", y:60000}, {x: "After Pool", y:30000}]});
console.log("testing", this.state.text);
}, 2000) ;
}
您需要在此处绑定handleChange
方法
<Slider min={0} max={20} defaultValue={3} onChange={this.handleChange} />
这应该是这样的
<Slider min={0} max={20} defaultValue={3} onChange={this.handleChange.bind(this)} />
或者你可以简单地在方法的签名中使用Arrow Functions,最好一直使用它来节省你一直绑定的时间。它应该是这样的:
handleChange = event => {
console.log("from handle change", event);
this.setState({text : event });
}
正在努力获取滑块以更改 "text" 在 React 状态下的值。
不断出现错误:
"App.js:90 Uncaught TypeError: this.setState is not a function" 尽管我已尽最大努力排除故障。
修复方法是什么?
class App extends Component {
constructor(props) {
super(props);
this.state = {list: [{x: "Before Pool", y:85000}, {x: "After Pool", y:82000}], text: 0, options: {bathrooms:'', bedrooms:'', sqft:''}};
}
componentDidMount() {
setTimeout(() => {
this.setState({list: [{x: "Before Pool", y:60000}, {x: "After Pool", y:30000}]});
console.log("testing", this.state.text);
}, 2000) ;
}
handleChange (event) {
console.log("from handle change", event);
this.setState({text : event });
}
render() {
return (
<div className="App">
<div>
<div style={wrapperStyle}>
<p># of Bathrooms</p>
<Slider min={0} max={20} defaultValue={3} onChange={this.handleChange} />
</div>
你需要绑定handleChange
方法
<Slider min={0} max={20} defaultValue={3} onChange={this.handleChange.bind(this)}
您需要将您的状态绑定到 setTimeout
中的回调,因为您处于不同的上下文中。
我相信这会成功:
setTimeout(() => {
this.setState({list: [{x: "Before Pool", y:60000}, {x: "After Pool", y:30000}]});
console.log("testing", this.state.text);
}.bind(this), 2000) ;
答案很简单:你看错了this
。
由于您是在闭包中编写回调,因此请务必了解您无法从外部访问 this
。它总是指当前上下文。
作为解决方法,定义您自己的变量(通常称为 self
)以在闭包内使用:
componentDidMount() {
var self = this; // copy the reference
setTimeout(() => {
self.setState({list: [{x: "Before Pool", y:60000}, {x: "After Pool", y:30000}]});
console.log("testing", this.state.text);
}, 2000) ;
}
您需要在此处绑定handleChange
方法
<Slider min={0} max={20} defaultValue={3} onChange={this.handleChange} />
这应该是这样的
<Slider min={0} max={20} defaultValue={3} onChange={this.handleChange.bind(this)} />
或者你可以简单地在方法的签名中使用Arrow Functions,最好一直使用它来节省你一直绑定的时间。它应该是这样的:
handleChange = event => {
console.log("from handle change", event);
this.setState({text : event });
}