ToolDeck

Chuyển Đổi HTML sang JSX

Chuyển HTML sang JSX cho React — class→className, chuỗi style→object

Thử ví dụ

HTML Đầu Vào

Kết Quả JSX

Chạy cục bộ · An toàn để dán thông tin bí mật
Kết quả JSX sẽ hiện ở đây…

Chuyển Đổi HTML sang JSX là gì?

Chuyển đổi HTML sang JSX là quá trình biến đổi mã HTML thông thường thành cú pháp JSX mà các component React có thể render. JSX trông giống HTML nhưng tuân theo quy ước đặt tên và quy tắc của JavaScript. Các thuộc tính như class trở thành className, for trở thành htmlFor, và chuỗi style nội tuyến được thay thế bằng object JavaScript. Những thay đổi này là bắt buộc vì JSX biên dịch thành các lời gọi React.createElement(), trong đó tên thuộc tính phải khớp với tên thuộc tính của DOM API thay vì tên thuộc tính HTML.

Sự ánh xạ giữa các thuộc tính HTML và JSX prop được định nghĩa trong tài liệu DOM elements của React. React sử dụng camelCase cho các thuộc tính nhiều từ (tabindex trở thành tabIndex, maxlength trở thành maxLength) vì các định danh JavaScript không thể chứa dấu gạch ngang. Các thẻ tự đóng như <img>, <br> và <input> phải có dấu gạch chéo ở cuối trong JSX (<img />) vì JSX tuân theo quy tắc XML, trong đó mọi thẻ phải được đóng rõ ràng.

htmlToJsxContent.whatBody3

Tại sao dùng Công Cụ Chuyển Đổi HTML sang JSX?

Đổi tên thuộc tính và viết lại chuỗi style thủ công trên hàng chục phần tử HTML vừa chậm vừa dễ mắc lỗi. Công cụ chuyển đổi xử lý mọi biến đổi cùng một lúc, cho phép bạn dán HTML từ bất kỳ nguồn nào và nhận JSX hợp lệ chỉ trong vài giây.

Chuyển Đổi Tức Thì
Dán bất kỳ đoạn HTML nào và nhận kết quả JSX ngay lập tức. Công cụ xử lý class, for, style, event handler, thuộc tính boolean và thẻ tự đóng trong một lần duy nhất.
🔒
Xử Lý Ưu Tiên Quyền Riêng Tư
Toàn bộ quá trình chuyển đổi chạy cục bộ trong trình duyệt của bạn. HTML của bạn không bao giờ rời khỏi trang, vì vậy bạn có thể an toàn chuyển đổi mã đánh dấu chứa mã nội bộ, API endpoint hoặc nội dung nhạy cảm.
📋
Không Cần Tài Khoản Hay Cài Đặt
Mở trang và bắt đầu chuyển đổi ngay. Không cần đăng nhập, không cần cài gói npm, không cần cấu hình bước build. Hoạt động trên mọi thiết bị có trình duyệt hiện đại.
🔧
Bao Phủ Đầy Đủ Thuộc Tính
Chuyển đổi tất cả các ánh xạ thuộc tính HTML-sang-JSX tiêu chuẩn bao gồm className, htmlFor, tabIndex, readOnly, autoComplete và hơn 20 thuộc tính khác. Cũng xử lý việc đổi tên event handler từ onclick thành onClick.

Các Trường Hợp Sử Dụng Chuyển Đổi HTML sang JSX

Nhà phát triển frontend: di chuyển template
Khi chuyển một trang HTML hoặc component hiện có vào dự án React, hãy dán mã đánh dấu vào công cụ chuyển đổi thay vì tự tay tìm kiếm các thuộc tính class và for trên hàng trăm dòng.
Kỹ sư backend: nhúng email HTML
Các template email được viết bằng HTML thuần. Khi render chúng trong dashboard quản trị React hoặc component xem trước, hãy chuyển đổi HTML sang JSX hợp lệ để tránh lỗi cú pháp className và style.
DevOps: chuyển đổi widget dashboard
Các dashboard giám sát thường dùng đoạn HTML cho các widget tùy chỉnh. Chuyển đổi chúng sang JSX khi tích hợp vào nền tảng công cụ nội bộ dựa trên React như Retool hoặc panel quản trị tùy chỉnh.
Kỹ sư QA: tái hiện báo cáo lỗi
Khi báo cáo lỗi chứa đầu ra HTML thô, hãy chuyển đổi nó sang JSX để nhanh chóng render trong môi trường test React hoặc story Storybook nhằm kiểm tra trực quan và gỡ lỗi.
Designer: tạo prototype từ mockup HTML
Các công cụ thiết kế như Figma xuất ra HTML/CSS. Chuyển đổi mã đánh dấu đã xuất sang JSX để đưa trực tiếp vào prototype React mà không cần dọn dẹp thuộc tính thủ công.
Sinh viên: học cú pháp React
So sánh HTML đầu vào với JSX đầu ra song song để hiểu thuộc tính nào thay đổi và tại sao. Nhìn thấy sự biến đổi giúp ghi nhớ quy ước đặt tên React dễ hơn là chỉ đọc tài liệu.

