如何在React中将HTML元素传递给高阶函数(HOC)?

eri*_*gio 6 jsx reactjs higher-order-components

我经常使用HOC为现有的React组件提供附加功能,这非常简单:

import Component from '/path/to/Component';
import higherOrderComponent from '/path/to/higherOrderComponent';

const EnhancedComponent = higherOrderComponent(Component);
Run Code Online (Sandbox Code Playgroud)

但是,我需要包装一个简单的HTML input,它不作为独立的React组件存在。我试过了

const EnhancedInput = higherOrderComponent(<input />);
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

Uncaught Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.
Run Code Online (Sandbox Code Playgroud)

如何正确传递输入?

eri*_*gio 5

传递要包装的HTML元素的字符串名称:

const EnhancedInput = higherOrderComponent('input');
Run Code Online (Sandbox Code Playgroud)

该错误使我陷入需要做的事情,并且在分解JSX正在做的事情时更有意义。<input />简直是JSX语法糖React.createElement('input')

如果HOC看起来像这样:

const higherOrderComponent = (Component) => {
  return class extends React.Component {
    render() {
      return (
        <Component {...} />
      );
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

然后该render方法最终将返回

React.createElement(Component, {...});
Run Code Online (Sandbox Code Playgroud)

因此,将字符串传递'input'给HOC意味着它将返回React.createElement('input', {...});,与<input />上面声明的相同。


fab*_*ira 5

另一种解决方案是使用返回所需 HTML 的函数。

const EnhancedComponent = higherOrderComponent(()=><input />)