当前位置:首页 > 通信资讯 > 正文

react的jsx语法(转译react的jsx本质)

react的jsx语法(转译react的jsx本质)

JSX 是一个 JavaScript 的语法扩展,它不是字符串,也不是 HTML。

JSX 可以很好地描述 UI 交互的本质形式,它具有 JavaScript 的全部功能。JSX 可以生成 React “元素”。

基本使用

\src\index.js

  1. importReactfrom'react'
  2. importReactDomfrom'react-dom'
  3. //看上去是HTML,但是实际是JSX
  4. consttitle=@lt;h1@gt;HelloReact@lt;/h1@gt;
  5. //调用ReactDom.render方法,传入jsx和节点对象
  6. ReactDom.render(title,document.getElementById('root'))

在使用 JSX 时,可以简单直接的按照 HTML 的规则来使用(你需要牢记它并不是 html ),那么有多行代码时,需要使用括号 () 包裹。

  1. importReactfrom'react'
  2. importReactDomfrom'react-dom'
  3. //使用括号包裹jsx,可以换行,代码更加整洁
  4. consttitle=(
  5. @lt;div@gt;
  6. @lt;h1@gt;HelloReact@lt;/h1@gt;
  7. @lt;span@gt;嘿嘿嘿@lt;/span@gt;
  8. @lt;/div@gt;
  9. )
  10. ReactDom.render(title,document.getElementById('root'))

设置 VS Code 编辑器,让 JSX 代码补全:

  1. 文件--首选项--设置--用户设置
  2. 在用户设置添加
  3. @quot;emmet.includeLanguages@quot;:{
  4. @quot;javascript@quot;:@quot;javascriptreact@quot;
  5. }

如下图所示:

react的jsx语法(转译react的jsx本质)

JSX 表达式

前面说到 JSX 具有 JavaScript 的全部功能,而在具体使用时可以直接套用 HTML 的规则。换句话说,在 HTML 规则里,如何展现 JS 的能力呢?

先来一点简单的常常甜头,JSX 中的能够进行:

  • 动态显示数据 {}
  • 调用方法: 自定义 + 内置
  • 支持表达式, 支持三元表达式
  • 模板字符串

接下来,我们开始搞它:

  1. importReactfrom'react';
  2. importReactDOMfrom'react-dom';
  3. constname='西岭老湿'
  4. functionsayHello(){
  5. return'大家好'
  6. }
  7. constobj={
  8. name:'刘备',
  9. age:100
  10. }
  11. constflag=true
  12. //请开始你的表演====
  13. consttitle=(@lt;h2@gt;嘿嘿@lt;/h2@gt;)//JSX本身也是可直接食用的值哟
  14. constApp=(
  15. @lt;div@gt;
  16. {/*注释在jsx中是这么个熊样子*/}
  17. @lt;p@gt;name@lt;/p@gt;{/*这就鸳鸯(原样)展示了*/}
  18. @lt;p@gt;{name}@lt;/p@gt;{/*动态获取变量数据*/}
  19. @lt;p@gt;{sayHello()}@lt;/p@gt;{/*调用个函数违法吗?不*/}
  20. {/*执行原生JS不合理吗?合理*/}
  21. @lt;p@gt;{console.log('1111')}@lt;/p@gt;
  22. @lt;p@gt;{Math.random()}@lt;/p@gt;
  23. @lt;p@gt;{JSON.stringify(obj)}@lt;/p@gt;
  24. {/*三元运算让你吃醋了?没有*/}
  25. @lt;p@gt;{flag?'登录的状态':'执行登录'}@lt;/p@gt;
  26. {/*模板字符下,字符串和变量结婚,可以吗?可以*/}
  27. @lt;p@gt;{`hello,${name}`}@lt;/p@gt;
  28. {/*JSX也是可直接食用的值哟*/}
  29. @lt;div@gt;{title}@lt;/div@gt;
  30. @lt;/div@gt;
  31. )
  32. ReactDOM.render(App,document.getElementById('root'));
  • JSX 本身就一个表达式
  • JSX 添加属性:

字符串属性,直接使用双引号包裹

动态属性,不用双引号,直接使用 {} class={xxx}

  • JSX 添加子元素

JSX 只有一个父元素

  • 单标签必须闭合
  1. //01jsx本身就是一个表达式
  2. constnames=@lt;h3@gt;西岭老湿@lt;/h3@gt;
  3. //02添加属性
  4. constage=99
  5. //03jsx添加子元素(JSX只有一个父元素)
  6. //04单标签必须闭合
  7. //组件
  8. functionApp(){
  9. return(
  10. //返回中只能有一个JSX块
  11. //@lt;p@gt;@lt;/p@gt;//报错
  12. @lt;div@gt;
  13. {/*jsx本身就是一个表达式*/}
  14. {names}
  15. {/*添加属性*/}
  16. @lt;page=@quot;age@quot;@gt;用户年龄属性@lt;/p@gt;{/*字符串属性*/}
  17. @lt;page={age}@gt;用户年龄属性@lt;/p@gt;{/*动态属性*/}
  18. {/*单标签必须闭合*/}
  19. {/*@lt;img@gt;*/}{/*报错*/}
  20. {/*单标签正确写法*/}
  21. @lt;img/@gt;
  22. @lt;/div@gt;
  23. );
  24. }
  25. exportdefaultApp;

