React - 防止 HOC 基于 props 重新计算

Posted

技术标签:

【中文标题】React - 防止 HOC 基于 props 重新计算【英文标题】:React - prevent HOC from recomputing based on props 【发布时间】:2019-09-21 19:35:22 【问题描述】:

我想知道是否有一种模式可以让我防止 HOC 根据某些条件重新计算,这是一个示例:

const DumbComponent = () => <button>Click me<button/>;

// Third party HOC, that I can't modify
const SmartComponent = Component => class extends Component 
  componentWillReceiveProps() 
    // Complex stuff that only depends on one or 2 props
    this.state.math = doExpensiveMath(props);
  
  
  render() 
    return <Component ...this.props math=this.state.math />;
  


const FinalComponent = SmartComponent(DumbComponent);

我正在寻找的是一种模式,如果我知道它所依赖的道具没有改变,它会阻止这个 HOC 做它的事情。但这并不能阻止整个树基于像 shouldComponentUpdate 这样的 props 进行重新渲染。

问题是,这个 HOC 来自另一个库,理想情况下我不想分叉它。

【问题讨论】:

很难不知道SmartComponent 在做什么,但如果它只是计算,那么你应该Memoize 传递给它的道具(也许散列道具)值 obj 并直接渲染这种情况下的子组件。 【参考方案1】:

我得到的是你想防止 hoc 重新计算某些逻辑,你可以这样做:-

const DumbComponent = () => <button>Click me<button/>;

// Third party HOC
const SmartComponent = Component => class extends Component 
  componentWillReceiveProps() 
    // Complex stuff that only depends on one or 2 props
    this.state.math = doExpensiveMath(props);
  

  render() 
    return <Component ...this.props math=this.state.math />;
  


const withHoc = SmartComponent(DumbComponent);
class FinalComponent extends Component  
    render() 
        if (your condition here)  
            return (
                <withHoc ...this.props />
            ); 
        

        else 
            return <DumbComponent ...this.props/>;
        
    


export default FinalComponent; 

【讨论】:

以上是关于React - 防止 HOC 基于 props 重新计算的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出 React 的 HOC 以及的 Render Props

javascript 尝试用`render` prop替换react-redux的`connect` HoC。

[react] 举例说明什么是高阶组件(HOC)的反向继承

[react] 使用高阶组件(HOC)实现一个loading组件

[react] 举例说明什么是高阶组件(HOC)的属性代理

Typescript with React - 在通用组件类上使用 HOC