React shouldComponentUpdate()不会阻止重新渲染

时间:2017-11-20 10:09:03

标签: javascript reactjs

我使用下面显示的ThreeDisplay React组件来保存WebGL / Three.js画布(画布本身不是组件的一部分,它会被附加到容器div通过初始化脚本)。

我希望该组件仅在每次RUNUPDATE操作后更新。这些操作由ThreeDisplay的父组件调度。

现在出于某种原因,如果上一个操作是FADE_COLORSWITCH_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)

1 个答案:

答案 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'