Vad är HTML till JSX-konvertering?
HTML till JSX-konvertering är processen att omvandla vanlig HTML-uppmärkning till JSX-syntax som React-komponenter kan rendera. JSX liknar HTML men följer JavaScript-namnkonventioner och -regler. Attribut som class blir className, for blir htmlFor, och inline-stil-strängar ersätts med JavaScript-objekt. Dessa ändringar krävs eftersom JSX kompileras till React.createElement()-anrop, där attributnamn måste matcha DOM API:ets egenskapsnamn snarare än HTML-attributnamn.
Mappningen mellan HTML-attribut och JSX-props definieras av Reacts dokumentation för DOM-element. React använder camelCase för sammansatta attribut (tabindex blir tabIndex, maxlength blir maxLength) eftersom JavaScript-identifierare inte kan innehålla bindestreck. Självstängande taggar som <img>, <br> och <input> måste inkludera ett avslutande snedstreck i JSX (<img />) eftersom JSX följer XML-regler där varje tagg måste stängas explicit.
htmlToJsxContent.whatBody3
Varför använda ett HTML till JSX-verktyg?
Att manuellt byta namn på attribut och skriva om stil-strängar i dussintals HTML-element är långsamt och felbenäget. Ett verktyg hanterar alla omvandlingar på en gång och låter dig klistra in HTML från valfri källa och få giltig JSX på sekunder.
Användningsområden för HTML till JSX
Referens: HTML till JSX-attributmappning
Tabellen nedan listar HTML-attribut som ändras vid konvertering till JSX. Attribut som inte listas här (id, src, href, alt, placeholder osv.) förblir oförändrade eftersom deras HTML-namn redan matchar motsvarande DOM API-egenskapsnamn.
| HTML-attribut | JSX-prop | Anteckningar |
|---|---|---|
| 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 |
Konvertering av inline-stilar: HTML vs JSX
Inline-stilar är den mest felbenägna delen av HTML till JSX-konvertering eftersom både värdeformatet och egenskapsnamnen ändras:
<div style="background-color: #fff; font-size: 14px; margin-top: 10px;">
<div style={{
backgroundColor: '#fff',
fontSize: '14px',
marginTop: 10
}}>Kodexempel
Dessa exempel visar hur du konverterar HTML till JSX programmatiskt i olika språk och miljöer. Varje exempel täcker attributbyte, stilkonvertering och hantering av självstängande taggar.
// 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>
}