TABLE OF CONTENTS

Hi 🤓 Cảm ơn bạn đã ghé thăm blog này, nếu những bài viết trên blog giúp ích cho bạn. Bạn có thể giúp blog hiển thị quảng cáo bằng cách tạm ngừng ad blocker 😫 và để giúp blog duy trì hoạt động nếu bạn muốn.
Cảm ơn bạn!

Intro

Xin chào các bạn, hôm nay mình sẽ giới thiệu đến các bạn một cách để thêm attribute target="_blank" trong React. Trong quá trình làm việc với React, mình có sử dụng thuộc tính dangerouslySetInnerHTML để set một văn bản HTML vào DOM.

Trong đoạn HTML đó có chứa các thẻ <a> chưa set thuộc tính target="_blank". Vậy làm cách nào để set thuộc tính này vào tất cả các thẻ <a> ? các bạn theo dõi tiếp nhé 😁

Giải pháp

Giả sử mình có một đoạn HTML và dùng thuộc tính dangerouslySetInnerHTML để set trực tiếp đoạn HTML này vào DOM.

import React from "react";

export default function Test() {
    const HTML =
        '<h2>Header</h2><a href="https://homiedev.com">My website!</a><footer>Footer!<a href="https://www.facebook.com/hiinav029">My facebook!</a></footer>';

    return <div dangerouslySetInnerHTML={{ __html: HTML }} />;
}

Kết quả sau khi render:

<div>
  <h2>Header</h2>
  <a href="https://homiedev.com">My website!</a>            
  <footer>Footer!
    <a href="https://www.facebook.com/hiinav029">My facebook!</a>
  </footer>
</div>

Mình tạo một đoạn string HTML và pass vào dangerouslySetInnerHTML một object với key là __html.

Trong biến HTML mình có tạo 2 thẻ <a> và không set thuộc tính target="_blank". Trong một vài trường hợp mà bạn nhận được một đoạn HTML bất kì và muốn tất cả các thẻ <a> có thuộc tính target="_blank" (bạn nào dùng gatsbymarkdown syntax sẽ rõ 😁).

Cách làm của mình như sau:

Mình sẽ tìm kiếm tất cả cả thẻ <a> bằng cách dùng regular expressions (regex). tìm hiểu regex tại đây

const links = /href/g;

Sau đó trong dangerouslySetInnerHTML mình dùng replace() method và truyền cho đối số thứ nhất là một biểu thức chính quy (biến links ), đối số thứ hai là giá trị muốn thay thế.

cont replace = `target="_blank" href`

dangerouslySetInnerHTML={{
  __html: HTML.replace(links,replace)
}}  

replace() method sẽ return về một chuỗi mới với giá trị bạn muốn thay thế.

Và đây là kết quả 😅

<div>
  <h2>Header</h2>
  <a target="_blank" href="https://homiedev.com">My website!</a>            
  <footer>Footer!
    <a target="_blank" href="https://www.facebook.com/hiinav029">My facebook!</a>
  </footer>
</div>

Kết Luận

Cuối cùng thì mình đã hướng dẫn xong cho các bạn cách để thêm thuộc tính target="_blank" khi dùng dangerouslySetInnerHTML trong React.

Lưu ý: việc sử dụng dangerouslySetInnerHTML một cách bất cẩn sẽ tạo ra các lỗ hổng XSS trong ứng dụng của bạn. Giải pháp ở đây là các bạn tìm hiểu về DOMPurify để giải quyết vấn đề trên nhé.

Mình xin kết bài ở đây ^^. Happy coding!

Có thể bạn thích ⚡
homiedev
About Me

Hi, I'm @devnav. Một người thích chia sẻ kiến thức, đặc biệt là về Frontend 🚀. Trang web này được tạo ra nhằm giúp các bạn học Frontend hiệu quả hơn 🎉😄.

Chúc các bạn tìm được kiến thức hữu ích trong blog này 😁😁.