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.
Các Trường Hợp Sử Dụng Chuyển Đổi HTML sang JSX
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 HTML | JSX Prop | Ghi Chú |
|---|---|---|
| class | className | Reserved word in JavaScript |
| for | htmlFor | Reserved word in JavaScript |
| tabindex | tabIndex | camelCase convention |
| readonly | readOnly | camelCase convention |
| maxlength | maxLength | camelCase convention |
| minlength | minLength | camelCase convention |
| cellpadding | cellPadding | camelCase convention |
| cellspacing | cellSpacing | camelCase convention |
| rowspan | rowSpan | camelCase convention |
| colspan | colSpan | camelCase convention |
| enctype | encType | camelCase convention |
| autocomplete | autoComplete | camelCase convention |
| autofocus | autoFocus | camelCase convention |
| autoplay | autoPlay | camelCase convention |
| contenteditable | contentEditable | camelCase convention |
| crossorigin | crossOrigin | camelCase convention |
| novalidate | noValidate | camelCase convention |
| allowfullscreen | allowFullScreen | camelCase convention |
| spellcheck | spellCheck | camelCase convention |
| http-equiv | httpEquiv | Hyphen removed, camelCase |
| onclick | onClick | Event handler camelCase |
| onchange | onChange | Event handler camelCase |
| onsubmit | onSubmit | Event 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:
<div style="background-color: #fff; font-size: 14px; margin-top: 10px;">
<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.
// 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>'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)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>'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>
}