【发布时间】:2017-06-22 19:15:24
【问题描述】:
我有一个使用 typescript 创建的简单反应组件,但遇到了以下奇怪的错误。这是我的代码。
interface State {
value: string
}
class App extends React.Component<{}, State> {
constructor() {
super();
this.state = {
value: ''
}
}
changeHandler = (e: any) => {
let state = Object.assign({}, this.state);
state.value = e.target.value;
this.setState(state);
}
render() {
return (
<div className="App">
<input
type="text"
value={this.state.value}
name="value"
onChange={this.changeHandler} />
</div>
);
}
}
export default App;
这是我得到的错误。
错误 TS2540:无法分配给“值”,因为它是常量或 只读属性。
这个错误让我想到这可能是 typescript 执行不改变状态规则的方式。为了验证这个理论,我做了以下事情。
this.state.value = e.target.value
在这种情况下,我显然是直接改变状态,果然我得到了同样的错误。
然后我有了将界面更改为这个的想法。
interface State {
value: Ivalue
}
interface Ivalue {
value: string;
}
然后我重构了我的组件以使用这样的新界面。
class App extends React.Component<{}, State> {
constructor() {
super();
this.state = {
value: {
value: ''
}
}
}
changeHandler = (e: any) => {
let value = Object.assign({}, this.state.value);
value.value = e.target.value;
this.setState({value});
}
render() {
return (
<div className="App">
<input
type="text"
value={this.state.value.value}
name="value"
onChange={this.changeHandler} />
</div>
);
}
}
export default App;
果然编译好了!
我的问题真的是2个问题。首先,为什么打字稿对我的状态副本不满意,就像我在我使用Object.assign 的第一个sn-p 代码中一样?
其次,为什么将我的状态对象嵌套更深一层可以解决这个问题?
【问题讨论】:
-
那行得通。与
state[e.target.name] = e.target.value相同。我只是想知道为什么 object.assign 还不够。
标签: javascript reactjs typescript