Vue学习笔记(四) 条件渲染和列表渲染

简介: Vue学习笔记(四) 条件渲染和列表渲染


1、条件渲染


(1)v-if


v-if 指令 用于条件性(根据表达式的值)渲染内容,可以与 v-else 指令v-else-if 指令 一同使用

<!DOCTYPE html>
<html>
<head>
    <title>Demo</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <p v-if="type === 'A'">A</p>
        <p v-else-if="type === 'B'">B</p>
        <p v-else-if="type === 'C'">C</p>
        <p v-else>Else</p>
    </div>
    <script>
        new Vue({
            el: '#app',
            data: {
                type: 'A'
            }
        })
    </script>
</body>
</html>


(2)v-if & v-show


v-show 指令 同样可以根据表达式的真假渲染内容

<!DOCTYPE html>
<html>
<head>
    <title>Demo</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <p v-show="isSeen">A</p>
    </div>
    <script>
        new Vue({
            el: '#app',
            data: {
                isSeen: true
            }
        })
    </script>
</body>
</html>


它们不同之处在于:v-if 是直接添加或删除 DOM 元素,而 v-show 是修改元素的 display 属性

因此,v-if 适用于相对稳定的元素,v-show 适用于频繁切换的元素


(3)template


v-if 是一个指令,因此必须添加到一个元素上,如果希望同时添加到多个元素上该怎么办呢?

可以使用 <template> 元素当做不可见的包裹元素,并在上面使用 v-if

<!DOCTYPE html>
<html>
<head>
    <title>Demo</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <template v-if="isOk">
            <h1>Title</h1>
            <p>Paragraph 1</p>
            <p>Paragraph 2</p>
        </template>
    </div>
    <script>
        new Vue({
            el: '#app',
            data: {
                isOk: true
            }
        })
    </script>
</body>
</html>



2、列表渲染


v-for 指令 用于渲染一个列表


(1)使用数组


<!DOCTYPE html>
<html>
<head>
    <title>Demo</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <ul>
            <li v-for="item in items">
                {{ item.message }}
            </li>
        </ul>
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                items: [
                    { message: 'Hello' },
                    { message: 'Hi' }
                ]
            }
        })
    </script>
</body>
</html>


v-for 用于数组时,还支持可选的第二个参数,即当前项的索引:v-for="(item, index) in items"


(2)使用对象


<!DOCTYPE html>
<html>
<head>
    <title>Demo</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <ul>
            <li v-for="value in object">
                {{ value }}
            </li>
        </ul>
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                object: {
                    firstName: 'Steve',
                    lastName: 'Jobs'
                }
            }
        })
    </script>
</body>
</html>


v-for 用于对象时,还支持一个可选的第二个参数,即当前项的键:v-for="(value, key) in object"

还支持一个可选的第三个参数,即当前项的索引:v-for="(value, key, index) in object"


(3)使用整数


<!DOCTYPE html>
<html>
<head>
    <title>Demo</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <span v-for="n in 10">{{ n }} </span>
    </div>
    <script>
        var vm = new Vue({
            el: '#app'
        })
    </script>
</body>
</html>


(4)维护状态


当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用 “就地更新” 的策略

也就是说,如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序

而是就地更新每个元素,并且确保它们在每个索引位置正确渲染

因此为了跟踪每个节点,我们需要为每一个项提供一个唯一的 key(一般使用基本属性作为 key

<div v-for="item in items" v-bind:key="item.id">
  <!-- 内容 -->
</div>


(5)数组 更新检测


对于数组而言,使用变异方法会自动触发视图更新,变异方法包括:

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()
// 可以尝试在控制台中直接对前面的例子调用变异方法
vm.items.push({ message: 'Goodbye'})


而使用非变异方法则总是返回一个新数组,可以使用新数组替代旧数组以触发视图更新,非变异方法包括:

  • filter()
  • concat()
  • slice()
// 可以尝试在控制台中对前面的例子调用非变异方法,使用新数组替代旧数组
vm.items = vm.items.filter(function (item) {
  return item.message.match(/Hi/)
})


注意,还有以下两种情况不能检测数组的变化:


  1. 利用索引设置数组的值,例如 vm.items[indexOfItem] = newValue
  2. 修改数组的长度,例如 vm.items.length = newLength

这时,我们都可以使用变异方法 splice() 解决:

  1. 利用索引设置数组的值,vm.items.splice(indexOfItem, 1, newValue)
  2. 修改数组的长度,vm.items.splice(newLength)


(6)对象 变更检测


以下的情况同样不能检测对象的变化:

  1. 添加对象属性,例如 vm.newValue = value (此时,newValue 不是响应式属性)

这时,我们可以使用实例方法 vm.$set 解决:

  1. 添加对象属性,vm.$set(object, propertyName, value)

文章知识点与官方知识档案匹配,可进一步学习相关知识

目录
相关文章
|
8月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
685 2
|
7月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
589 137
|
9月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
953 1
|
10月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
501 0
|
存储 前端开发 JavaScript
为什么我不再用Vue,改用React?
当我走进现代前端开发行业的时候,我做了一个每位开发人员都要做的决策:选择一个合适的框架。当时正逢 jQuery 被淘汰,前端开发者们不再用它编写难看的、非结构化的老式 JavaScript 程序了。
|
11月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
1133 0
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
1419 4
|
11月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
12月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
1612 78
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