【发布时间】:2016-08-20 19:03:24
【问题描述】:
我的 React 应用程序中有一个组件可以为用户呈现总价值。当该值上升时,我想播放噪音。我认为在显示总数的组件中将是一个播放噪音的好地方。
所以我在组件中添加了一个componentWillReceiveProps 方法,并在其中计算了两个总数:total 由this.props 计算得出,nextTotal 由nextProps 计算得出。
令我惊讶的是,即使值发生变化并且总数发生变化,nextTotal 和 total总是相同。所以当总数上升时我想解雇的条件永远不会发生。
我编写了一个简单的单组件示例。 JSfiddle.
var Hello = React.createClass({
componentWillReceiveProps: function(nextProps) {
var total = 0;
this.props.vals.forEach(val => total+= val);
var nextTotal = 0;
nextProps.vals.forEach(val => nextTotal+= val);
console.log(total, nextTotal)
if (nextTotal > total) {
//never runs
console.log('moving up');
}
},
render: function() {
var total = 0;
vals.forEach(val => total+= val)
return (
<div>{total}</div>
)
}
});
var vals = [1, 21, 452, 123];
setInterval(renderReact, 1000)
function renderReact() {
vals.push(10);
ReactDOM.render(
<Hello
vals={vals}
/>,
document.getElementById('container')
);
}
如您所见,它每秒钟将 10 加到 vals 数组中,这意味着总数增加 1。但是如果您打开控制台,您可以看到 total 和 nextTotal 始终是同样,moving up 永远不会被记录。
我显然误解了某事,如果有人能解释我的误解是什么,以及我应该如何实现我的目标,那就太棒了。
【问题讨论】:
-
为什么不尝试记录这两个数组呢?检查一下,您一直向他们俩推十个...jsfiddle.net/ydaso4cs/2这是同一件事...
-
您将数组直接传递给元素。
this.props.vals和nextProps.vals引用同一个对象。 -
您不仅引用了同一个数组,而且您的组件没有更新,因为您调用了一次渲染。我没有看到任何导致更新的代码。
-
@JohnRuddell 有一个 setInterval 每秒调用一次 renderReact
-
或许阅读本文会有所帮助:facebook.github.io/react/blog/2016/01/08/…
标签: javascript reactjs components