网站首页 > 基础教程 正文
JSX是JavaScript的一种语法扩展,被应用到React体系结构中,它的格式与模板语言类似,但实际上完全在JavaScript内部实现。组成React应用程序的元素最小单元,JSX用于声明React中的元素,React使用JSX来描述用户界面。
01使用纯JS方式来创建虚拟DOM
在React中提供相应API来创建虚拟DOM对象,对应的API有如下两个。
// 1、创建虚拟DOM
React.createElement('h1',{id:"xiaojia"},
"XiaoJia love MeiMei");
// 参数1: 要创建的元素类型,字符串,表示元素的名称
// 参数2: 是一个对象或null,表示当前这个DOM元素的属性
// 参数3: 子节点(包括其他虚拟DOM获取文本子节点)
// 参数n:其他子节点
// 2、使用ReactDOM把虚拟DOM渲染到页面上
// 参数1: 要渲染的那个虚拟DOM元素
// 参数2: 指定页面上一个容器
ReactDOM.render(vDom1, document.getElementById('test1'))123456789101112复制代码类型:[javascript]
虚拟DOM对象最终都会被React转换为真实的DMOM对象
我们编码时基本只需要操作react的虚拟DOM相关数据,React会转换为真实DOM变化而更新界面
完整案例:使用纯JS方式创建虚拟DOM
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>第二天 JSX语法简介</title>
</head>
<body>
<div id="test1"></div>
<div id="test2"></div>
<script src="../lib/react.development.js"></script>
<script src="../lib/react-dom.development.js"></script>
<script src="../lib/babel.min.js"></script>
<script type="text/javascript">
const msg = 'I love MeiMei'
const myId = 'xiaojia'
// 1、创建虚拟DOM
const vDom1 = React.createElement('h2',{id:myId},msg);
const vDom2 = React.createElement('h3',
{id:myId.toLocaleUpperCase()},msg.toLocaleUpperCase());
// 2、渲染虚拟DOM
ReactDOM.render(vDom1, document.getElementById('test1'))
ReactDOM.render(vDom2, document.getElementById('test2'))
</script>
</body>
</html>123456789101112131415161718192021222324252627282930313233复制代码类型:[javascript]
02使用JSX语法来创建虚拟DOM对象
使用纯JS方式来创建虚拟DOM太麻烦了,而且可读性比较差,页面结构不够直观。于是React提供了JSX的语法来书写。
JSX的标签写法既不是字符串,也不是HTML,它是JavaScript的语法扩展,全称叫做JavaScriptXML,用来创建React虚拟DOM对象。
其语法比较简单,标签名可以任意,可以是HTML标签也可以是其他标签,标签属性也可以任意,可以是HTML标签属性或者是其他属性,
基本语法规则
遇到<开头的代码,以标签的语法解析:html同名标签转换为html同名元素,其他标签需要特别解析
遇到以{开头的代码,以JS语法解析:标签中的js代码必须用{}包含
可以带引号,也可以不带引号
babel.js的作用:
浏览器本身不能直接解析JSX语法,我们需要使用babel转译为纯的JavaScript的代码才能运行;
只要使用了JSX,就要加上type="text/babel"来声明需要babel来出来
范例:使用JSX语法
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>第二天 JSX语法简介</title>
</head>
<body>
<div id="test1"></div>
<div id="test2"></div>
<script src="../lib/react.development.js"></script>
<script src="../lib/react-dom.development.js"></script>
<script src="../lib/babel.min.js"></script>
<script type="text/babel">
const msg = '你好,React'
const myId = 'xiaojia'
// 1、创建虚拟DOM
const vDom3 = <h3 id={myId}>{msg}</h3>
ReactDOM.render(vDom3, document.getElementById('test2'))
</script>
</body>
</html>123456789101112131415161718192021222324复制代码类型:[javascript]
如果使用webpack的同学,需要配置babel插件。
1、安装babel插件
cnpm i babel-core babel-loader babel-plugin-transform-runtime -D
cnpm i babel-preset-env babel-preset-stage-0 -D12复制代码类型:[javascript]
2、安装能够识别转换JS语法的包:babel-preset-react
cnpm i babel-preset-react -D1复制代码类型:[javascript]
3、在webpack.config.js中配置所有第三方模块的配置规则
module: {
rules: [
{
test: /\.js$|jsx$/,
use:'babel-loader',
exclude: /node_modules/
}
]12345678复制代码类型:[javascript]
4、在项目根目录中创建一个.babelsrc
{
"presets": ["env", "stage-0", "react"],
"plugins": ["transform-runtime"]
}1234复制代码类型:[javascript]
03JSX语法练习
1、JSX语法的本质
并不是直接把JSX渲染的页面上,而是内部先转换成了createElement形式,再渲染的;
2、在JSX语法中混合写入JS表达式
在JSX语法中,要把JS代码写到{}之中
范例:循环数组渲染到li中
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>第二天 JSX语法练习</title>
</head>
<body>
<div id="app"></div>
<script src="../lib/react.development.js"></script>
<script src="../lib/react-dom.development.js"></script>
<script src="../lib/babel.min.js"></script>
<script type="text/babel">
const languages = ['Java','JavaScript','php','c',
'c++','Python','R','Rust','Go','Ruby']
const ul=(
<ul>
{languages.map((language, index)=>
<li key={index}>{language}</li>)}
</ul>
)
ReactDOM.render(ul,document.getElementById('app'))
</script>
</body>
</html>1234567891011121314151617181920212223242526272829复制代码类型:[javascript]
3、Key的作用
这里我们如果不写Key的话,浏览器上会有个红色的警告,警告内容如下
react.development.js:260 Warning: Each child in a list should have a unique "key" prop.
Check the top-level render call using <ul>. See https://fb.me/react-warning-keys for more information.
in li123复制代码类型:[javascript]
如果不指定key,添加元素的时候,不会保存选中的状态。
从昨天我看diff算法的时候,可以看到diff算法判断的时候会判断key。这就是为什么会丢失选中状态的原因。
在什么时候需要指定key
forEach
map
for
在上述方法或循环中直接控制的元素,需要指定key。
4、注意事项
在JSX中写注释:推荐使用{/*这是注释*/}形式
在JSX中创建DOM的时候,所有的节点必须有唯一的根元素进行包裹;
在JSX语法中,标签必须成对出现,如果是单标签,则必须自闭合
猜你喜欢
- 2024-11-02 React 中 JSX 与用户表单数据的交互
- 2024-11-02 React核心特性-从JSX到虚拟DOM react中的虚拟dom
- 2024-11-02 06 JSX与React 元素 react元素和组件
- 2024-11-02 前端开发React18 - 环境搭建和JSX
- 2024-11-02 React前端工程师,必须要知道的JSX基础知识
- 2024-11-02 React 也就这么回事 02 —— JSX 插值表达式、条件渲染以及列表渲染
- 2024-11-02 说说React Jsx转换成真实DOM过程?
- 2024-11-02 React入门指南:JSX的使用和常见语法
- 2024-11-02 前端开发react框架 - jsx语法 前端框架react入门
- 2024-11-02 React简单认识JSX react jss
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- 单例 (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)