Reactjs แปลงสตริง html เป็น jsx


212

ฉันมีปัญหาในการจัดการกับ ReactJS ของ Facebook เมื่อใดก็ตามที่ฉันทำ Ajax และต้องการแสดงข้อมูล html ReactJS จะแสดงเป็นข้อความ (ดูรูปด้านล่าง)

ReactJS แสดงผลสตริง

ข้อมูลจะแสดงผ่านฟังก์ชันการเรียกกลับที่สำเร็จของ jquery Ajax

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

ป้อนคำอธิบายรูปภาพที่นี่

มีวิธีง่าย ๆ ในการแปลงเป็น html หรือไม่ ฉันควรทำอย่างไรโดยใช้ ReactJS

คำตอบ:


406

โดยค่าเริ่มต้น React หนี HTML เพื่อป้องกันXSS (cross-site scripting) หากคุณต้องการแสดงผล HTML จริงๆคุณสามารถใช้dangerouslySetInnerHTMLคุณสมบัติ:

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

ตอบสนองต่อการบังคับใช้ไวยากรณ์ที่ยุ่งยากนี้โดยเจตนาเพื่อให้คุณไม่แสดงข้อความเป็น HTML โดยไม่ได้ตั้งใจและแนะนำบั๊ก XSS


4
ไวยากรณ์นี้แสดงในหน้าแรกและในบทช่วยสอน แต่ฉันเพิ่งรู้ว่ามันไม่ได้บันทึกไว้ที่อื่นดังนั้นฉันจึงยื่น# 413เพื่อแก้ไข
Sophie Alpert

แก้ไข! ฉันได้รับการแก้ไขอย่างนี้แล้วใช้ dangerouslySetInnerHTML แต่ขอบคุณแม้ว่า :)
ปีเตอร์ Wateber

การเล่นมันปลอดภัยที่จะทำให้เนื้อหาสะอาดโดยใช้sanitizeฟังก์ชั่นจากdompurifyแพ็คเกจ npm หากคุณได้รับข้อมูลนั้นจาก API ภายนอก
Barry Michael Doyle

77

ขณะนี้มีวิธีการที่ปลอดภัยกว่าเพื่อให้บรรลุเป้าหมายนี้ เอกสารได้รับการปรับปรุงด้วยวิธีการเหล่านี้

วิธีอื่น ๆ

  1. ง่ายที่สุด - ใช้ Unicode บันทึกไฟล์เป็น UTF-8 และตั้งค่าเป็นcharsetUTF-8

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

  2. ปลอดภัยยิ่งขึ้น - ใช้หมายเลข Unicode สำหรับเอนทิตีภายในสตริง Javascript

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

    หรือ

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

  3. หรืออาเรย์ผสมที่มีสตริงและองค์ประกอบ JSX

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

  4. ล่าสุดรีสอร์ท - แทรกดิบ HTML dangerouslySetInnerHTMLใช้

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


15
ฉันพร้อมเอกสาร แต่เกี่ยวกับสตริง HTML ที่ยาวเช่นหนึ่งจากโปรแกรมแก้ไขแบบ WYSIWYG? ฉันไม่เห็นว่าเราสามารถใช้วิธีที่ 1, 2 หรือ 3 ได้อย่างไร
ericn

4
ฉันเห็นด้วยกับ @eric วิธีการที่ดี 1-3 สำหรับการหลบหนีเนื้อหาที่เก็บไว้แล้วบางส่วนเช่นฐานข้อมูลคืออะไร? โปรดทราบด้วยว่าวิธีที่ 4 - วิธีเดียว - หมายความว่าคุณไม่สามารถเพิ่มโหนดลูก
dvdplm

14
ได้. ตัวอย่างเหล่านี้ที่มีเนื้อหา "แบบไดนามิก" ที่กำหนดค่าตายตัวไม่สมเหตุสมผลนัก
Regularmike

นี่คือ innerHTML ของฉัน - "กำลังแสดงผู้ดูแลระบบ \ u003cb \ u003e1 \ u0026nbsp; - \ u0026nbsp; 10 \ u003c / b \ u003e ของ \ u003cb \ u003e13 \ u003c / b \ u003e" ผู้ดูแลระบบ <b> 1 & nbsp; - & nbsp; 10 </b> จาก <b> 13 </b> โดยรวม " เมื่อฉันพยายามที่จะใช้เป็นอันตรายตั้งค่า HTML ภายในทุกสิ่งหยุดพัก
vipin8169

36

ผมขอแนะนำให้ใช้คลุกเคล้าสร้างขึ้นโดยmilesj มันเป็นปรากฎการณ์ห้องสมุดที่ใช้ตัวเลขหากเทคนิคอันชาญฉลาดในการแยกวิเคราะห์และแทรก HTML ลงใน DOM อย่างปลอดภัย

Interweave เป็นห้องสมุดโต้ตอบเพื่อแสดง HTML อย่างปลอดภัยคุณลักษณะตัวกรองคัดลอกข้อความอัตโนมัติด้วยโปรแกรมจับคู่แสดงอักขระอิโมจิและอีกมากมาย

  • Interweave เป็นห้องสมุดปฏิกิริยาที่แข็งแกร่งที่สามารถ:
    • แสดง HTML อย่างปลอดภัยโดยไม่ต้องใช้ harmlySetInnerHTML
    • ถอนแท็ก HTML อย่างปลอดภัย
    • XSS อัตโนมัติและการป้องกันการฉีด
    • ล้างแอตทริบิวต์ HTML โดยใช้ตัวกรอง
    • แก้ไขส่วนประกอบโดยใช้เครื่องมือจับคู่
    • URL อัตโนมัติ, IP, อีเมลและแฮชแท็ก
    • แสดงอักขระ Emoji และอิโมติคอน
    • และอีกมากมาย!

ตัวอย่างการใช้งาน:

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

คุณช่วยยกตัวอย่างการใช้งานได้ไหม
El Anonimo

1
@ElAnonimo ฉันได้เพิ่มตัวอย่างการใช้งาน หวังว่าจะทำให้สิ่งต่าง ๆ ชัดเจนขึ้น
Arman Nisch

1
ขอบคุณหนึ่งล้านคนคลุกเคล้าเป็นสิ่งที่ฉันต้องการ ไชโย
นิโคลัสแฮมิลตัน

1
เอกสารสำหรับสิ่งนี้ไม่เป็นประโยชน์ ฉันลองใช้ html ด้วยสองสามบรรทัดและฉันก็มีข้อความเต็มหน้าผิดพลาด มีใครบางคนมีตัวอย่างหรือแหล่งข้อมูลพร้อมเอกสารประกอบหรือไม่?
Tarun Kolla


6

ฉันพบซอ js นี้ มันใช้งานได้เช่นนี้

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


น่าเสียดายที่เอกสารไม่ทำงานบนการเรนเดอร์เซิร์ฟเวอร์
Laurent Van Winckel

อาจถ้าคุณทำimport JSDOM from 'jsdom'; global.window = new JSDOM('', { url: 'http://localhost' }); global.document = global.window.document;idk goodluck
Coty Embry



1

สำหรับผู้ที่ยังทำการทดลองอยู่ให้ติดตั้ง NPM react-html-parser

เมื่อฉันติดตั้งมันก็มีการดาวน์โหลด 123628 รายสัปดาห์

import ReactHtmlParser from 'react-html-parser'

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

0

คุณสามารถใช้สิ่งต่อไปนี้หากคุณต้องการแสดงผล html ดิบใน React

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

ตัวอย่าง - เรนเดอร์

การทดสอบเป็นวันที่ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.