React:告诉状态 class 实例发生了变异
React: tell state that class instance has mutated
我有这个class:
class MyClass {
constructor() {
this.value = 'foo';
}
mutate() {
this.value = 'bar';
}
}
以及一个在其状态下有一个实例的组件:
let Component = React.createClass({
getInitialState: function() {
return {
element: new Myclass()
};
},
mutateElement: function() {
this.state.element.mutate();
}
});
我怎样才能让 <Component />
知道 this.state.element
已经发生变化并且需要重新渲染?
使用 React immutability Helpers 无效,因为以下语法无效:
mutate() {
this = update(this, {value: {$set: 'bar'});
}
有两种方法可以解决这个问题。首先是简单的方法:this.forceUpdate()
但是要具体反应tells,尽量避免。但我觉得你有一个有效的用例。
let Component = React.createClass({
getInitialState: function() {
return { element: new Myclass() };
},
mutateElement: function(){
this.state.element.mutate();
this.forceUpdate();
}
});
但是如果你想坚持不使用 this.forceUpdate()
你可以在状态中有另一个变量并设置它。
let Component = React.createClass({
getInitialState: function() {
return { element: new Myclass(),
hasChanged: false };
},
mutateElement: function(){
this.state.element.mutate();
this.setState({hasChanged: true});
}
});
这会改变它并重新渲染你的组件。
我知道的最好方法是克隆一个实例。例如来自 lodash 的 _.cloneDeep() 。
但这会影响性能。
我有这个class:
class MyClass {
constructor() {
this.value = 'foo';
}
mutate() {
this.value = 'bar';
}
}
以及一个在其状态下有一个实例的组件:
let Component = React.createClass({
getInitialState: function() {
return {
element: new Myclass()
};
},
mutateElement: function() {
this.state.element.mutate();
}
});
我怎样才能让 <Component />
知道 this.state.element
已经发生变化并且需要重新渲染?
使用 React immutability Helpers 无效,因为以下语法无效:
mutate() {
this = update(this, {value: {$set: 'bar'});
}
有两种方法可以解决这个问题。首先是简单的方法:this.forceUpdate()
但是要具体反应tells,尽量避免。但我觉得你有一个有效的用例。
let Component = React.createClass({
getInitialState: function() {
return { element: new Myclass() };
},
mutateElement: function(){
this.state.element.mutate();
this.forceUpdate();
}
});
但是如果你想坚持不使用 this.forceUpdate()
你可以在状态中有另一个变量并设置它。
let Component = React.createClass({
getInitialState: function() {
return { element: new Myclass(),
hasChanged: false };
},
mutateElement: function(){
this.state.element.mutate();
this.setState({hasChanged: true});
}
});
这会改变它并重新渲染你的组件。
我知道的最好方法是克隆一个实例。例如来自 lodash 的 _.cloneDeep() 。 但这会影响性能。