我使用下面显示的ThreeDisplay
React组件来保存WebGL / Three.js画布(画布本身不是组件的一部分,它会被附加到容器div
通过初始化脚本)。
我希望该组件仅在每次RUN
和UPDATE
操作后更新。这些操作由ThreeDisplay
的父组件调度。
现在出于某种原因,如果上一个操作是FADE_COLOR
或SWITCH_COLOR
,该组件也会得到更新/重新呈现。这些操作由ThreeDisplay调度,它们由鼠标事件触发,如下面的代码所示。
我尝试使用shouldComponentUpdate()
仅在上述操作后更新。但由于某种原因,这并不妨碍组件在每次鼠标事件时重新渲染。
我的应用程序/原型的完整代码可以在this repository
中找到 import React from 'react'
import {connect} from 'react-redux'
import {fadeColor, switchColor} from '../actions'
class ThreeDisplay extends React.Component {
shouldComponentUpdate(nextProps) {
const shouldUpdate =
nextProps.lastAction === 'RUN' || nextProps.lastAction === 'UPDATE'
if (!shouldUpdate) {
console.log('ThreeDisplay will not update on ' + nextProps.lastAction)
}
return shouldUpdate
}
componentWillUpdate() {
// This gets logged even if lastAction ist not 'RUN' or 'UPDATE'
console.log('ThreeDisplay will update on ' + this.props.lastAction)
}
render() {
return (
<div
id="container"
className={
this.props.running
? 'three-display'
: 'three-display hidden'
}
onClick={this.props.switchColor}
onMouseMove={this.props.fadeColor}
/>
)
}
}
const mapStateToProps = state => {
return {
running: state.running,
lastAction: state.lastAction
}
}
const mapDispatchTopProps = dispatch => {
return {
fadeColor: e => dispatch(fadeColor(e)),
switchColor: () => dispatch(switchColor())
}
}
export default connect(mapStateToProps, mapDispatchTopProps)(ThreeDisplay)
答案 0 :(得分:3)
在此表达式中
const shouldUpdate = nextProps.lastAction === 'RUN' || 'UPDATE'
如果nextProps.lastAction === 'RUN'
为false,则代码会评估OR的另一个分支,即只有'UPDATE'
字符串,它始终为true,因此shouldUpdate
将始终为真。 / p>
将其替换为
const shouldUpdate = nextProps.lastAction === 'RUN'
|| nextProps.lastAction === 'UPDATE'