最后,JSX 最好使用一个小括号 () 包裹。

事件绑定

事件处理函数和事件绑定

  1. //事件处理函数
  2. constevent1=function(){
  3. alert('嘿嘿React')
  4. }
  5. functionApp(){
  6. return(
  7. @lt;div@gt;
  8. @lt;h1@gt;事件绑定@lt;/h1@gt;
  9. {/*事件名使用驼峰法命名、直接使用函数赋值,不是函数调用*/}
  10. @lt;buttononClick={event1}@gt;你点啊@lt;/button@gt;
  11. @lt;/div@gt;
  12. )
  13. }
  14. exportdefaultApp

事件传参

事件处理函数和事件绑定

因为事件绑定需要接收函数本身,作为事件处理,不能直接调用。

  1. //事件传参
  2. constevent1=function(name,age){
  3. alert(name)
  4. alert(age)
  5. }
  6. functionApp(){
  7. return(
  8. @lt;div@gt;
  9. @lt;h1@gt;事件绑定@lt;/h1@gt;
  10. {/*因为事件绑定需要接收函数本身,作为事件处理,不能直接调用*/}
  11. {/*因此传参需要使用箭头函数返回事件处理函数,而不能是函数调用*/}
  12. @lt;buttononClick={()=@gt;{event1('西岭',16)}}@gt;你点啊@lt;/button@gt;
  13. @lt;br/@gt;
  14. {/*或者使用bind等其方式,将函数本身作为返回值传入*/}
  15. @lt;buttononClick={event1.bind(null,'嬴政',999)}@gt;你再点一下试试@lt;/button@gt;
  16. {/*再次强调JSX就是JS扩展,就是JS*/}
  17. @lt;/div@gt;
  18. )
  19. }
  20. exportdefaultApp

因此传参需要使用箭头函数返回事件处理函数,而不能是函数调用,或者使用 bind 等其方式,将函数本身作为返回值传入。

再次强调 JSX 就是 JS 扩展,就是 JS。

事件对象传参

01 函数无传参:

事件对象默认传入,因此直接在事件处理函数中形参接收即可。

02 箭头函数传参:

因为事件对象有默认传入,而使用箭头函数时,则需要在箭头函数中传入后,再在箭头函数返回的函数中传入。

03 bind 等其方式:

将函数本身作为返回值传入,事件对象默认会添加在最后一个参数中。

无论有无参数传入,事件对象都不需要写,事件处理函数按顺序接收即可。

  1. //事件对象传参
  2. constevent1=function(ev){
  3. console.log(ev);
  4. }
  5. functionApp(){
  6. return(
  7. @lt;div@gt;
  8. @lt;h1@gt;事件绑定@lt;/h1@gt;
  9. {/*01函数无传参*/}
  10. {/*事件对象默认传入,因此直接在事件处理函数中形参接收即可*/}
  11. @lt;buttononClick={event1}@gt;点一下?@lt;/button@gt;@lt;br/@gt;
  12. {/*02箭头函数传参
  13. 因为事件对象有默认传入,而使用箭头函数时,则需要在箭头函数中传入后
  14. 再在箭头函数返回的函数中传入*/}
  15. @lt;buttononClick={(ev)=@gt;{event1(ev,'西岭',16)}}@gt;你点啊@lt;/button@gt;@lt;br/@gt;
  16. {/*03bind等其方式
  17. 将函数本身作为返回值传入,事件对象默认会添加在最后一个参数中
  18. 无论有无参数传入,事件对象都不需要写,事件处理函数按顺序接收即可*/}
  19. @lt;buttononClick={event1.bind(null)}@gt;你再点一下试试@lt;/button@gt;
  20. @lt;/div@gt;
  21. )
  22. }
  23. exportdefaultApp

列表渲染

JSX 默认会对数组进行结构,因此可以直接在 JSX 中展示数组的值。

  1. constitem1=[1,3,5]
  2. functionApp(){
  3. return(
  4. @lt;div@gt;
  5. {/*JSX默认会对数组进行结构*/}
  6. @lt;h1@gt;{item1}@lt;/h1@gt;
  7. @lt;/div@gt;
  8. )
  9. }
  10. exportdefaultApp

