解读在React中使用JSX语法

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语法中,标签必须成对出现,如果是单标签,则必须自闭合

(0)

相关推荐

  • React 整体感知

    当我们由浅入深地认知一样新事物的时候,往往需要遵循 Why > What > How 这样一个认知过程.它们是相辅相成.缺一不可的.而了解了具体的 What 和 How 之后,往往能够更加 ...

  • React 和 VUE 的区别和优缺点

    前言 React 是由Facebook创建的JavaScript UI框架,React推广了 Virtual DOM( 虚拟 DOM )并创造了 JSX 语法.JSX 语法的出现允许我们在 javas ...

  • 微前端(Micro Frontend ) 落地实施的一些具体例子

    前文微前端概述(Micro Frontends) 以及相比单体应用,微前端能带来什么好处 简单介绍了微前端的概念,本文来看一个具体的应用例子. 原文地址 想象一个网站,客户可以在其中订购外卖食品.从表 ...

  • React与Redux开发实例精解

    一.技术简介 1.React是一个声明式.高效.灵活的.创建用户界面的JavaScript库 声明式:只要使用React描述组件的样子就可以改变用户界面 高效:利益于React的虚拟DOM,以及其Di ...

  • 简单易懂的透视知识 图片解读美术绘画中的透视原理

    绘画中的透视是指在平面上体现空间感和立体感.美术生一般从几何体入手学习,几何体造型简单,便于初学者理解绘画中的透视原理. 透视原理贯穿于绘画学习的不同阶段,静物.石膏像.人像等,从整体构图到个体造型, ...

  • 我来解读正能量——中毉大夫

    ​[我来解读正能量] --中毉大夫 正字可以理解为:中字,可以理解为德字,可以理解为本性.本源.本来. 能量可以理解为:振动的频率.动力.气.光.道. 正能量可以理解为:正道.正气.光明.正向的动力. ...

  • [历史解读]中国历史中三教九流是哪九流?

    九流 所谓的九流,实际上是指'上中下'三等.三教之中三等人:自然三三得九. 至于上中下九流之说,则是源于<七略>.此中将天下学说分为九流十家. 在<七略>分别指:儒家.道家.墨 ...

  • 上了投档线,一定被录取吗?详细解读高考录取中常见的7种分数线

    上了投档线,一定被录取吗?详细解读高考录取中常见的7种分数线

  • 【解读】龙门石窟中的北魏建筑

    建筑图像广泛地存在于中国各大石窟中.它们以不同的形式与石窟结合形成立体的宗教空间.石窟壁画中的建筑图像能够告诉我们中国古代寺院建筑群的可能样貌,石质仿木结构窟檐则以更加直接.写实的方式模拟了古代木构建 ...

  • 中国画简要解读,花鸟画中“画面层次”的表现

    花鸟画注重层次的前后,而不重远近距离的表现.如果说山水画重视表现深远.第三维空间,那么花鸟画是在一.二维空间里做文章,强调平面布列.层次掩映.层次衬托,不强调远近变化.我认为这是花鸟画的重要特点之一, ...

  • 深度解读下西游记中,妖怪与妖怪之间的领地意识问题

    (观察君谈西游076期) 大家有没有想过这两个问题? 第一,为啥西游记中那么多妖怪,怎么就没有发生群妖大乱斗呢? 第二,唐僧师徒四人为啥每到一个地方就会遇到一个或者一个团伙的妖怪,为啥没有一处地方同时 ...

  • 从水浒传中的鲁智深,解读天罡奇门遁甲中的“四正”文化深意

    再悟"四正" 一人一个天罡遁,同样每个人都有一个属于自己的人生.有人活的精彩,有人活的平庸:有人壮怀激烈,有人惟惟诺诺:有人睿智,有人迂腐:正所谓一阴一阳谓之道.有正面的必有反面的 ...

  • 【名作解读】灾难中的人性与力量

    印度边界上的东巴基斯坦难民  作者  唐.麦卡林  摄于1971年 战地摄影家唐.麦卡林,1936年生于英国伦敦工人阶级家庭,四十年代遇上了战争,轰炸中看到死人的头颅等骇人听闻的谈论成了伦敦人的家常便 ...