JSX 详细介绍(React方向)

介绍

JSX = JavaScript XML
是React 专属的 JavaScript 语法扩展,用来编写页面结构,把 HTML 结构写进 JS 里。

本质:语法糖,最终编译为 React.createElement()

浏览器不识别 JSX,必须经 Babel 转译为原生 JS。

提示:vue全面支持JSX

环境依赖

使用 JSX 必须满足:

  1. 引入 React
  2. 安装 Babel 转译
  3. script 标签加 type="text/babel"

基础语法

1. 基本结构

const 变量 = (<标签>内容</标签>)

多行 JSX 必须加小括号包裹

2. 唯一根节点

JSX 顶层只能有一个父元素

  • 错误:并排写多个标签
  • 正确:用 <div> / 空标签 <> 包裹
// 正确
<>
  <h1>标题</h1>
  <p>内容</p>
</>

<> </> 叫 Fragment,不渲染真实 DOM。

3. 标签严格闭合

自结束标签必须写 /

<input />
<img />
<br />

4. 大小写区分

  • 小写:HTML 原生标签 div/p/span
  • 大写:React 自定义组件 Hello/Login

JSX 嵌入 JS 表达式

语法:{ 表达式 }

支持内容

  1. 变量
  2. 数值运算
  3. 三元运算符
  4. 数组、对象取值
  5. 函数调用

不支持

  • 语句:if/for/while/switch
const name = "张三"
const num = 10

<div>
  {name}
  {num + 20}
  {num > 5 ? "大于5" : "小于5"}
</div>

JSX 条件渲染

1. 三元表达式(最常用)

{isShow ? <div>显示</div> : null}

2. 逻辑短路 &&

{isLogin && <button>退出登录</button>}

列表渲染 map

规则:数组.map() 遍历,必须加 key

const arr = [1,2,3]
<ul>
  {arr.map((item, index)=>{
    return <li key={index}>{item}</li>
  })}
</ul>
  • key:唯一标识,优先用id,不推荐下标
  • 简写:省略return
    {arr.map(item => <li key={item.id}>{item.name}</li>)}
    

JSX 属性规范

1. 关键字改名(重点)

HTML JSX 原因
class className class是JS关键字
for htmlFor for是循环关键字

2. 所有属性驼峰命名

onClick onMouseEnter tabIndex maxLength

3. 字符串属性 / 动态属性

// 静态
<div title="提示"></div>
// 动态绑定
<div title={tipText}></div>

JSX 行内样式 style

格式:style = {{ 驼峰样式对象 }}

两层大括号:

  • 外层:JSX插值 {}
  • 内层:样式对象 {}
<div style={{
  color:"red",
  fontSize:"20px",
  backgroundColor:"#eee"
}}></div>

样式值必须带单位

JSX 注释写法

{/* 单行 / 多行注释 */}

JSX 事件绑定

语法

on事件名={事件处理函数}

  1. 原生:onclick → JSX:onClick
  2. 函数直接写名称,不加()
function clickFn(){
  alert("点击了")
}

<button onClick={clickFn}>点击</button>

传参写法

<button onClick={()=>clickFn(100)}>传参</button>

JSX 渲染值特殊规则

  1. null / undefined / false 不渲染任何内容
  2. 0、空字符串 会正常渲染
  3. 对象不能直接渲染,会报错

JSX 编译原理

JSX 写法

<h1 className="box">hello</h1>

编译后原生JS

React.createElement(
  "h1",
  {className:"box"},
  "hello"
)

参数:

  1. 标签名
  2. 属性对象
  3. 子元素

优缺点

优点

  1. 结构、数据、逻辑放一起,维护方便
  2. 语法接近HTML,上手快
  3. 自带语法校验,减少错误
  4. 支持JS表达式,灵活极强

缺点

  1. HTML与JS混杂,初期不习惯
  2. 需编译,不能直接浏览器运行
  3. 语法规则多,细节易错

高频易错点汇总

  1. 忘记 唯一根标签
  2. class写成class,不用className
  3. for写成for,不用htmlFor
  4. 自闭合标签忘记 /
  5. style写成单层大括号
  6. 事件写成小写 onclick
  7. 循环不加key
  8. {} 里面写if语句

完整可运行 JSX 示例

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div id="root"></div>

<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script type="text/babel">

const name = "JSX教程"
const list = ["Vue","React","Angular"]

const vdom = (
  <div className="wrap">
    <h2>{name}</h2>
    <ul>
      {list.map((item,i)=><li key={i}>{item}</li>)}
    </ul>
  </div>
)

ReactDOM.createRoot(document.getElementById("root")).render(vdom)
</script>
</body>
</html>

原文出处:/show_1C77vX2P52c.html