同理,如果数组元素值也是 JSX,同样可以进行直接使用。

  1. constitem1=[1,3,5]
  2. constitem2=[
  3. @lt;p@gt;item1@lt;/p@gt;,
  4. @lt;p@gt;item1@lt;/p@gt;,
  5. @lt;p@gt;item1@lt;/p@gt;
  6. ]
  7. functionApp(){
  8. return(
  9. @lt;div@gt;
  10. {/*JSX默认会对数组进行结构*/}
  11. @lt;h1@gt;{item1}@lt;/h1@gt;
  12. {/*数组值为jsx同样可以直接使用*/}
  13. @lt;div@gt;
  14. {item2}
  15. @lt;/div@gt;
  16. @lt;/div@gt;
  17. )
  18. }
  19. exportdefaultApp

而在项目中,大部分获取到的数组元素是对象数据,要对其进行结构展示,就需要对数组进行循环操作后使用。

  1. //数组数据
  2. constarr=[
  3. {id:1,name:'痴心绝对'},
  4. {id:2,name:'像我这样的人'},
  5. {id:3,name:'南山南'}
  6. ]
  7. //===数据遍历===
  8. functionloops(){
  9. vara2=[]
  10. //循环遍历数据
  11. for(vari=0;i@lt;arr.length;i++){
  12. //将数组内容结构为JSX数组
  13. a2.push(@lt;h1key={arr[i].id}@gt;{arr[i].name}@lt;/h1@gt;)
  14. }
  15. returna2
  16. }
  17. functionApp(){
  18. return(
  19. @lt;div@gt;
  20. {/*调用遍历函数,获取JSX数组展示*/}
  21. {loops()}
  22. @lt;/div@gt;
  23. )
  24. }
  25. exportdefaultApp

这样的方式因为过于繁琐,并不推荐使用。

但是,基本思路是不变的,因为 JSX 可以自动结构数组结构,我们只需要将数据的数据遍历为 JSX 数据形式使用就可以了,因此,我们可以选择一种更为优雅的遍历方式map() 函数。

  1. //数组数据
  2. constarr=[
  3. {id:1,name:'绝对痴心'},
  4. {id:2,name:'像我这样帅的人'},
  5. {id:3,name:'南山难'}
  6. ]
  7. functionApp(){
  8. return(
  9. @lt;div@gt;
  10. {/*map方法遍历数组*/}
  11. {arr.map(item=@gt;@lt;h3@gt;{item.id}--{item.name}@lt;/h3@gt;)}
  12. @lt;/div@gt;
  13. )
  14. }
  15. exportdefaultApp

样式设置

内联样式

样式需要以对象形式展示:

  1. //声明样式对象
  2. conststyles={
  3. color:'red',
  4. //样式的属性名需要处理,要么
  5. //font-size:'20px',//直接使用报错
  6. fontSize:'30px',//转大写√
  7. 'background-color':'pink'//引号包裹√
  8. }
  9. functionApp(){
  10. return(
  11. @lt;div@gt;
  12. {/*内联样式需要以对象形式展示*/}
  13. @lt;h3style={{color:@quot;red@quot;}}@gt;西岭老湿@lt;/h3@gt;
  14. @lt;pstyle={styles}@gt;真的很帅@lt;/p@gt;
  15. @lt;/div@gt;
  16. )
  17. }
  18. exportdefaultApp

外联样式

创建对应的 CSS 文件,使用模块化语法规则引入样式文件。

创建 CSS 文件 \src\App.css

  1. body{
  2. background-color:skyblue;
  3. color:blue;
  4. }
  5. .box{
  6. font-size:30px;
  7. }

\src\App.js

  1. //引入外联样式文件
  2. import'./App.css'
  3. functionApp(){
  4. return(
  5. @lt;div@gt;
  6. @lt;h3@gt;小蓝同学@lt;/h3@gt;
  7. @lt;pclassName=@quot;box@quot;@gt;胖蓝@lt;/p@gt;
  8. @lt;/div@gt;
  9. )
  10. }
  11. export default App

条件渲染

条件渲染就是函数调用。

  1. importReactfrom'react'
  2. importReactDomfrom'react-dom'
  3. varf=false
  4. constfun1=()=@gt;{
  5. if(f){
  6. return(@lt;h1@gt;哈哈哈哈@lt;/h1@gt;)
  7. }else{
  8. return(@lt;h2@gt;嘿嘿@lt;/h2@gt;)
  9. }
  10. }
  11. consttitle=(
  12. //使用括号,可以换行,代码更加整洁
  13. @lt;div@gt;
  14. {fun1()}
  15. @lt;/div@gt;
  16. )
  17. ReactDom.render(title,document.getElementById('root'))

原文链接:https://mp.weixin.qq.com/s/5o7cieCgHXy2dxDHvxLSMA

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。