Co je převod HTML na JSX?
Převod HTML na JSX je proces transformace standardního HTML kódu do syntaxe JSX, kterou mohou vykreslovat React komponenty. JSX vypadá podobně jako HTML, ale řídí se konvencemi a pravidly JavaScriptu. Atributy jako class se stávají className, for se stává htmlFor a řetězce inline stylů jsou nahrazeny objekty JavaScriptu. Tyto změny jsou povinné, protože JSX se kompiluje na volání React.createElement(), kde názvy atributů musí odpovídat názvům vlastností DOM API, nikoli názvům HTML atributů.
Mapování mezi HTML atributy a JSX props je definováno dokumentací DOM elementů Reactu. React používá camelCase pro vícesvá atributy (tabindex se stává tabIndex, maxlength se stává maxLength), protože identifikátory JavaScriptu nemohou obsahovat pomlčky. Samouzavírací značky jako <img>, <br> a <input> musí v JSX obsahovat koncové lomítko (<img />), protože JSX se řídí pravidly XML, kde každá značka musí být explicitně uzavřena.
htmlToJsxContent.whatBody3
Proč použít převodník HTML na JSX?
Ruční přejmenování atributů a přepisování řetězců stylů napříč desítkami HTML elementů je pomalé a náchylné k chybám. Převodník zvládne všechny transformace najednou — vložte HTML z libovolného zdroje a získejte platný JSX během několika sekund.
Případy použití HTML na JSX
Referenční tabulka mapování HTML na JSX atributy
Tabulka níže uvádí HTML atributy, které se při převodu na JSX mění. Atributy zde neuvedené (id, src, href, alt, placeholder atd.) zůstávají beze změny, protože jejich HTML názvy již odpovídají názvům příslušných vlastností DOM API.
| HTML atribut | JSX prop | Poznámky |
|---|---|---|
| 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 |
Převod inline stylů: HTML vs JSX
Inline styly jsou nejnáchylnější části převodu HTML na JSX, protože se mění jak formát hodnoty, tak názvy vlastností:
<div style="background-color: #fff; font-size: 14px; margin-top: 10px;">
<div style={{
backgroundColor: '#fff',
fontSize: '14px',
marginTop: 10
}}>Ukázky kódu
Tyto příklady ukazují, jak programově převádět HTML na JSX v různých jazycích a prostředích. Každý pokrývá přejmenování atributů, převod stylů a zpracování samouzavíracích značek.
// 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>
}