JSX简介和语法

JSX

什么是 JSX

  • Facebook 起草的 JS 扩展语法
  • 本质是一个 JS 对象,会被 babel 编译,最终会被转换为 React.createElement
  • 每个 JSX 表达式,有且仅有一个根节点
    • 多个节点同级是可以使用 React.Fragment 或 <> 直接包裹
  • 每个 JSX 元素必须结束(XML 规范)
  • 类名要写成className
1
2
3
4
5
6
const h1 = (
<React.Fragment>
<h1> javascript </h1>
<p> 你好 </p>
</React.Fragment>
);
1
2
3
4
5
6
const h1 = (
<>
<h1> javascript </h1>
<p> 你好 </p>
</>
);

在 JSX 中嵌入表达式

使用 {} 包裹要放置的表达式

  • 在 JSX 中使用注释: {/* 注释内容 */}
  • 将表达式作为内容的一部分
    • null、undefined、false 不会显示在页面上,结构上会存在
    • 普通对象,不可以作为子元素
    • 可以放置 React 元素对象
    • 可以放置数组(会遍历数组,将数组的每一项作为子元素添加进去)
  • 将表达式作为元素属性
  • 属性使用小驼峰命名法
  • 防止注入攻击
    • 自动编码
    • dangerouslySetInnerHTML:来实现类似innerHTML的功能
1
2
3
4
5
6
7
8
const a = 1234,  b = 4321;
const h1 = (
<React.Fragment>
<p>
{a}*{b} = {a * b}
</p>
</React.Fragment>
);
1
2
3
4
5
6
7
8
9
10
const imgClassName = "image"
const imgUrl= "http://qzapp.qlogo.cn/qzapp/101983660/F61F6EEE51E483105E9C9686BFFF61A2/100"
const h1 = (
<React.Fragment>
<img src={imgUrl} className={imgClassName} alt="" style={{
marginLeft:'50px',
width:"220px"
}}/>
</React.Fragment>
);
1
2
3
4
5
6
7

const divContent = "<h1>测试dangerouslySetInnerHTML</h1><p>必须传入一个对象,将__html属性赋值为想要展示的html字符串</p>"
const div = (
<div dangerouslySetInnerHTML={{
__html:divContent
}}></div>
);

元素的不可变性

  • 虽然 JSX 元素是一个对象,但是该对象中的所有属性不可更改
  • 如果确实需要更改元素的属性,需要重新创建 JSX 元素