Chcę móc przekazywać tekst za pomocą tagów HTML, na przykład:
<MyComponent text="This is <strong>not</strong> working." />
Ale wewnątrz MyComponent
metody renderowania, kiedy drukuję this.props.text
, to dosłownie wypisuje wszystko:
This is <strong>not</strong> working.
Czy jest jakiś sposób, aby React przeanalizował HTML i poprawnie go zrzucił?
<MyComponent>This is <strong>not</strong> working</MyComponent>
, zamiast przekazywania ich jako rekwizytów. Czy mógłbyś podać więcej kontekstu na temat tego, co faktycznie próbujesz osiągnąć?Odpowiedzi:
Możesz używać tablic mieszanych z ciągami znaków i elementami JSX (zobacz dokumentację tutaj ):
Jest tu skrzypce, które pokazuje, że działa: http://jsfiddle.net/7s7dee6L/
Ponadto w ostateczności zawsze masz możliwość wstawienia surowego kodu HTML, ale bądź ostrożny, ponieważ może to otworzyć cię na atak cross-site scripting (XSS), jeśli nie oczyszczasz wartości właściwości.
źródło
{text.map( textOrHTML, index) => <span key={index}>{textOrHTML}</span> )}
Chociaż jest to tak dziwne, że musimy to zrobić w całości.key="[some unique value]"
na<strong>
elemencie.<MyComponent text={<>This is <strong>not</strong> working.</>} />
W rzeczywistości jest na to wiele sposobów.
Chcesz użyć JSX w swoich rekwizytach
Możesz po prostu użyć {}, aby JSX przeanalizował parametr. Jedyne ograniczenie jest takie samo jak w przypadku każdego elementu JSX: musi zwracać tylko jeden element główny.
Najlepszym czytelnym sposobem na to jest utworzenie funkcji renderMyProp, która zwróci komponenty JSX (tak jak standardowa funkcja renderująca), a następnie po prostu wywołaj myProp = {this.renderMyProp ()}
Chcesz przekazać tylko HTML jako ciąg
Domyślnie JSX nie pozwala na renderowanie surowego kodu HTML z wartości ciągów. Jest jednak sposób, aby to zrobić:
Następnie w swoim komponencie możesz go użyć w ten sposób:
Należy pamiętać, że to rozwiązanie „może” otwierać się w przypadku ataków fałszerstw opartych na skryptach między witrynami. Uważaj również, że możesz renderować tylko prosty HTML, bez znacznika lub komponentu JSX ani innych fantazyjnych rzeczy.
Sposób tablicy
W reakcji możesz przekazać tablicę elementów JSX. To znaczy:
Nie polecałbym tej metody, ponieważ:
Droga dzieci
Dodając to ze względu na kompletność, ale w odpowiedzi możesz również uzyskać wszystkie dzieci, które są „wewnątrz” twojego komponentu.
Więc jeśli wezmę następujący kod:
Wtedy te dwa elementy div będą dostępne jako this.props.children w SomeComponent i mogą być renderowane przy użyciu standardowej składni {}.
To rozwiązanie jest idealne, gdy masz tylko jedną treść HTML do przekazania do swojego komponentu (wyobraź sobie komponent Popin, który przyjmuje tylko zawartość Popina jako dzieci).
Jeśli jednak masz wiele treści, nie możesz używać dzieci (lub musisz przynajmniej połączyć to z innym rozwiązaniem tutaj)
źródło
this.props.children
. Bez 's' awarejs.org/docs/glossary.html#propschildrenMożesz użyć niebezpiecznie SetInnerHTML
Po prostu wyślij kod HTML jako zwykły ciąg znaków
I renderuj w kodzie JSX w ten sposób:
Uważaj tylko, jeśli renderujesz dane wprowadzone przez użytkownika. Możesz być ofiarą ataku XSS
Oto dokumentacja: https://facebook.github.io/react/tips/dangerously-set-inner-html.html
źródło
a następnie w swoim komponencie możesz sprawdzić właściwości w następujący sposób:
Upewnij się, że wybrałeś tylko jeden typ rekwizytu.
źródło
Od React v16.02 możesz użyć fragmentu.
Więcej informacji: https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html
źródło
U mnie to działało, przekazując tag HTML w rekwizytach dzieci
źródło
W aplikacji reagującej po stronie klienta istnieje kilka sposobów renderowania właściwości jako ciągu znaków z pewnym kodem HTML. Jeden bezpieczniejszy niż drugi ...
1 - Zdefiniuj prop jako jsx (moje preferencje)
• Jedynym wymaganiem jest tutaj to, że każdy plik, który generuje tę właściwość, musi zawierać zależność React (w przypadku, gdy generujesz plik jsx właściwości w pliku pomocniczym itp.).
2 - Niebezpiecznie ustaw plik innerHtml
• To drugie podejście jest odradzane. Wyobraź sobie pole wejściowe, którego wartość wejściowa jest renderowana jako właściwość w tym komponencie. Użytkownik mógłby wprowadzić znacznik skryptu w danych wejściowych, a komponent, który renderuje te dane wejściowe, wykonałby ten potencjalnie złośliwy kod. W związku z tym takie podejście może potencjalnie wprowadzić luki w zabezpieczeniach skryptów między witrynami. Aby uzyskać więcej informacji, zapoznaj się z oficjalną dokumentacją React
źródło
Ustaw typ właściwości tekstu na dowolny i wykonaj następujące czynności:
Przykład
źródło
Możesz to zrobić na dwa znane mi sposoby.
1-
<MyComponent text={<p>This is <strong>not</strong> working.</p>} />
A potem zrób to
Lub drugie podejście zrób to w ten sposób
2-
<MyComponent><p>This is <strong>not</strong> working.</p><MyComponent/>
A potem zrób to
źródło
let vhtml = "<p>Test</p>"
i użyłem jej w rekwizycie w tentext={vhtml}
sposób, ale z jakiegoś powodu nadal jest renderowana jako zwykły tekst.@matagus odpowiedź jest dla mnie w porządku, mam nadzieję, że poniższy fragment jest pomocny tym, którzy chcą użyć zmiennej w środku.
źródło
W moim projekcie musiałem przekazać dynamiczny fragment kodu HTML ze zmiennej i wyrenderować go wewnątrz komponentu. Więc zrobiłem co następuje.
Obiekt defaultSelection jest przekazywany do komponentu z
.js
plikuKomponent HtmlSnippet
Przykład Plunkr
zareaguj doc na niebezpiecznieSetInnerHTML
źródło
Możesz również użyć funkcji na komponencie, aby przekazać plik jsx do właściwości. lubić:
źródło
Tak, możesz to zrobić, używając tablicy mix z ciągami znaków i elementami JSX. odniesienie
źródło
Parser z html -active-parser to dobre rozwiązanie. Ty po prostu musisz
zadzwoń z:
i działa dobrze.
źródło
Dodając do odpowiedzi: Jeśli zamierzasz parsować i jesteś już w JSX, ale masz obiekt z zagnieżdżonymi właściwościami, bardzo eleganckim sposobem jest użycie nawiasów w celu wymuszenia parsowania JSX:
źródło
To pytanie ma już wiele odpowiedzi, ale zrobiłem coś złego w związku z tym i myślę, że warto się nim podzielić:
Miałem coś takiego:
ale masaż był dłuższy, więc spróbowałem użyć czegoś takiego:
Zajęło mi trochę czasu, zanim zdałem sobie sprawę, że brakuje mi () w wywołaniu funkcji.
Nie działa
Pracujący
może to ci pomoże, tak jak mnie!
źródło
Możesz z powodzeniem wykorzystać fragmenty Reacta do tego zadania. W zależności od wersji używanego React, można użyć składni: krótkie
<>
lub pełną tag:<React.Fragment>
. Działa szczególnie dobrze, jeśli nie chcesz zawijać całego ciągu w znaczniki HTML.źródło
W ten sposób możemy zrobić to samo.
teraz chcesz wysłać ten kod HTML do innego komponentu, którego nazwa to komponent nadrzędny.
Dzwonię: -
Korzystanie z dziecka: -
ta praca jest dla mnie idealna.
źródło
Dołączyły kod HTML w module componentDidMount przy użyciu jQuery append. To powinno rozwiązać problem.
źródło