Czy jest to więc jedyny sposób renderowania surowego html za pomocą reagjs?
// http://facebook.github.io/react/docs/tutorial.html
// tutorial7.js
var converter = new Showdown.converter();
var Comment = React.createClass({
render: function() {
var rawMarkup = converter.makeHtml(this.props.children.toString());
return (
<div className="comment">
<h2 className="commentAuthor">
{this.props.author}
</h2>
<span dangerouslySetInnerHTML={{__html: rawMarkup}} />
</div>
);
}
});
Wiem, że jest kilka fajnych sposobów na oznaczanie rzeczy w JSX, ale interesuje mnie głównie możliwość renderowania surowego HTML (ze wszystkimi klasami, stylami wbudowanymi itp.). Coś tak skomplikowanego:
<!-- http://getbootstrap.com/components/#dropdowns-example -->
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
Dropdown
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li>
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li>
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Separated link</a></li>
</ul>
</div>
Nie chciałbym tego wszystkiego przepisywać w JSX.
Może źle o tym myślę. Proszę mnie poprawić.
javascript
reactjs
Vinhboy
źródło
źródło
Odpowiedzi:
Możesz wykorzystać
html-to-react
moduł npm.Uwaga: jestem autorem modułu i właśnie go opublikowałem kilka godzin temu. Prosimy o zgłaszanie wszelkich błędów lub problemów z użytecznością.
źródło
Istnieją teraz bezpieczniejsze metody renderowania HTML. Omówiłem to w poprzedniej odpowiedzi tutaj . Masz 4 opcje, ostatnie zastosowania
dangerouslySetInnerHTML
.Metody renderowania HTML
Najłatwiej - użyj Unicode, zapisz plik jako UTF-8 i ustaw na
charset
UTF-8.<div>{'First · Second'}</div>
Bezpieczniej - użyj numeru Unicode dla jednostki wewnątrz ciągu JavaScript.
<div>{'First \u00b7 Second'}</div>
lub
<div>{'First ' + String.fromCharCode(183) + ' Second'}</div>
Lub mieszana tablica z ciągami znaków i elementami JSX.
<div>{['First ', <span>·</span>, ' Second']}</div>
Ostatnia deska ratunku - wstaw surowy kod HTML, używając
dangerouslySetInnerHTML
.<div dangerouslySetInnerHTML={{__html: 'First · Second'}} />
źródło
dangerouslySetInnerHTML
oprócz __htmlUżywałem tego w szybkich i brudnych sytuacjach:
źródło
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onload="alert('test');">
?Wypróbowałem ten czysty składnik:
cechy
className
rekwizyt (łatwiej go stylizować)\n
na<br />
(często chcesz to zrobić)<RawHTML>{myHTML}</RawHTML>
Umieściłem komponent w Gist na Github: RawHTML: ReactJS czysty komponent do renderowania HTML
źródło
źródło
niebezpiecznieSetInnerHTML jest zamiennikiem Reacta dla używania innerHTML w DOM przeglądarki. Ogólnie rzecz biorąc, ustawienie kodu HTML z kodu jest ryzykowne, ponieważ łatwo jest nieumyślnie narazić użytkowników na atak typu cross-site scripting (XSS).
Lepiej / bezpieczniej jest oczyścić surowy HTML (używając np. DOMPurify) przed wstrzyknięciem go do DOM poprzez
dangerouslySetInnerHTML
.DOMPurify - superszybki, uber-tolerancyjny sanitizer XSS tylko dla DOM dla HTML, MathML i SVG. DOMPurify działa z bezpieczną wartością domyślną, ale oferuje wiele możliwości konfiguracji i zaczepów.
Przykład :
źródło
Użyłem tej biblioteki o nazwie Parser . To działało na to, czego potrzebowałem.
źródło
dangerouslySetInnerHTML
nie powinny być używane, chyba że jest to absolutnie konieczne. Zgodnie z dokumentacją „To jest głównie do współpracy z bibliotekami do manipulacji napisami DOM” . Kiedy go używasz, rezygnujesz z zalet zarządzania DOM w React.W twoim przypadku konwersja do poprawnej składni JSX jest całkiem prosta; po prostu zmień
class
atrybuty naclassName
. Lub, jak wspomniano w komentarzach powyżej, możesz użyć biblioteki ReactBootstrap, która hermetyzuje elementy Bootstrap w komponenty React.źródło
Oto trochę mniej uparta wersja funkcji RawHTML opublikowana wcześniej. Umożliwia:
<br />
jestRawHTML></RawHTML>
)Oto składnik:
Stosowanie:
Wynik:
Zepsuje się:
źródło
Musiałem użyć linku z atrybutem onLoad w mojej głowie, gdzie div jest niedozwolony, więc spowodowało to znaczny ból. Moje obecne obejście polega na zamknięciu oryginalnego tagu script, zrobieniu tego, co trzeba, a następnie otwarciu tagu script (do zamknięcia przez oryginał). Mam nadzieję, że może to pomóc komuś, kto nie ma absolutnie innego wyboru:
źródło