Dzisiaj zacząłem uczyć się ReactJS i po godzinie napotkałem problem ... Chcę wstawić na stronie komponent, który ma dwa wiersze w div. Poniżej uproszczony przykład tego, co robię.
Mam html:
<html>
..
<div id="component-placeholder"></div>
..
</html>
Renderuj funkcję w ten sposób:
...
render: function() {
return(
<div className="DeadSimpleComponent">
<div className="DeadSimpleComponent__time">10:23:12</div >
<div className="DeadSimpleComponent__date">MONDAY, 2 MARCH 2015</div>
</div>
)
}
....
A poniżej nazywam render:
ReactDOM.render(<DeadSimpleComponent/>, document.getElementById('component-placeholder'));
Wygenerowany kod HTML wygląda następująco:
<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>
Problem polega na tym, że nie jestem zbyt szczęśliwy, że React zmusza mnie do zawinięcia wszystkiego w div „DeadSimpleComponent”. Jakie jest najlepsze i proste obejście tego problemu bez jawnych manipulacji DOM?
AKTUALIZACJA 28.07.2017: Opiekunowie Reacta dodali tę możliwość w React 16 Beta 1
Od React 16.2 możesz to zrobić:
render() {
return (
<>
<ChildA />
<ChildB />
<ChildC />
</>
);
}
javascript
reactjs
Kirill Reznikov
źródło
źródło
Odpowiedzi:
To wymaganie zostało usunięte w wersji React (16.0)] 1 , więc teraz możesz uniknąć tego opakowania.
Możesz użyć React.Fragment, aby wyrenderować listę elementów bez tworzenia węzła nadrzędnego, oficjalny przykład:
Więcej tutaj: Fragmenty
źródło
Aktualizacja 05.12.2017: React 16.2.0 teraz w pełni obsługuje renderowanie fragmentów z ulepszoną obsługą zwracania wielu elementów potomnych z metody renderowania komponentów bez określania kluczy w dzieciach:
Jeśli używasz wersji React wcześniejszej niż 16.2.0, możesz również użyć
<React.Fragment>...</React.Fragment>
zamiast niej:Oryginalny:
React v16.0 wprowadził zwracanie tablicy elementów w metodzie render bez zawijania jej w div: https://reactjs.org/blog/2017/09/26/react-v16.0.html
W tej chwili dla każdego elementu wymagany jest klucz, aby uniknąć ostrzeżenia o kluczu, ale można to zmienić w przyszłych wersjach:
źródło
Możesz użyć:
Więcej informacji można znaleźć w tej dokumentacji .
źródło
Użyj [] zamiast (), aby zawinąć cały powrót.
źródło
Stworzyłem komponent do zawijania komponentów potomnych bez DIV. Nazywa się to opakowaniem cienia: https://www.npmjs.com/package/react-shadow-wrapper
źródło
Jest to nadal wymagane , ALE React teraz upewnij się, że tworzysz elementy bez tworzenia dodatkowego elementu DOM.
Potrzebne jest dodatkowe opakowanie (zwykle z rodzicem
div
), ponieważcreateElement
metoda Reacts wymagatype
parametru, którym jesteither a tag name string (such as 'div' or 'span'), a React component type (a class or a function)
. Ale to było zanim wprowadzili ReactFragment
.Zapoznaj się z tym NOWYM dokumentem API dla createElement
oto oficjalny przykład, Refer React.Fragment .
źródło
Nie będziesz w stanie się tego pozbyć
div
elementu. React.render () musi zwrócić jeden prawidłowy węzeł DOM.źródło
Oto jeden ze sposobów renderowania „przezroczystych” komponentów:
źródło
Jest też obejście. Poniższy kod blokowy generuje fragment bez potrzeby React.Fragment.
źródło
Wiem, że odpowiedź na to pytanie została udzielona, możesz oczywiście użyć React.Fragment, który nie tworzy węzła, ale pozwala na grupowanie elementów takich jak div.
Dodatkowo, jeśli chcesz się dobrze bawić, możesz zaimplementować (i nauczyć się wielu rzeczy) tryb React, który usuwa dodatkowe elementy DIV. W tym celu naprawdę chcę udostępnić świetny film o tym, jak możesz to zrobić na samej bazie kodu React.
https://www.youtube.com/watch?v=aS41Y_eyNrU
Nie jest to oczywiście coś, co zrobiłbyś w praktyce, ale jest to dobra okazja do nauki.
źródło