例如:在A文件
中有如下代码
export default class Person extends React.Component {
constructor(props){
super(props)
}
render(){
return <div>Hello</div>
}
}
上面是es6
写的Person
组件
引用:在B文件
中使用Person
组件
import Person from './A.jsx'
class Persons extends React.Component{
constructor(props){
super(props)
}
render(){
return (
<div>
<Person />
</div>
)
}
}
问题:
1.react
中使用jsx
语法包裹import
进来的组件(这里是把Person
变为<Person/>
),这过程中发生了哪些事情?
2.react
有没有隐式的使用new Person
?
其实呢,jsx语法中,react并不是用new的形式来创建组件,而是使用React.createElement来创建组件的,所以当你在使用
这种语法来书写组件时,其实解析出来的形式为:
而我们写:
最终编译解析成:
而如果你需要往person里面添加一些props的属性,jsx的语法为:
而解析出来的语法为:
而当我们div之间有多个嵌套的最终解析会如何,例如下面的写法:
而jsx最终解析为:
React文档中提到,React.createElement方法提供三个参数:
第一个参数为组件的类型,小写则为原生的提供的组件,大写则为自定义的组件
第二个参数为传入的props
第三个参数则为children,传入的为子元素的解析
而这三个参数可以完美适应所有的jsx的书写方式,另附react官方文档:
React Without JSX
附录2:React.createElement方法的源码,
看看这个其实就可以理解了