React JSX
概述
JSX全称JavaScript XML, React定义的一种类似于XML的JS扩展语法
JS + XML本质是React.createElement(component, props, ...children)方法的语法糖
作用
用来简化创建虚拟DOM
- 写法
jsx
const VDOM = <h1>Hello JSX</h1>注意
- 不是字符串也不是
HTML/XML标签 - 最终产生的就是一个
JS对象
标签
- 标签名任意,
HTML标签或其他标签 - 标签属性任意,
HTML标签属性或其他
Babel 的作用
- 浏览器不能直接解析
JSX代码, 需要babel转译为纯JS的代码才能执行 - 只要用了
JSX,script标签都要加上type="text/babel", 声明需要babel来处理
渲染虚拟 DOM
将虚拟DOM元素渲染到页面中的真实容器DOM中显示
- 语法
jsx
/**
* 渲染虚拟 DOM 到容器
* virtualDOM: 纯 JS 或 JSX 创建的虚拟 DOM 对象
* containerDOM: 用来包含虚拟 DOM 元素的真实 DOM 元素对象, 一般是一个 div
*/
ReactDOM.render(virtualDOM, containerDOM);语法规则
- 定义虚拟
DOM时, 不要写引号 - 标签中混入
JS表达式时要使用{}- ⚠️ 区分表达式与语句的区别: 表达式会产生一个值, 可以放在任何一个需要值的地方
- 样式的类名指定不要用
class, 要使用className - 内联样式要使用
style={ { key: value } }的形式去写 - 只有一个根标签
- 标签必须闭合
- 标签首字母:
- 如果小写字母开头, 则将该标签转为
html中同名元素, 若html中无改标签对应的同名元素则报错 - 若大写字母开头,
React就去渲染对应的组件, 若组件没有定义则报错
- 如果小写字母开头, 则将该标签转为
- 代码示例
jsx
const id = 'Miller'
const data = 'Hello JSX'
// 1. 创建虚拟 DOM
const VDOM = (
<div>
<h1 id={id.toLowerCase()} className="title">
<span style={{ color: '#F00', fontSize: '50px' }}>{data.toUpperCase()}</span>
</h1>
<h2 id={id.toUpperCase()} className="title">
<span style={{ color: '#F00', fontSize: '50px' }}>{data.toLowerCase()}</span>
</h2>
<input type="text" />
<Good>123</Good>
</div>
);
// 2. 渲染虚拟 DOM 到页面
ReactDOM.render(VDOM, document.getElementById("app"));JSX 练习
注意区分JS语句与JS表达式
- 表达式: 一个表达式可以产生一个值, 可以放在任何一个需要值的地方
使用JSX渲染一个数组
- 代码示例
jsx
const list = [ 'Angular', 'React', 'Vue' ]
// 1. 创建虚拟 DOM
const VDOM = (
<div>
<h1>前端框架</h1>
<ul>
{ list.map((i, _i) => <li key={ _i }>{ i }</li>) }
</ul>
</div>
);
// 2. 渲染虚拟 DOM 到页面
ReactDOM.render(VDOM, document.getElementById("app"));