Reactjs chuyển đổi chuỗi html sang jsx


212

Tôi đang gặp sự cố khi xử lý ReactJS của facebook. Bất cứ khi nào tôi làm ajax và muốn hiển thị dữ liệu html, ReactJS sẽ hiển thị dưới dạng văn bản. (Xem hình bên dưới)

Chuỗi kết xuất ReactJS

Dữ liệu được hiển thị thông qua chức năng gọi lại thành công của Ajax jquery.

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

nhập mô tả hình ảnh ở đây

Có cách nào dễ dàng để chuyển đổi nó thành html không? Tôi nên làm thế nào khi sử dụng ReactJS?

Câu trả lời:


405

Theo mặc định, React thoát khỏi HTML để ngăn XSS (kịch bản chéo trang) . Nếu bạn thực sự muốn kết xuất HTML, bạn có thể sử dụng thuộc dangerouslySetInnerHTMLtính:

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

React buộc cú pháp rườm rà có chủ ý này để bạn không vô tình kết xuất văn bản dưới dạng HTML và giới thiệu các lỗi XSS.


4
Cú pháp này được hiển thị trên trang chủ và trong hướng dẫn, nhưng tôi chỉ nhận ra rằng nó không được ghi lại ở bất kỳ nơi nào khác nên tôi chỉ nộp # 413 để sửa.
Sophie Alpert

Chính xác! Tôi đã giải quyết vấn đề này bằng cách sử dụng một cách nguy hiểm
SetInnerHTML

Thật đáng để chơi an toàn khi vệ sinh nội dung bằng cách sử dụng sanitizechức năng từ dompurifygói npm nếu bạn nhận được thông tin đó từ API bên ngoài.
Barry Michael Doyle

77

Hiện nay có các phương pháp an toàn hơn để thực hiện điều này. Các tài liệu đã được cập nhật với các phương pháp này.

Các phương pháp khác

  1. Dễ nhất - Sử dụng Unicode, lưu tệp dưới dạng UTF-8 và đặt thành charsetUTF-8.

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

  2. An toàn hơn - Sử dụng số Unicode cho thực thể bên trong chuỗi Javascript.

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

    hoặc là

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

  3. Hoặc một mảng hỗn hợp với các chuỗi và các phần tử JSX.

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

  4. Phương sách cuối cùng - Chèn HTML thô bằng cách sử dụng dangerouslySetInnerHTML.

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


15
Tôi đã sẵn sàng tài liệu nhưng về một chuỗi HTML dài, chẳng hạn như một chuỗi từ trình soạn thảo WYSIWYG? Tôi không thể thấy làm thế nào chúng ta có thể sử dụng phương pháp 1, 2 hoặc 3
ericn

4
Tôi đồng ý với @eric. Phương pháp 1-3 nào tốt cho nội dung đã thoát được lưu trữ ở đâu đó, ví dụ như DB? Cũng lưu ý rằng phương pháp 4 - phương thức duy nhất - có nghĩa là bạn không thể thêm các nút con.
dvdplm

14
Vâng Những ví dụ với nội dung "động" được mã hóa cứng này không có nhiều ý nghĩa.
chỉnh

Đây là phần bên trong của tôi - "Hiển thị quản trị viên \ u003cb \ u003e1 \ u0026nbsp; - \ u0026nbsp; quản trị viên <b> 1 & nbsp; - & nbsp; 10 </ b> trong tổng số <b> 13 </ b> ". Khi tôi cố gắng sử dụng một cách nguy hiểm SetInnerHTML, mọi thứ sẽ bị hỏng.
vipin8169

36

Tôi khuyên bạn nên sử dụng interweave tạo ra bởi milesj . Đây là một thư viện hiện tượng sử dụng một số nếu các kỹ thuật khéo léo để phân tích cú pháp và chèn HTML vào DOM một cách an toàn.

Interweave là một thư viện phản ứng để kết xuất HTML một cách an toàn, các thuộc tính bộ lọc, văn bản tự động với các công cụ đối sánh, kết xuất các ký tự biểu tượng cảm xúc và nhiều hơn nữa.

  • Interweave là một thư viện React mạnh mẽ có thể:
    • Kết xuất HTML một cách an toàn mà không cần sử dụng nguy hiểm SetInnerHTML.
    • Tháo thẻ HTML an toàn.
    • XSS tự động và bảo vệ tiêm.
    • Làm sạch các thuộc tính HTML bằng các bộ lọc.
    • Nội suy các thành phần bằng cách sử dụng khớp.
    • Tự động điền URL, IP, email và hashtag.
    • Kết xuất biểu tượng cảm xúc và biểu tượng cảm xúc.
    • Và nhiều hơn nữa!

Ví dụ sử dụng:

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

Bạn có thể cung cấp một ví dụ sử dụng xin vui lòng?
El Anonimo

1
@ElAnonimo Tôi đã thêm một ví dụ sử dụng. Hy vọng rằng làm cho mọi thứ rõ ràng hơn một chút.
Arman Nisch

1
Cảm ơn một triệu, đan xen chính xác là những gì tôi cần. Chúc mừng.
Nicholas Hamilton

1
Các tài liệu cho việc này là không hữu ích. Ngoài ra tôi đã thử với một vài dòng html và tôi có một trang chứa đầy các thông báo lỗi. Có ai có ví dụ hoặc bất kỳ tài nguyên với tài liệu?
Tarun Kolla

8
npm i html-react-parser;

import Parser from 'html-react-parser';

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

6

tôi tìm thấy fs js này. cái này hoạt động như thế này

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>

liên kết jsfiddle


Thật không may, tài liệu không hoạt động trên kết xuất máy chủ.
Laurent Van Winckel

Nó có thể nếu bạn làm import JSDOM from 'jsdom'; global.window = new JSDOM('', { url: 'http://localhost' }); global.document = global.window.document;idk goodluck
Coty Embry

2

Bạn cũng có thể sử dụng Parser () từ html-Reac-Parser. Tôi đã sử dụng tương tự. Liên kết chia sẻ.


2

tôi bắt đầu sử dụng gói npm có tên Reac-html-Parser


1

Đối với những người vẫn đang thử nghiệm, npm cài đặt Reac-html-Parser

Khi tôi cài đặt, nó có 123628 lượt tải hàng tuần.

import ReactHtmlParser from 'react-html-parser'

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

0

Bạn có thể sử dụng như sau nếu bạn muốn kết xuất html thô trong React

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

Ví dụ - Kết xuất

Kiểm tra là một ngày tốt

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.