环境
html代码中必须先引入babel 的包,并且script 必须添加type='text/babel’属性,才能识别jsx
;
基础使用
const element = <div>这就是一句JSX代码</div>
一些小注意
- 注释:
{/*这里写注释*/}
; - 元素的
class
名变为className
,label
元素的for
属性变为htmlFor
; - 单标签例如
img
结尾必须用/>
; - 使用变量的时候,不使用
""
;如<img src={url} />
嵌入变量
- 只显示
string
,number
,Array
类型的变量; - 如果是
null
,undefined
,boolean
值时则不显示内容,想要显示的话,需要先转变为字符型,转变方式有:toString()
,+
,String()
等; - 对象类型不能作为子元素;
嵌入表达式
- 运算符
- 三元表达式
- 执行一个函数
{10 + 20}
{true?10:20}
{this.func()}
本质
使用React.createElement(type,config,children)
语法糖;参数有三个:第一个是元素标签类型,第二个是元素的属性,第三个是元素的子元素;
React.createElement(
"div",
null,
React.createElement(
"div",
{className:'header'},
React.createElement(
"h2",
null,
"hello world"
),
React.createElement(
"h2",
null,
"hello world1"
)
)
)
用babel转换过来就是:
<div>
<div className="header">
<h2>hello world</h2>
<h2>hello world1</h2>
</div>
</div>
可以在 babeljs.io 官网的 try it out中试一试
虚拟DOM
jsx => createElement => ReactElement 树结构 =>ReacDOM.render()映射到真实DOM上;即:
jsx:
<div>
<div className="header">
<h2>hello world</h2>
<h2>hello world1</h2>
</div>
</div>
通过babel转换为 createElement:
React.createElement(
"div",
null,
React.createElement(
"div",
{className:'header'},
React.createElement(
"h2",
null,
"hello world"
),
React.createElement(
"h2",
null,
"hello world1"
)
)
)
- 生成一个ReactElement对象,也称树结构:
- 通过
ReactDOM.render()
函数将虚拟DOM
映射到真实DOM
上;
react中state数据不可变性原则
不能直接修改state中的数据,想要修改必须通过this.setState()
方法:
state={
books:[
{
id:1,
name:'aa',
count:1
},
{
id:2,
name:'bb',
count:1
},
{
id:2,
name:'cc',
count:1
},
]
}
若想要修改指定index的count值:
changeBookCount(index){
const newBooks = [...this.state.books]
newBooks[index].count += 1
this.setState({
books:newBooks
})
}
若想要删除books中指定index的数据,可以这样做:(直接用splice会修改掉原books)
removeBook(index){
this.setState({
books:this.state.books.filter((item,indey)=>index != indey)
})
}