1

我正在设置按钮单击状态。
即 this.setState('array', array);

在第一个 setState 它影响前端。但是当我将更多值推送到数组并尝试再次设置状态时不会影响状态和前端。

有没有办法一遍又一遍地设置状态并再次渲染页面。

4

1 回答 1

2

Marko Widgets只对新状态和旧状态进行浅层比较,以确定是否需要重新渲染 UI 组件。也就是说,Marko Widgets不会对数组进行深度比较,以确定新数组是否有新元素或不同元素。出于性能原因进行浅比较,因为对于作为 UI 组件状态一部分的每个属性进行深度比较通常计算量太大。

解决方案 1

推荐的策略是将添加到状态的对象视为不可变的。也就是说,您不会改变旧数组,而是使用附加元素创建一个新数组:

坏的:

var myArray = this.state.myArray;
myArray.push('foo');
this.setState('myArray', myArray); // No change since myArray === this.state.myArray

好的:

var myArray = this.state.myArray;
myArray = myArray.concat('foo'); // myArray !== this.state.myArray
this.setState('myArray', myArray);

解决方案 2

this.setStateDirty('myArray')另一种选择是在改变数组后调用:

var myArray = this.state.myArray;
myArray.push('foo');
this.setStateDirty('myArray'); // Mark the object as being modified

更多信息:

于 2016-09-16T16:40:18.507 回答