Как обернуть компонент React с помощью React.cloneElement с помощью функции?

#reactjs #react-router

#reactjs #react-маршрутизатор

Вопрос:

Например, допустим, у меня есть следующие маршруты:

 <Switch>
  <Route path='/login' component={Login} />
  <Route path='/home' component={HomePage} />
  <Route path='/profile' component={Profile} />
</Switch>
  

И я хочу обернуть эти компоненты в div, чтобы передать стиль и новый реквизит, используя функцию для более многократного использования, вот так:

 <Switch>
  <Route path='/login' component={wrapper(Login, 'red')} />
  <Route path='/home' component={wrapper(Home, 'blue')} />
  <Route path='/profile' component={wrapper(Profile, 'green')} />
</Switch>
  

Где оболочка была бы чем-то вроде этого:

 const wrapper = (component, color) => {
  return (
    <div className='container'>
       <Component color={color} />
    <div>
  )
}
  

Как это возможно? Я попробовал несколько альтернатив, таких как:

 const wrapper = (component, text) => {
  return React.cloneElement(component, {color: text})
 }
  

Но не уверен, как я могу это сделать, используя React.cloneElement или любой другой шаблон.

Ответ №1:

Вы могли бы использовать render prop вместо component prop и таким образом передавать color prop компонентам.

 <Switch>
  <Route path='/login' render={(props) => <Login color="red" {...props} />} />
  <Route path='/home' render={(props) => <HomePage color="blue" {...props} />} />
  <Route path='/profile' render={(props) => <Profile color="green" {...props} />} />
</Switch>
  

Комментарии:

1. Мне это понравилось. Есть предложения о том, как обернуть компонент между <div> </div>, а также добавить стиль, например?

2. @LucasOliveiraSilva Вы могли бы создать компонент более высокого порядка , если хотите, но это может оказаться слишком громоздким для данного конкретного варианта использования. Если вы хотите окружить компонент символом div , вы также можете сделать это непосредственно в render реквизите.

3. Пример использования — это пример, исходный код слишком сложный. Но этого достаточно.