Reactjs HTML dizesini jsx'e dönüştürür


212

Facebook ReactJS ile uğraşırken sorun yaşıyorum. Ne zaman ajax yapmak ve bir html veri görüntülemek istediğinizde, ReactJS bunu metin olarak görüntüler. (Aşağıdaki şekle bakın)

ReactJS oluşturma dizesi

Veriler, jquery Ajax'ın başarılı geri çağırma işlevi aracılığıyla görüntülenir.

$.ajax({
   url: url here,
   dataType: "json",
   success: function(data) {
      this.setState({
           action: data.action
      })
   }.bind(this)
});

resim açıklamasını buraya girin

Bunu html'ye dönüştürmenin kolay bir yolu var mı? ReactJS kullanarak nasıl yapmalıyım?

Yanıtlar:


406

Varsayılan olarak React, XSS'yi (Siteler arası komut dosyası oluşturma) önlemek için HTML'den kaçar . Gerçekten HTML oluşturmak istiyorsanız, dangerouslySetInnerHTMLözelliği kullanabilirsiniz :

<td dangerouslySetInnerHTML={{__html: this.state.actions}} />

React, bunu kasıtlı olarak hantal bir sözdizimini zorlar, böylece yanlışlıkla metni HTML olarak oluşturmaz ve XSS hataları sunmazsınız.


4
Bu sözdizimi ana sayfada ve öğreticide gösterilmektedir, ancak bunun başka bir yerde belgelenmediğini fark ettim, bu yüzden düzeltmek için # 413 dosyaladım .
Sophie Alpert

Doğru! Zaten tehlikeli kullanarak bunu
çözdümSetInnerHTML

Harici bir API'dan bu bilgiyi alıyorsanız , içeriği npm paketindeki sanitizeişlevi kullanarak sterilize etmek güvenli olmaya değer dompurify.
Barry Michael Doyle

77

Bunu başarmak için artık daha güvenli yöntemler var. Docs güncellendi bu yöntemlerle.

Öbür metodlar

  1. En kolay - Unicode'u kullanın, dosyayı UTF-8 olarak kaydedin ve UTF-8 olarak ayarlayın charset.

    <div>{'First · Second'}</div>

  2. Daha Güvenli - Bir Javascript dizesindeki varlık için Unicode numarasını kullanın.

    <div>{'First \u00b7 Second'}</div>

    veya

    <div>{'First ' + String.fromCharCode(183) + ' Second'}</div>

  3. Veya dizeleri ve JSX öğeleri içeren karışık bir dizi.

    <div>{['First ', <span>&middot;</span>, ' Second']}</div>

  4. Last Resort - kullanarak ham HTML ekleyin dangerouslySetInnerHTML.

    <div dangerouslySetInnerHTML={{__html: 'First &middot; Second'}} />


15
Belgeleri hazırladım ama WYSIWYG editöründen biri gibi uzun bir HTML dizesi hakkında? 1., 2. veya 3. yöntemi nasıl kullanabileceğimizi göremiyorum
ericn

4
@Eric ile hemfikirim. Zaten bir yerde depolanmış, örneğin bir DB, örneğin bir DB depolanmış için 1-3 yöntemleri ne işe yarar? Ayrıca, tek yöntem olan yöntem 4'ün alt düğüm ekleyemeyeceğiniz anlamına geldiğini unutmayın.
dvdplm

14
Evet. Sabit kodlanmış "dinamik" içeriğe sahip bu örnekler çok anlamlı değildir.
regularmike

Bu benim innerHTML'm - "\ u003cb \ u003e1 \ u0026nbsp; - \ u0026nbsp; toplamda 10 \ u003c / b \ u003e gösteriliyor" - "Gösteriliyor" yöneticileri <b> 1 & nbsp; - & nbsp; 10 </b> / toplam <b> 13 </b> ". DangerouslySetInnerHTML kullanmaya çalıştığımda, her şey bozuluyor.
vipin8169

36

Ben kullanmanızı tavsiye dokumak yarattığı milesj . HTML içine ayrıştırmak ve güvenli bir şekilde DOM içine HTML eklemek için bir akıllı teknikler bir sayı kullanan olağanüstü bir kütüphane.

