let span = React.createElement('span', null, 'hello,span')
let h = React.createElement('h2', { className: 'red'}, span)
console.log(h);
let h = <h2>
<span>Hello,React</span>
</h2>
ReactDOM.render(h, document.getElementById('root'));
//{$$typeof: Symbol(react.element), type: //"h2", key: null, ref: null, props: {…}, …}
//$$typeof: Symbol(react.element)
//key: null
//props: {className: "red", children: {…}}
//ref: null
//type: "h2"
//_owner: null
//_store: {validated: false}
//_self: null
//_source: null
//__proto__: Object
React.createElement()
React.createElement (
type: 'h1', // 创建元素的类型
[props], // 元素上的属性
[... chilidren] 包含的子元素
)
创建并返回一个对象,这个对象描述了要显示的元素信息,称之为ReactElement
编译的示意
JSX 语法规范
/**
* 使用变量的方式,多个标签,外出需要一个父标签,这里使用<>
* React.Fragment
*/
let h = <>
<h2><span>hello</span></h2>
<ul><li><span>world</span></li></ul>
ReactDOM.render(h, document.getElementById('root'));
let value1 = 'Hello'
let value2 = 'World'
let h = <React.Fragment>
<h2><span>{value1}</span></h2>
<ul><li><span>{value2}</span></li></ul>
</React.Fragment>
ReactDOM.render(h, document.getElementById('root'));
/**
* 使用函数的方式
*/
function createH() {
return <React.Fragment>
<h2><span>hello</span></h2>
<ul><li><span>world!!</span></li></ul>
</React.Fragment>
}
ReactDOM.render(createH(), document.getElementById('root'));
/**
* 使用数组的方式
* 这里需要给标签定义key值,目的是为了复用,渲染的问题,可以和vue里v-for要配合key一起
*/
let arr = [
<h2 key="1"><span>hello</span></h2>,
<ul key="2"><li><span>world!!!!</span></li></ul>
]
ReactDOM.render(arr, document.getElementById('root'));