首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >高阶组件始终忽略shouldComponentUpdate而重新呈现

高阶组件始终忽略shouldComponentUpdate而重新呈现
EN

Stack Overflow用户
提问于 2016-08-19 13:37:37
回答 4查看 2.9K关注 0票数 3

我有一个像这样的高阶分量

代码语言:javascript
复制
// higherOrderComponent.js
const HigherOrderComponent = Component => class extends React.Component {
  shouldComponentUpdate (nextProps, nextState) {
    return false
  }

  render () {
    return <Component {...this.props} />
  }
}

export default HigherOrderComponent

// myComponent.js
import HigherOrderComponent from './higherOrderComponent'

class MyComponent extends React.Component {
  render () {
    return <div>my component</div>
  }
}

export default HigherOrderComponent(MyComponent)

// parentComponent.js
import MyComponent from './myComponent'

class ParentComponent extends React.Component {
  render () {
    return <MyComponent />
  }
}

我显式返回false,但组件总是被重新呈现。知道为什么吗?我最终想要跨组件共享"shouldComponentUpdate“。如果高阶组件不起作用,我该如何实现?

EN

回答 4

Stack Overflow用户

发布于 2016-08-19 16:08:21

由于您还没有指定如何调用您的高阶组件,因此基于这个问题,我已经猜测了您可能会如何使用它。

我的答案是基于这样的假设:您正在调用您的高阶函数,例如

代码语言:javascript
复制
var MyHigherOrderFn = (HigherOrderComponent(Baar));

如果你想知道如何在render中调用像下面这样的高阶函数到return中,你可以避免这个问题。

代码语言:javascript
复制
<HigherOrderComponent prop1="Hello" child="Child" />

由于我不知道如何以上述方式调用您的函数(我甚至不确定它是否可行),我创建了具有不同语法风格的HigherOrderComponent2,它们可以像这样调用,这反过来又符合shouldComponentUpdate

代码语言:javascript
复制
<Parent prop1="val1">
    <Child>
</Parent>

代码语言:javascript
复制
import React, {PropTypes} from 'react';


/*This is simeple child component*/
class Baar extends React.Component {    
  render() {
    return (<div>{this.props.name}</div>);
  }
}


/*This is your higher order component*/
const HigherOrderComponent = Component => class extends React.Component {
  shouldComponentUpdate (nextProps, nextState) {
    return false;
  }

  render () {
    return <Component {...this.props} />
  }
}

/*This is another way to write higher order component*/
class HigherOrderComponent2 extends React.Component {
  constructor(props) {
    super(props);
  }

  shouldComponentUpdate (nextProps, nextState) {
    return false;
  }

  render(){

    let child = this.props.children && React.cloneElement(this.props.children,
        {...this.props}
    );

    return <div>{child}</div>
  }
}



/*Problem that you are facing how you invoke your Higher Order Compoent*/
export default class Foo extends React.Component {
  constructor(props) {
    super(props);
    this.onHandleClick = this.onHandleClick.bind(this);
    this.state={
      name: 'Praveen Prasad'
    }
  }

  onHandleClick(){
    this.setState({
      name:Math.random()
    });
  }

  render() {
    {'This is how you might be invoking you higher order component, at this time react render doesnt know it already exists in DOM or not'}
    {'this component will always re-render, irrespective of values in shouldComponentUpdate'}
    var Baaz = (HigherOrderComponent(Baar));
    return (<div>
      <button onClick={this.onHandleClick}>Update Name</button>
        <Baaz name={this.state.name} />

        {'This is  another way to invoke higher order Component , and this will respect shouldComponentUpdate'}
        <HigherOrderComponent2 name={this.state.name}>
          <Baar />
        </HigherOrderComponent2>
    </div>);
  }
}
票数 1
EN

Stack Overflow用户

发布于 2016-08-21 18:37:36

我已经修改了你的代码,创建了一个代码片段,它可以正常工作,当shouldComponentUpdate返回false时,MyComponent.render只被调用一次。

我的猜测是,不知何故,您使用的是MyComponent的未包装版本,而不是包装版本。也许你的构建环境有问题?

代码语言:javascript
复制
// higherOrderComponent.js
const HigherOrderComponent = Component => class extends React.Component {
  shouldComponentUpdate (nextProps, nextState) {
    return false;
  }

  render () {
    return <Component {...this.props} />
  }
}

class MyComponent extends React.Component {
  render () {
  	console.log('render');
    return <div>my component</div>
  }
}

const MyComponentHOC = HigherOrderComponent(MyComponent);

class ParentComponent extends React.Component {
  render () {
    return <MyComponentHOC />
  }
}

ReactDOM.render(<ParentComponent/>, document.getElementById('container'));
ReactDOM.render(<ParentComponent/>, document.getElementById('container'));
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>


<div id="container"></div>

票数 1
EN

Stack Overflow用户

发布于 2016-08-19 13:54:32

它是关于react组件的生命周期的。当一个组件被初始化时,它不会检查shouldComponentUpdate。仅当状态/属性发生更改时,才会调用ShouldComponentUpdate。

仅供参考,生命周期方法按顺序调用:

组件初始化时的渲染: getDefaultProps getInitialStage componentWillMount render componentDidMount

组件状态更改时的渲染: shouldComponentUpdate componentWillUpdate render componentDidUpdate

当组件的道具发生更改时渲染: componentWillReceiveProps shouldComponentUpdate componentWillUpdate render componentDidUpdate

卸载组件时的 componentWillUnmount

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39031781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档