代码之家  ›  专栏  ›  技术社区  ›  Teneff

如何从事件.目标

  •  0
  • Teneff  · 技术社区  · 6 年前

    我在父元素上附加了一个事件监听器来监听一个非合成事件,我想知道是否有一个很好的方法来获取对触发事件的组件的引用以使用它的属性

    我需要推迟渲染 item.component 直到 nonSyntheticEvent 发生

    const items = [
      {
        name: "click me",
        component: function First() {
          return <strong>asd</strong>;
        }
      },
      {
        name: "click me 2",
        component: function Second() {
          return <b>oasd</b>;
        }
      }
    ];
    
    class Component extends React.Component {
      componentDidMount() {
        this.el.addEventListener("nonSyntheticEvent", event =>
          this.nonSyntheticEventHandler(event)
        );
      }
    
      nonSyntheticEventHandler(event) {
    
        // how to get reference to item
        // from event.target to render it's item.component
    
        const el = React.createElement(item.component);
        ReactDOM.render(el, event.target);
      }
    
      render() {
        return (
          <div ref={ref => { this.el = ref; }}>
            {this.props.items.map(item => <Child {...item} />)}
          </div>
        );
      }
    }
    
    <Component items={items} />
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Teneff    6 年前

    反应16.3 React.createRef() 介绍了一种可用于 Component Child

    例如在 Component.constructor 可以在状态中创建对每个子级的引用

    this.state = {
      items: items.map(item => ({
        ...item,
        reference: React.createRef()
      }))
    };
    

    然后在子组件中可以从道具中使用:

    function Child(props){
      return (
        <div ref={props.reference}>
          <span>{props.name}</span>
        </div>
      );
    }
    

    然后在 nonSyntheticEventHandler

    const found = this.state.items.find(item => {
      return item.reference.current === event.target;
    });
    

    工作示例 Codesandbox.io