【Vue3 知识第五讲】条件渲染、列表渲染知识详解

news/2024/7/10 2:05:23 标签: 前端, javascript, vue, 条件渲染

文章目录

    • 一、条件渲染
      • 1.1 概述
      • 1.2 演示代码
    • 二、列表渲染
      • 2.1 使用 指令 v-for 遍历数组
      • 2.2 **使用 指令 v-for 遍历对象**
    • 十、案例作业
    • 十一、总结

前端开发过程中,条件和循环是经常被用到的逻辑。vue中封装了自己的组件渲染指令,可以更加方便的帮助开发者快速完成页面的布局。从而使得开发这个将更多的经历放在业务逻辑开发上面。下面我们就来讲一下这相关的几个指令的应用。

一、条件渲染

1.1 概述

指令 v-if、v-else-if 、v-else

​ 多个元素,通过条件判断动态的向DOM树内添加或者删除DOM元素,操作的是DOM结构

​ 应用场景:渲染后变化比较少,建议使用 v-if

数字化管理平台
Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus
权限系统-商城
个人博客地址

指令 v-show

​ 通过设置样式 display:none; 控制元素的隐藏和显示,此时元素已经渲染到页面,操作的是样式

​ 应用场景:渲染后变化比较多,从性能优化的角度来讲建议使用 v-show

1.2 演示代码

<script setup>
import { ref } from "vue"
const score = 80;
const obj = {
    name: "Jack",
    age: 23
}
let flag = ref(true)
</script>
<template>
    <div>
        <!-- v-if、v-else-if、v-else 三个条件渲染指令,直接操作dom;使用场景:页面第一次渲染的时候根据条件渲染对应的dom,且对DOM操作频率很低的情况下使用 -->
        <div v-if="score >= 90">学生成绩大于90,优秀</div>
        <div v-else-if="score >= 80">学生成绩大于80,良好</div>
        <div v-else-if="score >= 70">学生成绩大于70,中等</div>
        <div v-else-if="score >= 60">学生成绩大于60,及格</div>
        <div v-else>学生成绩小于60,不及格</div>

        <!-- v-if 可以单独,多次的使用;但是v-else-if、v-else必须要结合v-if去使用 -->


        <hr>
        <hr>
        <!-- v-show 操作的是样式,不管条件是否成立,都会操作dom -->
        <div v-show="score >= 90">学生成绩大于90,优秀</div>
        <div v-show="score >= 80 && score < 90">学生成绩大于80,良好</div>
        <div v-show="score >= 70 && score < 80">学生成绩大于70,中等</div>
        <div v-show="score >= 60 && score < 70">学生成绩大于60,及格</div>
        <div v-show="score <= 60 && score < 60">学生成绩小于60,不及格</div>
        <!-- v-show 是一个单独的指令,类似于 v-if 单独使用一样,每一个条件都是独立。 -->

        <hr>
        <hr>
        <button @click="flag = !flag">切换</button>
        <Transition>
            <div class="box" v-show="flag"></div>
        </Transition>
    </div>
</template>

<style scoped>
.box {
    height: 300px;
    background-color: blue;
}

/* 下面我们会解释这些 class 是做什么的 */
.v-enter-active,
.v-leave-active {
  transition: opacity 0.5s ease;
}

.v-enter-from,
.v-leave-to {
  opacity: 0;
}
</style>

二、列表渲染

2.1 使用 指令 v-for 遍历数组

语法 v-for = " (item, index) in arr "

参数 item代表数组中的每一项 index 代表每一项所对应的索引

key的作用 为了高效更新虚拟DOM,帮助Vue快速区分不同元素,用 key 来给每个节点做唯一标识

<script setup>
import { ref, reactive } from 'vue'

const arr = ["banana", "orange", "apple", "kiwi fruit", 'peal']

const stuData = ref([{
    idCard: 1,
    name: "Jack",
    age: 23
}, {
    idCard: 2,
    name: "Lucy",
    age: 18
}, {
    idCard: 3,
    name: "David",
    age: 26
}])

const addInfo = () => {
    console.log(stuData.value.length)
    stuData.value.push({
        idCard: stuData.value.length + 1,
        name:"luosi",
        age:23
    })
}
</script>
<template>
    <!-- v-for 指令可以实现数组和对象的列表数据渲染 -->
    <ul>
        <li :key="index" v-for="item,index in arr">{{ item }} ~ {{ index }}</li>
        <!-- <li>{{ arr[1] }}</li> -->
    </ul>
    <hr>
    <button @click="addInfo">添加一个学生信息</button>
    <ul>
        <li :key="item.idCard" v-for="item of stuData">
            编号:{{ item.idCard }}
            姓名:{{ item.name }}
            年龄:{{ item.age }}
        </li>
    </ul>
</template>
<style scoped>

</style>

2.2 使用 指令 v-for 遍历对象

语法 v-for = “( item, key, index) in obj”

参数 item代表对象中的每一项 key代表每一项对应的键名 index代表每一项对应的索引

<script setup>
import { ref, reactive } from 'vue'

