Определение и экспорт HOC в React
Я исследовал компоненты более высокого порядка в react. Мое требование состоит в том, что у меня есть набор компонентов, которые мне нужно расширить, чтобы дать им больше функциональности без перезаписи всего компонента. В этом случае я обнаружил концепцию HOC в react, где можно расширить компонент, используя чистую функцию. Мой вопрос заключается в том, Могу ли я экспортировать расширенный компонент как обычный компонент. Для примера
Компонент, который должен быть расширен
class foo extends React.Component {
render(){
//something
}
}
export default foo;
HOC компонент
function bar(foo) {
render() {
return <foo {...this.props} {...this.state} />;
}
}
export default bar;
Могу ли я использовать компонент таким образом? или я делаю это неправильно?
3 ответов:
HOC возьмет компонент, добавит некоторые дополнительные функции и вернет новый компонент, а не просто вернет экземпляр компонента,
Что бы вы сделали, это
function bar(Foo) { return class NewComponent extend React.Component { //some added functionalities here render() { return <Foo {...this.props} {...otherAttributes} /> } } } export default bar;Теперь, когда вы хотите добавить некоторую функциональность к компоненту, вы создадите экземпляр компонента, например
const NewFoo = bar(Foo);Который теперь можно использовать как
return ( <NewFoo {...somePropsHere} /> )Кроме того, вы можете разрешить HOC взять компонент по умолчанию и экспортировать его как компонент по умолчанию и использовать его в другом месте как
function bar(Foo = MyComponent) {, а затем создайте экспорт типа
const wrapMyComponent = Foo(); export { wrapMyComponent as MyComponent };Типичным случаем использования HOC может быть Функциональность
HandleClickOutside, в которой вы передадите компонент, который должен выполнить действие на основе функциональностиhandleClickOutside
Другой способ может быть таким:
Сделать компонент Foo
class Foo extends React.Component { render() { return ( < h1 > hello I am in Foo < /h1>) } }Создайте специальный компонент.
class Main extends React.Component { constructor(props) { super(props); } render() { const { component, props } = this.props; //extract the dynamic component passed via props. var Component = component; return ( < div > < h1 > I am in main < /h1> < Component {...props} > < /Component> </div > ); } } ReactDOM.render( < Main component = { Foo } > < /Main>, document.getElementById('example') );Рабочий код здесь
Да, вы можете
const bar = (Foo) => { return class MyComponent extend Component { render() { return <Foo {...this.props} /> } } }/ / Наш Код Компонента Foo Здесь
Но опять же это зависит от функциональности. Например: предположим, вы используете react router и хотите проверить, присутствует ли пользователь, прежде чем отрисовывать компонент, не передавайте HOC. например:export default bar(Foo)<Route path="/baz" component={auth(Foo)} />Вместо этого используйте новый компонент.
Примечание: NewComponent подключается к redux и пользователь (состояние) передается как props
class NewRoute extends Component{ render(){ const {component:Component, ...otherProps} = this.props; return( <Route render={props => ( this.props.user? ( <Component {...otherProps} /> ):( <Redirect to="/" /> ) )} /> ); } }Затем по маршрутам
<NewRoute path='/foo' component={Foo} />
Comments