【问题标题】:How to use refs over an HOC in react?如何在 HOC 上使用 refs 进行反应?
【发布时间】:2018-10-12 08:55:14
【问题描述】:

我有一个组件(用 HOC 包装),它安装在我的应用程序的多个位置。我必须在ComponentDidMount 中使用node.addEventListener 添加一些自定义事件,例如dragdragLeave 等,并且需要在ComponentWillUnmount 中删除它们。我尝试将 ref 提供给 HOC(它安装 WrapperComponent 的位置),但它给了我一个错误,node.addEventListener 不是一个函数,因为它给了我一个组件的实例,而不是这个 HOC 的 DOM 节点。如何使用refs 解决这个问题?

这就是我的 HOC 的样子:

export default function Connector() {
    return function wrap(WrappedComponent) {
        class MyComponent extends PureComponent {
            componentDidMount(){
                //find node here and attach event listener
            }
            componentWillUnmount(){
                //remove event listener
            }
            ....
            render() {
               <WrappedComponent 
                   {...this.props}
               />
            }
        }
    }
}

编辑 我不想在这里使用ReactDOM.findDOMNode

【问题讨论】:

    标签: reactjs ref higher-order-components


    【解决方案1】:

    给 WrappedComponent 添加一个 ref,然后找到 DOM 实例

    export default function Connector() {
        return function wrap(WrappedComponent) {
            class MyComponent extends PureComponent {
                componentDidMount(){
                    //find node here and attach event listener
                    this.node = ReactDOM.findDOMNode(this.componentRef);
    
                }
                componentWillUnmount(){
                    //remove event listener
                }
    
                ....
                render() {
                   <WrappedComponent 
                       {...this.props}
                       ref={(ref) => this.componentRef = ref}
                   />
                }
            }
        }
    }
    

    另一种方法是将prop innerRef 传递给 WrappedComponent 并将其留给 WrappedComponent 以将 ref 传递给 DOM 节点

       <WrappedComponent 
            {...this.props}
            innerRef={(ref) => this.componentRef = ref}
       />
    

    然后在 WrappedComponent 中

     render() {
         return (
            <div ref={this.props.innerRef}>{/* */}</div>
         )
      }
    

    【讨论】:

    • 这个答案是正确的但我不想用ReactDOM.findDOMNode
    • 在这种情况下,您需要将一个 prop innerRef 传递给 WrappedComponent,然后依赖 WrappedComponent 将其作为 ref 传递给 DOM 节点
    • 但这取决于内部组件,他们将获取 ref 并将其放在 DOM 元素上。这会是一个好的设计吗?
    • @AjayGaur 正是我的观点,这是两个可用的选项,因此我更喜欢使用 ReactDOM.findDOMNode 的初始解决方案,因为依赖于用户组件来提供一些数据不是一个好的模型。还建议尽可能避免 findDOMNode,但不要完全避免
    • 谢谢,有帮助。如果我们使用第二种方式,我们可以使用不变量。
    猜你喜欢
    • 2019-12-10
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2017-12-02
    • 2021-05-09
    • 2014-11-14
    • 2019-09-23
    相关资源
    最近更新 更多