const obj = reactive({
    idCard: 1,
    name: "张三",
    age: 23,
})

const addAttr = () => {
    console.log(obj)
    obj.sex = "男"
}
</script>
<template>
    <ul>
        <li :key="key" v-for="item,key in obj">{{ item }} ~ {{ key }}</li>
        <!-- <li>{{ obj.age }}</li> -->
    </ul>
    <br>
    <ul>
        <li v-for="item, key of obj">{{ item }} ~ {{ key }}</li>
    </ul>
    <button @click.once="addAttr">增加属性</button>
</template>
<style scoped>

</style>

注:2.x 版本中在一个元素上同时使用 v-if 和 v-for 时,v-for 会优先作用。而3.x 版本中 v-if 总是优先于 v-for 生效。由于语法上存在歧义,建议避免在同一元素上同时使用两者。

十、案例作业

在这里插入图片描述

十一、总结

v-if指令 作为一个条件渲染,当他为true的时候才会渲染出当前的节点

v-for指令基于一个数组来渲染列表 ,v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组或者对象,而 item 则是被迭代的数组元素的别名 在v-for的时候都会被要求设置Key值,而且每一个Key值都是独一无二的。

但在使用两种类型的指令时需要注意:

  • 永远不要把 v-if 和 v-for 同时用在一个元素上,带来性能方面的浪费(每次渲染都会先循环再进行条件判断)
  • 如果避免出现这种情况,则在外层嵌套 template (页面渲染不生成dom节点),再这一层进行 v-if 判断,然后再内部进行 v-for 循环
javascript"><template v-for="(item) in textValue">
      <div  :key="item.text" v-if="item.show" >{{item.text}}</div>
</template>

且需要注意的是:两者混合使用,在vue2和vue3中的优先级是不同的。


http://www.niftyadmin.cn/n/4990501.html

相关文章

React和Redux中的不变性

https://overreacted.io/zh-hans/a-complete-guide-to-useeffect/ 一、不变性和副作用 1.不变&#xff1a;不断创造新值来替换旧值 2.不变性规则&#xff1a; &#xff08;1&#xff09;当给定相同的输入时&#xff0c;纯函数必须始终返回相同的值 &#xff08;2&#xff0…

昨天面试的时候被提问到的问题集合。

1、vue的双向绑定原理是什么&#xff1f;里面的关键点在哪里&#xff1f; 2、实现水平垂直居中的方式&#xff1f; 3、常用伪元素有哪一些&#xff1f; 4、移动端如何适配不同屏幕尺寸&#xff1f; 5、本地存储有哪一些&#xff1f;他们三者有什么区别&#xff1f; 6、JS的数据…

浅谈Linux中的mkdir -p

mkdir 是一个用于创建目录&#xff08;目录树&#xff09;的 Unix 和 Linux 命令。-p 选项允许创建一个目录和它不存在的父目录。换句话说&#xff0c;-p 选项确保了指定的整个目录路径都会被创建。 基础用法 如果你只是运行 mkdir new_directory&#xff0c;这个命令会尝试在…

python:一篇文章掌握ACM模式下的所有情况输入

这里写目录标题 1.AB(1)2.AB(2)3.AB(3)4.AB(4)5.AB(5)6.AB(6)7.AB(7)8.字符串排序(1)9.字符串排序(2)10.字符串排序(3)11.链表&#xff08;将输入的数组转为单链表&#xff09;12.二叉树&#xff08;将输入的数组转为二叉树&#xff09; 1.AB(1) 输入描述&#xff1a; 输入包括…

前端面试基础面试题——4

1.谈谈你对 ES6 的理解 2.说说你对 promise 的了解 3.解构赋值及其原理 4.Vue常用的修饰符及使用的场景 5.vue 中 key 值的作用 6.什么是 vue 的计算属性&#xff1f; 7.watch的作用是什么 8.计算属性的缓存和方法调用的区别 9.响应式系统的基本原理 10.vue-loader …

Python基础篇(16):python中__new__方法

一、__new__方法的定义 __new__() 方法是一种负责创建 类实例 的 静态方法 二、__new__方法的作用 在内存中为对象分配空间返回对象的引用 三、__new__方法的使用 创建对象时自动调用__new__方法&#xff0c;并且是在__init__初始化方法之前被调用Python解释器获得对象的引…

Java无锁并发工具类Unsafe.compareAndSwapLong方法

compareAndSwapLong方法是一个原子操作&#xff0c;通常用于并发编程中的无锁算法。它的作用是以原子方式比较并交换某个对象的一个long类型的字段。具体来说&#xff0c;它接收4个参数&#xff1a; Object obj: 需要操作的对象。long offset: obj中要操作的字段的内存偏移量。…

C++ Qt QModbusClient 的使用

在C Qt中使用QModbusClient进行Modbus通信&#xff0c;您可以按照以下步骤进行操作&#xff1a; 包含必要的头文件&#xff1a; #include <QModbusClient> #include <QModbusDataUnit> #include <QModbusTcpClient> // 如果使用TCP连接 #include <QModb…