Добавить компонент в React

Рассмотрим эту структуру приложения:

<App>
  <SideBar/>
  <ProductsInterface/>
</App>

ПродуктыИнтерфейс отображает компонент с именем Список продуктов. У меня есть еще один компонент под названием Фильтр, и его свойства зависят от Список продуктов. Это означает, что мне нужно отрендерить его внутри. Проблема в том, что мне нужно, чтобы он был выровнен слева, справа под боковой панелью, а не в компоненте ПродуктыИнтерфейс. Я попытался переместить его влево с помощью css, но я думаю, что есть такие методы, как ReactDOM.render (который говорит, что div не является допустимым элементом для добавления), с помощью которых я могу добавить этот фильтр в компонент или элемент html.

Пожалуйста, предоставьте минимальный воспроизводимый пример.

Code-Apprentice 13.06.2018 22:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
1
2 733
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Не то чтобы я рекомендовал это, но вы можете использовать ReactDOM.createPortal для рендеринга компонента в любом месте dom:

<App>
  <SideBar/>
  <div id = "filters"></div>
  <ProductsInterface/>
</App>

Filters.js

...
render () {
    return ReactDOM.createPortal( <div>...</div>, document.getElementById('filters'))
}

Первый аргумент для createPortal - это JSX, который нужно отобразить, а второй аргумент - это элемент DOM для его визуализации. НО я бы рекомендовал вам использовать CSS, чтобы расположить его под боковой панелью.

Лучшим подходом было бы использование диспетчера состояний, такого как сокращение. Таким образом, вы сможете получить любую часть состояния в любом компоненте без необходимости вкладывать их друг в друга. Или, может быть, context api может помочь вам разделить некоторое состояние между компонентами.

Если вы хотите реорганизовать структуру компонентов своего приложения, вы можете создать общего предка для <Filter /> и <ProductList/>, который передает состояние обоим компонентам в качестве свойств. Итак, вместо этого:

<App>
    <SideBar/>
    <ProductsInterface>
        <ProductList>
            <Filter/>
        </ProductList>
    </ProductsInterface>
</App>

У вас будет что-то вроде этого:

<App>
    <ProductInfo> //product-related state lives here
        <Sidebar/>
        <Filter/>
        <ProductsInterface>
            <ProductList/>
        </ProductsInterface>
    </ProductInfo>
</App>

Это позволяет вам разместить фильтр внизу боковой панели, поскольку компоненты являются братьями и сестрами. <Filter/> может затем получить функции, подобные filterProducts(), в качестве опоры от <ProductInfo/> (его непосредственного родителя). В методе рендеринга ProductInfo.js это будет выглядеть следующим образом:

<Filter propName = "this.filterProducts"></Filter>

Затем настройте свой onClicks в <Filter/> для вызова функции из его свойств, которые обновят состояние в <ProductInfo/> и, соответственно, содержимое <ProductList/> (поскольку он получает состояние <ProductInfo/> в качестве свойств).

Этот шаблон называется состояние подъема вверх и довольно часто встречается в приложениях React. Я определенно рекомендую изучить его дальше, когда вы будете разрабатывать свою стратегию организации дерева компонентов.

Другие вопросы по теме