Сегодня я начал изучать ReactJS и через час столкнулся с проблемой ... Я хочу вставить компонент, который имеет две строки внутри div на странице. Упрощенный пример того, что я делаю ниже.
У меня есть html:
<html>
..
<div id="component-placeholder"></div>
..
</html>
Функция рендеринга выглядит так:
...
render: function() {
return(
<div className="DeadSimpleComponent">
<div className="DeadSimpleComponent__time">10:23:12</div >
<div className="DeadSimpleComponent__date">MONDAY, 2 MARCH 2015</div>
</div>
)
}
....
А ниже я вызываю рендер:
ReactDOM.render(<DeadSimpleComponent/>, document.getElementById('component-placeholder'));
Сгенерированный HTML выглядит так:
<html>
..
<div id="component-placeholder">
<div class="DeadSimpleComponent">
<div class="DeadSimpleComponent__time">10:23:12</div>
<div class="DeadSimpleComponent__date">MONDAY, 2 MARCH 2015</div>
</div>
</div>
..
</html>
Проблема в том, что я не очень доволен тем, что React заставляет меня обернуть все в div "DeadSimpleComponent". Какое решение является лучшим и простым без явных манипуляций с DOM?
ОБНОВЛЕНИЕ 28.07.2017: Сопровождающие React добавили эту возможность в React 16 Beta 1
Начиная с React 16.2 , вы можете сделать это:
render() {
return (
<>
<ChildA />
<ChildB />
<ChildC />
</>
);
}
javascript
reactjs
Кирилл Резников
источник
источник
Ответы:
Это требование было удалено в React версии (16.0)] 1 , так что теперь вы можете избежать этой оболочки.
Вы можете использовать React.Fragment для рендеринга списка элементов без создания родительского узла, официальный пример:
Подробнее здесь: Фрагменты
источник
Обновление 2017-12-05: React v16.2.0 теперь полностью поддерживает рендеринг фрагментов с улучшенной поддержкой возврата нескольких дочерних элементов из метода рендеринга компонентов без указания ключей в дочерних элементах:
Если вы используете версию React до v16.2.0, вместо нее также можно использовать
<React.Fragment>...</React.Fragment>
:Оригинал:
React v16.0 представил возврат массива элементов в методе рендеринга без упаковки его в div: https://reactjs.org/blog/2017/09/26/react-v16.0.html
На данный момент ключ необходим для каждого элемента, чтобы избежать ключевого предупреждения, но это может быть изменено в будущих выпусках:
источник
Ты можешь использовать:
Дополнительные сведения см. В этой документации .
источник
Используйте [] вместо (), чтобы обернуть весь возврат.
источник
Я создал компонент для обертывания дочерних компонентов без DIV. Это называется теневой оболочкой: https://www.npmjs.com/package/react-shadow-wrapper
источник
Это все еще необходимо , НО React теперь обязательно создает элементы без создания дополнительного элемента DOM.
Требуется дополнительная упаковка (обычно с родительским элементом
div
), потому что дляcreateElement
метода Reacts требуетсяtype
параметр, равныйeither a tag name string (such as 'div' or 'span'), a React component type (a class or a function)
. Но это было до того, как они представили ReactFragment
.Обратитесь к этому НОВОМУ api doc для createElement
вот официальный пример, Refer React.Fragment .
источник
Вы не сможете избавиться от этого
div
элемента. React.render () должен вернуть один действительный узел DOM.источник
Вот один из способов визуализации "прозрачных" компонентов:
источник
Также есть обходной путь. Приведенный ниже код блока генерирует фрагмент без необходимости React.Fragment.
источник
Я знаю, что на этот вопрос был дан ответ, вы, конечно, можете использовать React.Fragment, который не создает узел, но позволяет группировать такие вещи, как div.
Кроме того, если вы хотите повеселиться, вы можете реализовать (и многому научиться) режим React, который удаляет лишние div, и для этого я действительно хочу поделиться отличным видео о том, как вы можете сделать это на самой базе кода реакции.
https://www.youtube.com/watch?v=aS41Y_eyNrU
Это, конечно, не то, чем вы будете заниматься на практике, но это хорошая возможность для обучения.
источник