策略的一个例子
我喜欢提供的解决方案,这些解决方案通过在组件周围创建包装器来执行相同的操作。
由于这更多是一种行为,因此我想到了Strategy并提出了以下建议。  
我是React的新手,我需要一些帮助才能在用例中节省一些样板  
请查看并告诉我您的想法。
ClickOutside行为
import ReactDOM from 'react-dom';
export default class ClickOutsideBehavior {
  constructor({component, appContainer, onClickOutside}) {
    // Can I extend the passed component's lifecycle events from here?
    this.component = component;
    this.appContainer = appContainer;
    this.onClickOutside = onClickOutside;
  }
  enable() {
    this.appContainer.addEventListener('click', this.handleDocumentClick);
  }
  disable() {
    this.appContainer.removeEventListener('click', this.handleDocumentClick);
  }
  handleDocumentClick = (event) => {
    const area = ReactDOM.findDOMNode(this.component);
    if (!area.contains(event.target)) {
        this.onClickOutside(event)
    }
  }
}
样品用量
import React, {Component} from 'react';
import {APP_CONTAINER} from '../const';
import ClickOutsideBehavior from '../ClickOutsideBehavior';
export default class AddCardControl extends Component {
  constructor() {
    super();
    this.state = {
      toggledOn: false,
      text: ''
    };
    this.clickOutsideStrategy = new ClickOutsideBehavior({
      component: this,
      appContainer: APP_CONTAINER,
      onClickOutside: () => this.toggleState(false)
    });
  }
  componentDidMount () {
    this.setState({toggledOn: !!this.props.toggledOn});
    this.clickOutsideStrategy.enable();
  }
  componentWillUnmount () {
    this.clickOutsideStrategy.disable();
  }
  toggleState(isOn) {
    this.setState({toggledOn: isOn});
  }
  render() {...}
}
笔记
我想存储传递的component生命周期挂钩,并使用与之类似的方法来覆盖它们:
const baseDidMount = component.componentDidMount;
component.componentDidMount = () => {
  this.enable();
  baseDidMount.call(component)
}
component是传递给的构造函数的组件ClickOutsideBehavior。
这将从用户的行为中删除启用/禁用样板,但是看起来不太好