Angular 世界中 React 的“$emit”是什么

What's React's "$emit" as in Angular world

在Angular中,我们可以使用$scope.$emit方法来通知祖先。我们如何在 React 中做同样的事情?

简单的解决方案是将回调从父级传递给子级再传递给孙级,等等...当子孙调用回调时,它将在父级的上下文中 运行。

class Parent extends React.Component {
  constructor() {
    this.click = this.click.bind(this); // bind the handler to this
  }
  
  click(view) {
    this.setState({ view }); // change the state
  }
  
  render() {
    return <Child clickHandler={ this.click } />; // pass CB to child
  }
}

class Child extends React.Component {
  render() {
    return <GrandChild clickHandler={ this.props.clickHandler } />;  // pass CB to grandChild
  }
}

class GrandChild extends React.Component {
  render() {
    return <button onClick={ () => this.props.clickHandler('nextViewId') }>Click</button>; // invoke CB on click
  }
}

问题是,如果您有一个大型组件树,您将不得不将多个回调传输到多个级别。这意味着每个容器都可以有多个属性,这些属性只是传递 CB,这使得测试和维护变得非常困难。将此解决方案用于小型应用程序。

对于大型应用程序,您应该使用 Flux based architecture, such as redux。粗略的想法是每个动作都由调用组件分派,并由创建新模型的主存储处理,并将其传输到组件树的根。通过这种方式,每个组件都获得了它需要的所有数据,并且可以随心所欲地处理它。这感觉有点像使用 Angular 的 $broadcast 到根。