【问题标题】:Is this a valid React HoC use case?这是一个有效的 React HoC 用例吗?
【发布时间】:2020-07-01 01:18:56
【问题描述】:

我正在向自己介绍 React 的 HoC 模式。

我有一个视频播放器组件,有时需要 select 来更改视频 src url 中的参数。

为了简化,这是我的 HoC 的简化版本:

function withTimeControl(PlayerComponent) {
  return class extends Component {
    state = {
      src: ''
    }

    updatePlayerDelay = (event) => {
      this.setState({
        src: event.target.value
      })
    }

    render() {
      return(
        <div>
          <PlayerComponent 
            title={this.props.title}
            src={this.state.src}
          />

          <PlayerTimeComtrol
            label={this.props.label}
            onChangeHandler={this.updatePlayerDelay}
          />
        </div>
      );
    }
  };
}

要使用它,我会这样做:

const PlayerWithTimeControl = withTimeControl(Player)

// ...

<PlayerWithTimeControl title='Player title' label='Time control label' />

PlayerComponent 是被包装的组件。 HoC 基本上是广告一个组件,PlayerTimeComtrol 来改变视频播放器的src。

这是有效的用例吗?还有其他更准确的解决方案吗?也许只使用组件包装器而不是 HoC?

【问题讨论】:

    标签: javascript reactjs design-patterns high-order-component


    【解决方案1】:

    从技术上讲,这是一种可以使用的方法。但 HOC 通常处理数据流添加/拦截,而不是 UI。 IMO,它们应该谨慎使用。当你可以让PlayerTimeComtrol 接受children 道具并将其包裹在PlayerComponent 周围时,这真的感觉像是过度设计。

    <PlayerTimeComtrol
      label={this.props.label}
      onChangeHandler={this.updatePlayerDelay}
    >
      // with whatever component you want here
    </PlayerTimeControl>
    

    【讨论】:

      【解决方案2】:

      是的,这正是 HoC 的用途:为现有组件添加功能。

      【讨论】:

      • 你可以让你的整个应用成为一堆钩子,但这并不意味着这是一个好主意。
      • 我了解它们的用途。我的问题更倾向于“良好实践”的观点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2016-11-24
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多