Interweave, HTML'yi güvenle filtrelemek, nitelikleri filtrelemek, eşleştiricilerle otomatik kaydırma metni, emoji karakterleri oluşturmak ve çok daha fazlasını yapmak için bir reaksiyon kütüphanesidir.

  • Interweave şunları yapabilen sağlam bir React kütüphanesidir:
    • DangerouslySetInnerHTML kullanmadan HTML'yi güvenle oluşturun.
    • HTML etiketlerini güvenle çıkarın.
    • Otomatik XSS ve enjeksiyon koruması.
    • Filtreleri kullanarak HTML niteliklerini temizleyin.
    • Eşleştiriciler kullanarak bileşenleri enterpolasyonlayın.
    • URL'leri, IP'leri, e-postaları ve hashtag'leri otomatik olarak bağlayın.
    • Emoji ve ifade karakterleri oluşturun.
    • Ve daha fazlası!

Kullanım Örneği:

import React from 'react';
import { Markup } from 'interweave';

const articleContent = "<p><b>Lorem ipsum dolor laboriosam.</b> </p><p>Facere debitis impedit doloremque eveniet eligendi reiciendis <u>ratione obcaecati repellendus</u> culpa? Blanditiis enim cum tenetur non rem, atque, earum quis, reprehenderit accusantium iure quas beatae.</p><p>Lorem ipsum dolor sit amet <a href='#testLink'>this is a link, click me</a> Sunt ducimus corrupti? Eveniet velit numquam deleniti, delectus  <ol><li>reiciendis ratione obcaecati</li><li>repellendus culpa? Blanditiis enim</li><li>cum tenetur non rem, atque, earum quis,</li></ol>reprehenderit accusantium iure quas beatae.</p>"

<Markup content={articleContent} /> // this will take the articleContent string and convert it to HTML markup. See: https://milesj.gitbook.io/interweave


//to install package using npm, execute the command
npm install interweave

Lütfen bir kullanım örneği verebilir misiniz?
El Anonimo

1
@ElAnonimo Bir kullanım örneği ekledim. Umarım bu işleri biraz daha açık hale getirir.
Arman Nisch

1
Bir milyon teşekkürler, interweave tam olarak ihtiyacım olan şey. Şerefe.
Nicholas Hamilton

1
Bunun için belgeler yararlı değildir. Ayrıca html birkaç satır ile denedim ve hata mesajları dolu bir sayfa vardı. Birinin belgelere sahip örnekleri veya kaynakları var mı?
Tarun Kolla

8
npm i html-react-parser;

import Parser from 'html-react-parser';

<td>{Parser(this.state.archyves)}</td>

6

Bu js keman buldum. bu böyle çalışıyor

function unescapeHTML(html) {
    var escapeEl = document.createElement('textarea');
    escapeEl.innerHTML = html;
    return escapeEl.textContent;
}

<textarea className="form-control redactor"
                          rows="5" cols="9"
                          defaultValue={unescapeHTML(this.props.destination.description)}
                          name='description'></textarea>

jsfiddle bağlantısı


Maalesef belge sunucu oluşturmada çalışmıyor.
Laurent Van Winckel

import JSDOM from 'jsdom'; global.window = new JSDOM('', { url: 'http://localhost' }); global.document = global.window.document;Idk goodluck yaparsanız olabilir
Coty Embry

2

Ayrıca html-tepki-ayrıştırıcıdan Parser () öğesini de kullanabilirsiniz. Ben de aynısını kullandım. Bağlantı paylaşıldı.


2

reakt-html-ayrıştırıcı adlı npm paketi kullanmaya başladım


1

Hala deneyenler için npm install tepki-html-ayrıştırıcı

Yüklediğimde haftalık 123628 indirme yapıldı.

import ReactHtmlParser from 'react-html-parser'

<div>{ReactHtmlParser(htmlString)}</div>

0

React'te raw html oluşturmak istiyorsanız aşağıdakileri kullanabilirsiniz

<div dangerouslySetInnerHTML={{__html: `html-raw-goes-here`}} />

Örnek - Oluştur

Test güzel bir gün

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.