Bảng Tham Chiếu Ánh Xạ Thuộc Tính HTML sang JSX

Bảng dưới đây liệt kê các thuộc tính HTML thay đổi khi chuyển đổi sang JSX. Các thuộc tính không có trong danh sách (id, src, href, alt, placeholder, v.v.) giữ nguyên vì tên HTML của chúng đã khớp với tên thuộc tính DOM API tương ứng.

Thuộc Tính HTMLJSX PropGhi Chú
classclassNameReserved word in JavaScript
forhtmlForReserved word in JavaScript
tabindextabIndexcamelCase convention
readonlyreadOnlycamelCase convention
maxlengthmaxLengthcamelCase convention
minlengthminLengthcamelCase convention
cellpaddingcellPaddingcamelCase convention
cellspacingcellSpacingcamelCase convention
rowspanrowSpancamelCase convention
colspancolSpancamelCase convention
enctypeencTypecamelCase convention
autocompleteautoCompletecamelCase convention
autofocusautoFocuscamelCase convention
autoplayautoPlaycamelCase convention
contenteditablecontentEditablecamelCase convention
crossorigincrossOrigincamelCase convention
novalidatenoValidatecamelCase convention
allowfullscreenallowFullScreencamelCase convention
spellcheckspellCheckcamelCase convention
http-equivhttpEquivHyphen removed, camelCase
onclickonClickEvent handler camelCase
onchangeonChangeEvent handler camelCase
onsubmitonSubmitEvent handler camelCase

Chuyển Đổi Style Nội Tuyến: HTML so với JSX

Style nội tuyến là phần dễ gặp lỗi nhất khi chuyển đổi HTML sang JSX vì cả định dạng giá trị lẫn tên thuộc tính đều thay đổi:

Thuộc tính style HTML
Một chuỗi các khai báo CSS phân cách bằng dấu chấm phẩy. Tên thuộc tính dùng kebab-case (background-color, font-size, border-radius). Giá trị luôn là chuỗi, kể cả giá trị số có đơn vị.
<div style="background-color: #fff;
  font-size: 14px;
  margin-top: 10px;">
JSX style prop
Một object JavaScript với tên thuộc tính camelCase (backgroundColor, fontSize, borderRadius). Giá trị chuỗi được đặt trong dấu nháy. Các giá trị số không có đơn vị (lineHeight, opacity, zIndex, flexGrow) có thể là số thuần.
<div style={{
  backgroundColor: '#fff',
  fontSize: '14px',
  marginTop: 10
}}>

Ví Dụ Mã

Các ví dụ này cho thấy cách chuyển đổi HTML sang JSX theo chương trình trong các ngôn ngữ và môi trường khác nhau. Mỗi ví dụ bao gồm đổi tên thuộc tính, chuyển đổi style và xử lý thẻ tự đóng.

JavaScript (DOM API)
// Simple attribute conversion using string replacement
function htmlToJsx(html) {
  return html
    .replace(/\bclass=/g, 'className=')
    .replace(/\bfor=/g, 'htmlFor=')
    .replace(/\btabindex=/g, 'tabIndex=')
    .replace(/<!--([\s\S]*?)-->/g, '{/*$1*/}')
}

htmlToJsx('<div class="box" tabindex="0"><!-- note --></div>')
// → '<div className="box" tabIndex="0">{/* note */}</div>'
JavaScript (html-react-parser)
import parse from 'html-react-parser'

// Parse HTML string into React elements (handles all JSX rules)
const element = parse('<div class="card"><img src="photo.jpg" alt="Photo"></div>')
// Returns: React.createElement('div', { className: 'card' },
//   React.createElement('img', { src: 'photo.jpg', alt: 'Photo' }))

// With custom element replacement
const options = {
  replace(domNode) {
    if (domNode.name === 'img') {
      return <OptimizedImage src={domNode.attribs.src} alt={domNode.attribs.alt} />
    }
  }
}
const custom = parse('<img src="photo.jpg" alt="Photo">', options)
Python (BeautifulSoup)
from bs4 import BeautifulSoup
import re

ATTR_MAP = {
    'class': 'className', 'for': 'htmlFor',
    'tabindex': 'tabIndex', 'readonly': 'readOnly',
    'maxlength': 'maxLength', 'autocomplete': 'autoComplete',
}

def html_to_jsx(html: str) -> str:
    """Convert HTML attribute names to JSX equivalents."""
    for html_attr, jsx_attr in ATTR_MAP.items():
        html = re.sub(rf'\b{html_attr}=', f'{jsx_attr}=', html)
    # Convert HTML comments to JSX comments
    html = re.sub(r'<!--(.*?)-->', r'{/*\1*/}', html)
    return html

