React基础-JSX语法列表渲染详解

Posted 学全栈的灌汤包

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React基础-JSX语法列表渲染详解相关的知识,希望对你有一定的参考价值。

React列表渲染

真实开发中我们会从服务器请求到大量的数据,数据会以列表的形式存储:

比如歌曲、歌手、排行榜列表的数据;

比如商品、购物车、评论列表的数据;

比如好友消息、动态、联系人列表的数据;

在React中并没有像Vue模块语法中的v-for指令,而且需要我们通过JavaScript代码的方式组织数据,转成JSX:

很多从Vue转型到React的小伙伴非常不习惯,认为Vue的方式更加的简洁明了;

但是React中的JSX正是因为和javascript无缝的衔接,让它可以更加的灵活;

另外我经常会提到React是真正可以提高我们编写代码能力的一种方式;

如何展示列表呢?

在React中,展示列表最多的方式就是使用数组的map高阶函数;

class App extends React.Component 
  constructor() 
    super()

    this.state = 
      students: [
        name: "aaa", age: 18, score: 99, id: 101,
        name: "bbb", age: 19, score: 88, id: 102,
        name: "ccc", age: 17, score: 77, id: 103,
        name: "ddd", age: 17, score: 98, id: 104
      ] 
    
  

  render() 
    const  students  = this.state

    return (
      <div>
        
          students.map(stu => 
            return(
              <div key=stu.id>
                <h3>学号: stu.name</h3>
                <h3>年龄: stu.age</h3>
                <h3>成绩: stu.score</h3>  
              </div>
            )
          )
        
      </div>
    )
  


const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

很多时候我们在展示一个数组中的数据之前,需要先对它进行一些处理:

比如过滤掉一些内容:filter函数; 例如上面代码中, 要求展示学生分数大于80的

class App extends React.Component 
  constructor() 
    super()

    this.state = 
      students: [
        name: "aaa", age: 18, score: 99, id: 101,
        name: "bbb", age: 19, score: 88, id: 102,
        name: "ccc", age: 17, score: 77, id: 103,
        name: "ddd", age: 17, score: 98, id: 104
      ] 
    
  

  render() 
    const  students  = this.state

    // 对数组过滤再遍历
    const filterStudents = students.filter(item => 
      return item.score > 80
    )

    return (
      <div>
        
          filterStudents.map(stu => 
            return(
              <div key=stu.id>
                <h3>学号: stu.name</h3>
                <h3>年龄: stu.age</h3>
                <h3>成绩: stu.score</h3>  
              </div>
            )
          )
        
      </div>
    )
  


const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

比如截取数组中的一部分内容:slice函数, 例如上面代码中, 要求截取数组的前两条进行展示

class App extends React.Component 
  constructor() 
    super()

    this.state = 
      students: [
        name: "aaa", age: 18, score: 99, id: 101,
        name: "bbb", age: 19, score: 88, id: 102,
        name: "ccc", age: 17, score: 77, id: 103,
        name: "ddd", age: 17, score: 98, id: 104
      ] 
    
  

  render() 
    const  students  = this.state
    
    // 对数组截取再遍历
    const spliceStudents = students.splice(0,2)

    return (
      <div>
        
          spliceStudents.map(stu => 
            return(
              <div key=stu.id>
                <h3>学号: stu.name</h3>
                <h3>年龄: stu.age</h3>
                <h3>成绩: stu.score</h3>  
              </div>
            )
          )
        
      </div>
    )
  


const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

上面的操作先过滤, 再截取, 最后进行遍历, 其实可以通过链式调用一行代码完成

class App extends React.Component 
      constructor() 
        super()

        this.state = 
          students: [
            name: "aaa", age: 18, score: 99, id: 101,
            name: "bbb", age: 19, score: 88, id: 102,
            name: "ccc", age: 17, score: 77, id: 103,
            name: "ccc", age: 17, score: 77, id: 103,
            name: "ddd", age: 17, score: 98, id: 104
          ] 
        
      

      render() 
        const  students  = this.state

        return (
          <div>
            /* 链式调用, 一步操作完成 */
            
              students.filter(item => item.score > 80).splice(0, 2).map(stu => 
                return(
                  <div key=stu.id>
                    <h3>学号: stu.name</h3>
                    <h3>年龄: stu.age</h3>
                    <h3>成绩: stu.score</h3>  
                  </div>
                )
              )
            
          </div>
        )
      
    
    
    const app = ReactDOM.createRoot(document.querySelector("#app"))
    app.render(<App/>)

我们会发现在前面的代码中如果没有绑定key就会会报一个警告, 这个警告是告诉我们需要在列表展示的jsx中添加一个key

key主要的作用是为了提高diff算法时的效率;

react简述-react基础-jsx语法-jsx表达式-jsx动态属性-jsx列表渲染

react简述

1.1、概述

React 起源于Facebook的内部项目,它是一个用于构建用户界面的 javascript
库,Facebook用它来架设公司的Instagram网站,并于2013年5月开源。 React
拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。认为它可能是将来 Web 开发的主流工具之一。
React18是2022年3月29日正式发布,现在来说还是比较的新。

