React入门第二步:搞懂JSX语法

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

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

基本使用

\src\index.js

 
 
 
 
  1. import React from 'react'
  2. import ReactDom from 'react-dom'
  3. // 看上去是 HTML,但是实际是JSX 
  4. const title = 

    Hello React

  5. // 调用 ReactDom.render方法,传入 jsx和节点对象
  6. ReactDom.render(title,document.getElementById('root'))

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

 
 
 
 
  1. import React from 'react'
  2. import ReactDom from 'react-dom'
  3. // 使用括号包裹jsx ,可以换行,代码更加整洁
  4. const title = (
  5.   
  6.    

    Hello React

  7.     嘿嘿嘿
  8.   
  • )
  • ReactDom.render(title,document.getElementById('root'))
  • 设置 VS Code 编辑器,让 JSX 代码补全:

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

    如下图所示:

    JSX 表达式

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

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

    接下来,我们开始搞它:

     
     
     
     
    1. import React from 'react';
    2. import ReactDOM from 'react-dom';
    3. const name= '西岭老湿'
    4. function sayHello () {
    5.   return '大家好'
    6. }
    7. const obj = {
    8.   name: '刘备',
    9.   age: 100
    10. }
    11. const flag = true
    12. // 请开始你的表演====
    13. const title = (

      嘿嘿

      ) // JSX 本身也是可直接食用的值哟
    14. const App = (
    15.     
    16.       {/* 注释在 jsx 中是这么个熊样子*/}
    17.      

      name

       {/* 这就鸳鸯(原样)展示了*/}
    18.      

      {name}

       {/* 动态获取变量数据 */}
    19.      

      {sayHello()}

       {/* 调用个函数违法吗? 不 */}
    20.       {/* 执行原生 JS 不合理吗? 合理 */}
    21.      

      {console.log('1111')}

    22.      

      {Math.random()}

    23.      

      {JSON.stringify(obj)}

    24.       {/* 三元运算让你吃醋了? 没有 */}
    25.      

      {flag ? '登录的状态' :'执行登录'}

    26.       {/* 模板字符下,字符串和变量结婚,可以吗? 可以 */}
    27.      

      {`hello, ${name}`}

    28.       {/* JSX 也是可直接食用的值哟 */}
    29.      
      {title}
    30.     
  •   )
  • ReactDOM.render(App,document.getElementById('root'));
  • 字符串属性,直接使用双引号包裹

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

    JSX 只有一个父元素

     
     
     
     
    1. // 01 jsx 本身就是一个表达式
    2. const names = 

      西岭老湿

    3. // 02 添加属性
    4. const age =99
    5. // 03 jsx 添加子元素(JSX只有一个父元素)
    6. // 04 单标签必须闭合
    7. // 组件
    8. functionApp() {
    9.   return (
    10.     // 返回中只能有一个JSX 块
    11.     // 

       // 报错
    12.     
    13.       {/* jsx 本身就是一个表达式 */}
    14.       {names}
    15.       {/* 添加属性 */}
    16.       用户年龄属性

      {/* 字符串属性 */}
    17.       用户年龄属性

      {/* 动态属性 */}
    18.       {/* 单标签必须闭合 */}
    19.       {/*    */}{/*报错*/}
    20.       {/* 单标签正确写法 */}
    21.       
    22.     
  •   );
  • }
  • exportdefault App;
  • 最后,JSX 最好使用一个小括号 () 包裹。

    事件绑定

    事件处理函数和事件绑定

     
     
     
     
    1. // 事件处理函数
    2. const event1 =function(){
    3.   alert('嘿嘿 React')
    4. }
    5. functionApp (){
    6.   return (
    7.     
    8.       

      事件绑定

    9.       {/* 事件名使用驼峰法命名、直接使用函数赋值,不是函数调用 */}
    10.       你点啊
    11.     
    12.   )
    13. }
    14. exportdefault App

    事件传参

    事件处理函数和事件绑定

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

     
     
     
     
    1. //事件传参
    2. const event1 =function(name,age){
    3.   alert(name)
    4.   alert(age)
    5. }
    6. functionApp (){
    7.   return (
    8.     
    9.       

      事件绑定

    10.       {/* 因为事件绑定需要接收函数本身,作为事件处理,不能直接调用 */}
    11.       {/* 因此传参需要使用箭头函数返回事件处理函数,而不能是函数调用 */}
    12.       {event1('西岭',16)}}>你点啊
    13.       
    14.       {/* 或者使用 bind等其方式,将函数本身作为返回值传入 */}
    15.       你再点一下试试
    16.       {/* 再次强调 JSX 就是 JS 扩展,就是JS  */}
    17.     
    18.   )
    19. }
    20. exportdefault App

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

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

    事件对象传参

    01 函数无传参:

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

    02 箭头函数传参:

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

    03 bind 等其方式:

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

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

     
     
     
     
    1. // 事件对象传参
    2. const event1 =function (ev) {
    3.   console.log(ev);
    4. }
    5. functionApp() {
    6.   return (
    7.     
    8.       

      事件绑定

    9.       {/* 01 函数无传参 */}
    10.       {/* 事件对象默认传入,因此直接在事件处理函数中形参接收即可 */}
    11.       点一下?  
    12.       {/* 02 箭头函数传参
    13.       因为事件对象有默认传入,而使用箭头函数时,则需要在箭头函数中传入后
    14.       再在箭头函数返回的函数中传入 */}
    15.        { event1(ev,'西岭',16) }}>你点啊
    16.       {/* 03 bind 等其方式
    17.       将函数本身作为返回值传入,事件对象默认会添加在最后一个参数中
    18.       无论有无参数传入,事件对象都不需要写,事件处理函数按顺序接收即可 */}
    19.       你再点一下试试
    20.     
    21.   )
    22. }
    23. exportdefault App

    列表渲染

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

     
     
     
     
    1. const item1 = [1,3,5]
    2. functionApp() {
    3.   return (
    4.     
    5.       {/* JSX 默认会对数组进行结构 */}
    6.       

      {item1}

    7.     
    8.   )
    9. }
    10. exportdefault App

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

     
     
     
     
    1. const item1 = [1,3,5]
    2. const item2 = [
    3.   

      item1

      ,
    4.   

      item1

      ,
    5.   

      item1

    6. ]
    7. functionApp() {
    8.   return (
    9.     
    10.       {/* JSX 默认会对数组进行结构 */}
    11.       

      {item1}

    12.       {/* 数组值为 jsx 同样可以直接使用*/}
    13.       
    14.         {item2}
    15.       
    16.     
    17.   )
    18. }
    19. exportdefault App

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

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

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

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

     
     
     
     
    1. // 数组数据
    2. const arr = [
    3.   { id:1,name:'绝对痴心' },
    4.   { id:2,name:'像我这样帅的人' },
    5.   { id:3,name:'南山难' }
    6. ]
    7. functionApp() {
    8.   return (
    9.     
    10.       {/* map 方法遍历数组 */}
    11.       {arr.map(item=>

      {item.id}--{item.name}

       )}
    12.     
    13.   )
    14. }
    15. exportdefault App

    样式设置

    内联样式

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

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

    15.     
    16.   )
    17. }
    18. exportdefault App

    外联样式

    创建对应的 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. function App (){
    4.   return (
    5.     
    6.       

      小蓝同学

    7.       胖蓝

    8.     
    9.   )
    10. }
    11. export default App

    条件渲染

    条件渲染就是函数调用。

     
     
     
     
    1. import React from 'react'
    2. import ReactDom from 'react-dom'
    3. var f = false
    4. const fun1 = ()=>{
    5.     if(f){
    6.       return(

      哈哈哈哈

      )
    7.     }else{
    8.       return(

      嘿嘿

      )
    9.     }
    10. }
    11. const title = (
    12.   // 使用括号,可以换行,代码更加整洁
    13.   
    14.     {fun1()}
    15.   
    16. )
    17. ReactDom.render(title,document.getElementById('root'))

    当前标题:React入门第二步:搞懂JSX语法
    标题网址:http://www.mswzjz.cn/qtweb/news43/351643.html

    攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能

    贝锐智能技术为您推荐以下文章

    网站导航知识

    分类信息网站