print(html_to_jsx('<label for="email" class="field">Email</label>'))
# → '<label htmlFor="email" className="field">Email</label>'
Go
package main

import (
    "fmt"
    "strings"
)

var attrMap = map[string]string{
    "class=":    "className=",
    "for=":      "htmlFor=",
    "tabindex=": "tabIndex=",
    "readonly":  "readOnly",
}

func htmlToJSX(html string) string {
    result := html
    for old, new := range attrMap {
        result = strings.ReplaceAll(result, old, new)
    }
    // Convert comments
    result = strings.ReplaceAll(result, "<!--", "{/*")
    result = strings.ReplaceAll(result, "-->", "*/}")
    return result
}

func main() {
    html := `<div class="wrapper"><input readonly tabindex="1"></div>`
    fmt.Println(htmlToJSX(html))
    // → <div className="wrapper"><input readOnly tabIndex="1"></div>
}

Câu Hỏi Thường Gặp

Sự khác biệt giữa HTML và JSX là gì?
JSX là phần mở rộng cú pháp của JavaScript được React sử dụng. Nó trông giống HTML nhưng biên dịch thành các lời gọi React.createElement(). Các khác biệt chính là: class trở thành className, for trở thành htmlFor, style nội tuyến dùng object JavaScript thay vì chuỗi CSS, và tất cả thẻ phải được đóng rõ ràng (kể cả các phần tử rỗng như <img />). JSX cũng cho phép nhúng biểu thức JavaScript trong dấu ngoặc nhọn.
Tại sao React dùng className thay vì class?
Từ 'class' là từ khóa dành riêng trong JavaScript. Vì JSX biên dịch thành các lời gọi hàm JavaScript, việc dùng 'class' làm tên prop sẽ gây lỗi cú pháp. React chọn 'className' vì nó khớp với tên thuộc tính DOM API (element.className) mà JavaScript đã dùng để đọc và đặt class CSS cho các phần tử DOM.
Tôi có cần chuyển đổi HTML sang JSX thủ công không?
Không. Bạn có thể dùng công cụ trực tuyến như công cụ này, hoặc tự động hóa bằng các thư viện như htmltojsx (npm) hay html-react-parser. Với các dự án di chuyển quy mô lớn, các công cụ như codemod hoặc jscodeshift có thể biến đổi toàn bộ codebase. Chuyển đổi thủ công chỉ thực tế với các đoạn nhỏ vài dòng.
Style nội tuyến được xử lý như thế nào trong JSX?
Trong JSX, thuộc tính style nhận một object JavaScript, không phải chuỗi CSS. Tên thuộc tính dùng camelCase (backgroundColor thay vì background-color). Giá trị mặc định là chuỗi, nhưng một số thuộc tính số như lineHeight, opacity và zIndex có thể nhận số thuần không có đơn vị. Dấu ngoặc nhọn kép trong style={{ color: 'red' }} không phải cú pháp đặc biệt: dấu ngoặc ngoài là biểu thức JSX, dấu ngoặc trong là object literal JavaScript.
Tôi có thể dùng comment HTML trong JSX không?
Không. Comment HTML (<!-- comment -->) không hợp lệ trong JSX. Hãy dùng comment khối JavaScript được bọc trong dấu ngoặc nhọn: {/* comment */}. Công cụ chuyển đổi này xử lý việc biến đổi đó tự động. Comment JSX phải nằm trong một phần tử cha, không phải ở cấp cao nhất của return trong component.
Những thuộc tính HTML nào giữ nguyên trong JSX?
Hầu hết các thuộc tính HTML giữ nguyên tên gốc trong JSX. Các ví dụ phổ biến gồm id, src, href, alt, type, name, value, placeholder, disabled, hidden và tất cả thuộc tính data-* và aria-*. Chỉ các thuộc tính mà tên HTML khác với tên thuộc tính DOM API mới cần thay đổi: class thành className, for thành htmlFor, và các thuộc tính nhiều từ chuyển từ chữ thường sang camelCase.
dangerouslySetInnerHTML có giống với chuyển đổi HTML sang JSX không?
Không. dangerouslySetInnerHTML bỏ qua quá trình render của React và đưa HTML thô trực tiếp vào DOM, điều này có nguy cơ bị tấn công XSS. Chuyển đổi HTML sang JSX tạo ra các phần tử React thực sự đi qua virtual DOM của React và an toàn theo mặc định. Hãy dùng chuyển đổi HTML sang JSX cho mã đánh dấu tĩnh mà bạn kiểm soát. Chỉ dùng dangerouslySetInnerHTML khi bạn phải render HTML đáng tin cậy từ nguồn bên ngoài không thể chuyển đổi sang JSX.