1.2、特点

💖声明式

  • 你只需要描述UI看起来是什么样式,就跟写HTML一样,React负责渲染UI,数据的声明

💖基于组件

  • 构建管理自身状态的封装组件,然后对其组合以构成复杂的 UI。由于组件逻辑使用 JavaScript
    编写而非模板,因此你可以轻松地在应用中传递数据,并保持状态与 DOM 分离。

💖学习一次,随处使用

  • 使用React可以开发Web应用(react-dom)也可以开发移动端(react-native)和小程序。

jsx语法

特点

ast=》虚拟dom=》render真实dom

由于通过React.createElement()方法创建的React元素有一些问题,代码比较繁琐,结构不直观,无法一眼看出描述的结构,不优雅,开发时写代码很不友好。
React使用 JSX 来替代常规的JavaScript,JSX 可以理解为的JavaScript语法扩展(超集),它里面的标签申明要符合XML规范要求。


💖jsx浏览器认识吗?
答:浏览器只能识别 js,对于jsx不能识别。


<!-- 1.引入react库文件 核心文件和dom解析文件 引入的顺序不能错 -->
<script src="./js/react.js"></script>
<script src="./js/react-dom.js"></script>
<!-- 引入babel解析 -->
<script src="./js/babel.js"></script>

通过 jsx生成一个虚拟dom

  • jsx浏览不能直接解析 需要一个babel解析器,解析
  • jsx它必须要有一个顶层元素包裹
  • const vnode = <div>你好React</div>
  • 注意如果使用jsx则一定要把type类型修改为text/babel<script type="text/babel">
const vnode = (
            <div>
                <h3>你好React</h3>
                <ul>
                    <li>新闻1</li>
                    <li>新闻2</li>
                </ul>
            </div>
        )

把react中的虚拟dom转成真实的dom并且挂载到页面根节点中
ReactDOM.render(虚拟dom,容器)

ReactDOM.render(vnode, document.getElementById('root'))
<div id="root"></div>
<script type="text/babel">
const vnode = (
    <div>
        <h3>你好React</h3>
        <ul>
            <li>新闻1</li>
            <li>新闻2</li>
        </ul>
    </div>
)
ReactDOM.render(vnode, document.getElementById('root'))

表达式

嵌入JSX表达式
在jsx语法中,要把JS代码写到 中,所有标签必须要闭合。

let username = '勇敢牛牛'
const run = ()=>'不怕困难'
let age = 18;
const vnode = (
    <div>
        
            // 单行注释
            /* 多行注释 */
        
        /* 字符串拼接 */
        <div>'aa' + 'bb' + username</div>
        /* 运算 */
        <div>1 + 1</div>
        /* 调用方法 */
        <div>run()</div>
        /* 3目运算,表达式中不能使用 for while if等块语句 3目运算在jsx中使用非常非常多 */
        <div>age < 18 ? '未成年' : <h3>成年</h3></div>
    </div>

jsx动态属性

  • jsx中如果你的属性为一个动态的值,则原来的引号不要写,用单个花括号,花括号中间写表达式
  • jsx中如果你用class定义外部样式名称,则class==>className,因为class它是js中的关键词,如果有多个class名称,则只能写一个
  • 如果你要对于一个class样式进行开关操作,需要用到3目运算符
  • style 内联样式,在jsx中,只能写对象 或者定义变量为对象传入
  • 表单项中有一个label标签,它有一个for属性,在jsx中换成htmlFor
  • html不转义输出dangerouslySetInnerHTML=__html:html字符串使用它有一定的安全问题,例如:xss攻击
 const vnode = (
 <div> 
     <img src="http://img.1314000.cn/face.png" title=title />   
     <div className='title ' + cname>title</div>
     <div className=false ? 'active' : ''>title</div>
     <div style= color: 'blue', fontSize: '30px'  >wqewq</div>
     <div>
         /*/<label for=""></label>'*/
         <label htmlFor="username">账号:</label>
         <input type="text" id='username' />
     </div>
     /*const html = '<h3>我是一个标题</h3>'*/
     <div>
         htmll    
     </div>
     <div dangerouslySetInnerHTML= __html: htmll ></div>    
 </div>
)

jsx列表渲染

  • 直接展开数组内容
  • 列表渲染 – 就是使用数组方法中的map进行映射就可以
    列表渲染,一定要在顶层元素中添加一个key,为了提升数据比对时的性能 dom的diff性能
 const users = [
      '张三',
      '李四',
      '王五'
    ]
========================
<div>users</div>
<div>
    users.map(item=>(<li key=item>item</li>))
</div>

以上是关于React基础-JSX语法列表渲染详解的主要内容,如果未能解决你的问题,请参考以下文章

React教程:JSX语法基础

React 语法基础之表达式和jsx

React 6/100 React原理 | setState | JSX语法转换 | 组件更新机制

React:JSX环境配置和基础语法,列表等操作

React学习第二步,JSX基础以及给JSX添加样式

React 简介 及 JSX语法