Czy istnieje sposób na przekazanie jednego składnika do drugiego reagującego składnika? Chcę utworzyć model reagujący komponent i przekazać inny komponent reagujący, aby przetłumaczyć tę treść.
Edycja: Oto codepen reagJS ilustrujący to, co próbuję zrobić. http://codepen.io/aallbrig/pen/bEhjo
HTML
<div id="my-component">
<p>Hi!</p>
</div>
ReactJS
/**@jsx React.DOM*/
var BasicTransclusion = React.createClass({
render: function() {
// Below 'Added title' should be the child content of <p>Hi!</p>
return (
<div>
<p> Added title </p>
{this.props.children}
</div>
)
}
});
React.renderComponent(BasicTransclusion(), document.getElementById('my-component'));
javascript
reactjs
Andrew Allbright
źródło
źródło
this.props.children
jest częścią interfejsu API i oczekuje się, że będzie używany w ten sposób. Przykłady zespołu React wykorzystują tę technikę, na przykład podczas przenoszenia rekwizytów i mówienia o jednym dziecku .Uwaga I pod warunkiem odpowiedzi bardziej szczegółowe tutaj
Opakowanie środowiska wykonawczego:
To najbardziej idiomatyczny sposób.
Zauważ, że
children
jest to „specjalna rekwizyt” w React, a powyższy przykład to cukier składniowy i jest (prawie) równoważny z<Wrapper children={<App/>}/>
Opakowanie inicjujące / HOC
Możesz użyć komponentu wyższego rzędu (HOC). Zostały ostatnio dodane do oficjalnego dokumentu .
Może to prowadzić do (niewielkiej) lepszej wydajności, ponieważ komponent otoki może zwierać renderowanie o krok do przodu za pomocą funkcji shouldComponentUpdate, podczas gdy w przypadku otoki środowiska wykonawczego rekwizyt podrzędny prawdopodobnie będzie zawsze innym ReactElement i spowoduje ponowne renderowanie nawet jeśli twoje komponenty rozszerzają PureComponent.
Zauważ, że
connect
Redux był opakowaniem środowiska wykonawczego, ale został zmieniony na HOC, ponieważ pozwala uniknąć niepotrzebnych ponownych renderowań, jeśli użyjesz tejpure
opcji (domyślnie jest to prawda)Nigdy nie powinieneś wywoływać HOC podczas fazy renderowania, ponieważ tworzenie komponentów React może być kosztowne. Powinieneś raczej wywoływać te opakowania podczas inicjalizacji.
Należy zauważyć, że podczas korzystania z funkcjonalnych komponentów, takich jak powyżej, wersja HOC nie zapewnia żadnej użytecznej optymalizacji, ponieważ bezstanowe funkcjonalne komponenty nie są implementowane
shouldComponentUpdate
Więcej wyjaśnień tutaj: https://stackoverflow.com/a/31564812/82609
źródło
źródło
Facebook zaleca użycie komponentu bezstanowego Źródło: https://facebook.github.io/react/docs/reusable-components.html
źródło
Możesz przekazać to jako normalną rekwizyt:
foo={<ComponentOne />}
Na przykład:
źródło
Wolę używać wbudowanego interfejsu API React:
następnie możesz zastąpić div otoki co chcesz:
źródło
Możesz przekazać komponent przez. rekwizyty i renderuj je z interpolacją.
Następnie przekażesz
prop
wywołaniechild
, które będzie składnikiem React.źródło
this.props.children
zgodnie z sugestią zawartą w innej odpowiedzi, możesz napisać dzieci jako dzieci zamiast attrs.<div child={this.props.child />
.React.DOM.div
, podobnie jak wszystkie podstawowe komponenty, korzysta zchildren
tablicy. Zobacz, jak jest używany w twoimHello
komponencie, korzysta już z wielu dzieci.Późno do gry, ale tutaj jest potężny wzorzec HOC do przesłonięcia elementu przez zapewnienie go jako rekwizytu. To proste i eleganckie.
Załóżmy, że
MyComponent
renderuje element fikcyjnyA
, ale chcesz zezwolić na niestandardowe zastąpienieA
, w tym przykładzieB
, które otaczaA
a,<div>...</div>
a także dołącza „!” do propa tekstu:źródło
W rzeczywistości Twoim pytaniem jest, jak napisać komponent wyższego rzędu (HOC). Głównym celem korzystania z HOC jest zapobieganie wklejaniu kopii. Możesz napisać swój HOC jako czysto funkcjonalny komponent lub jako klasę. Oto przykład:
Jeśli chcesz napisać komponent nadrzędny jako komponent oparty na klasach:
Jeśli chcesz napisać swojego rodzica jako komponent funkcjonalny:
źródło
Oto przykład nadrzędnego komponentu List reaguj, a rekwizyty zawierają element reagujący. W tym przypadku przekazywany jest tylko jeden składnik reagujący Link (jak widać w renderowaniu dom).
źródło
Tak, możesz to zrobić za pomocą rekwizytów, możesz przekazać dane komponentu jako obiekt, np. Rekwizyty, a następnie wewnątrz komponentu możesz zaimportować inny komponent i dynamicznie powiązać z danymi prpps. czytaj więcej o komponencie reagującym
źródło