Jadi apakah ini satu-satunya cara untuk membuat html mentah dengan reactjs?
// 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>
);
}
});
Saya tahu ada beberapa cara keren untuk menandai barang dengan JSX, tapi saya terutama tertarik untuk dapat membuat html mentah (dengan semua kelas, gaya inline, dll.). Sesuatu yang rumit seperti ini:
<!-- 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>
Saya tidak ingin harus menulis ulang semua itu di BEJ.
Mungkin saya salah memikirkan semua ini. Tolong perbaiki saya.
javascript
reactjs
vinhboy
sumber
sumber
Jawaban:
Anda dapat memanfaatkan
html-to-react
modul npm.Catatan: Saya penulis modul dan baru saja menerbitkannya beberapa jam yang lalu. Silakan melaporkan masalah bug atau kegunaan.
sumber
Sekarang ada metode yang lebih aman untuk membuat HTML. Saya membahas hal ini dalam jawaban sebelumnya di sini . Anda memiliki 4 opsi, penggunaan terakhir
dangerouslySetInnerHTML
.Metode rendering HTML
Paling mudah - Gunakan Unicode, simpan file sebagai UTF-8 dan atur
charset
ke UTF-8.<div>{'First · Second'}</div>
Aman - Gunakan nomor Unicode untuk entitas di dalam string Javascript.
<div>{'First \u00b7 Second'}</div>
atau
<div>{'First ' + String.fromCharCode(183) + ' Second'}</div>
Atau array campuran dengan elemen string dan JSX.
<div>{['First ', <span>·</span>, ' Second']}</div>
Last Resort - Masukkan HTML mentah menggunakan
dangerouslySetInnerHTML
.<div dangerouslySetInnerHTML={{__html: 'First · Second'}} />
sumber
dangerouslySetInnerHTML
selain __htmlSaya telah menggunakan ini dalam situasi yang cepat dan kotor:
sumber
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onload="alert('test');">
?Saya sudah mencoba komponen murni ini:
fitur
className
prop (lebih mudah untuk bergaya)\n
ke<br />
(Anda sering ingin melakukan itu)<RawHTML>{myHTML}</RawHTML>
Saya telah menempatkan komponen dalam Gist di Github: RawHTML: komponen murni ReactJS untuk membuat HTML
sumber
sumber
dangerouslySetInnerHTML adalah Bereaksi pengganti untuk menggunakan innerHTML di DOM browser. Secara umum, pengaturan HTML dari kode berisiko karena mudah untuk secara tidak sengaja mengekspos pengguna Anda terhadap serangan lintas situs (XSS).
Lebih baik / lebih aman untuk membersihkan HTML mentah Anda (menggunakan misalnya, DOMPurify) sebelum menyuntikkannya ke DOM via
dangerouslySetInnerHTML
.DOMPurify - pembersih XSS hanya DOM, super cepat, tahan uber untuk HTML, MathML, dan SVG. DOMPurify berfungsi dengan default yang aman, tetapi menawarkan banyak konfigurasi dan pengait.
Contoh :
sumber
Saya menggunakan perpustakaan ini yang disebut Parser . Itu bekerja untuk apa yang saya butuhkan.
sumber
dangerouslySetInnerHTML
tidak boleh digunakan kecuali benar-benar diperlukan. Menurut dokumen, "Ini terutama untuk bekerja sama dengan perpustakaan manipulasi string DOM" . Ketika Anda menggunakannya, Anda melepaskan manfaat dari manajemen DOM React.Dalam kasus Anda, cukup mudah untuk mengkonversi ke sintaks JSX yang valid; cukup ubah
class
atribut menjadiclassName
. Atau, seperti yang disebutkan dalam komentar di atas, Anda dapat menggunakan perpustakaan ReactBootstrap yang merangkum elemen Bootstrap ke dalam komponen Bereaksi.sumber
Ini adalah versi yang sedikit kurang dipuji dari fungsi RawHTML yang diposting sebelumnya. Ini memungkinkan Anda:
<br />
'sRawHTML></RawHTML>
)Inilah komponennya:
Pemakaian:
Keluaran:
Itu akan pecah pada:
sumber
Saya perlu menggunakan tautan dengan atribut onLoad di kepala saya di mana div tidak diizinkan sehingga ini membuat saya sangat kesakitan. Solusi saya saat ini adalah menutup tag skrip asli, melakukan apa yang perlu saya lakukan, lalu membuka tag skrip (ditutup oleh yang asli). Semoga ini bisa membantu seseorang yang sama sekali tidak punya pilihan lain:
sumber