写点什么

Vue.js 条件渲染与列表渲染指南 _

  • 2024-05-27
    福建
  • 本文字数:10208 字

    阅读完需:约 33 分钟


第 1 章:Vue.js 基础与环境设置


1.1 Vue.js 简介


Vue.js (读音:/vjuː/,类似于 "view") 是一套用于构建用户界面的渐进式 JavaScript 框架。与其他大型框架不同的是,Vue.js 被设计为可以自底向上逐层应用。这意味着,你可以在一个大型的单页应用中或者可复用的组件库中使用 Vue,同时也可以将 Vue 用于简单的页面级别的交互。


Vue.js 的核心库只关注视图层,不包含任何其他功能,这让它比其他大型框架更加轻量级、易用。如果需要,你还可以使用 Vue.js 生态系统中的一系列高质量的可选工具和库,例如 vue-router、vuex、vue-resource 等。


1.2 安装与配置


1.2.1 使用 CDN 加载


将以下代码添加到你的 HTML 中:

<!DOCTYPE html><html><head>    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><div id="app">    {{ message }}</div><script>    new Vue({        el: '#app',        data: {            message: 'Hello Vue!'        }    })</script></body></html>
复制代码


1.2.2 使用 npm 安装


首先,需要安装 Node.js 和 npm。确保已安装最新版本,可以从Node.js 官方网站下载。


接下来,在终端中执行以下命令:

npm install -g @vue/cli
复制代码


创建一个新项目:

vue create my-project
复制代码


选择 "Manually select features",然后选择 "Vue 3" 和 "Router",最后选择 "In dedicated config files" 以进行更细粒度的配置。


1.3 Vue 的核心概念:组件、数据绑定与响应式系统


1.3.1 组件


组件是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,带有数据、逻辑和方法等,也可以在不同的组件中复用。


在 Vue.js 中,每个 Vue 实例都是一个组件,可以通过el选项,将它们安装到 DOM 上。


1.3.2 数据绑定


数据绑定是 Vue.js 的核心功能之一。在 Vue.js 中,数据绑定可以用{{ }}标签或 v-bind 指令来实现。


<div id="app"> <p v-bind:title="message"> 鼠标悬停几秒钟查看此处动态绑定的提示信息! </p> <p>{{ message }}</p></div><script> new Vue({ el: '#app', data: { message: '页面加载于 ' + new Date().toLocaleString() } })</script>
复制代码


1.3.3 响应式系统


Vue.js 的响应式系统会在数据变化时,自动更新 DOM。这意味着,你可以在 Vue.js 中,将数据绑定到模板中,当数据发生变化时,模板会自动更新。

<div id="app">  {{ message }}</div><script>  new Vue({    el: '#app',    data: {      message: 'Hello Vue.js!'    }  })</script>
复制代码


在这个示例中,当你更改message的值时,视图会自动更新。


第 2 章:条件渲染基础


2.1 v-if 与 v-show


Vue.js 提供了两种条件渲染的方法:v-ifv-show


v-if是“真正”的条件渲染,因为它会在条件不满足时完全删除 DOM 元素。


v-show只是简单地切换 CSS 属性display


v-if也是“惰性”的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。


v-if也是可以与v-elsev-else-if一起使用的:

<div id="app">  <p v-if="Math.random() > 0.5">这是一个随机数大于 0.5 的段落。</p>  <p v-else>这是一个随机数小于 0.5 的段落。</p></div>
复制代码


2.2 逻辑运算符与三元表达式


Vue.js 支持使用 JavaScript 中的所有逻辑运算符:!&&||

<div id="app">  <p v-if="type === 'A'">这是类型为 A 的段落。</p>  <p v-else-if="type === 'B'">这是类型为 B 的段落。</p>  <p v-else>这是类型不是 A 或 B 的段落。</p></div>
复制代码


你也可以使用三元表达式:

<div id="app">  {{ message.length > 0 ? message : '没有消息' }}</div>
复制代码


2.3 computed 属性与条件渲染


computed属性是 Vue.js 中的一个计算属性,可以用于条件渲染中。

<div id="app">  <p v-if="isEven">{{ message }} 是偶数。</p>  <p v-else>{{ message }} 是奇数。</p></div><script>  new Vue({    el: '#app',    data: {      message: 10    },    computed: {      isEven: function () {        return this.message % 2 === 0      }    }  })</script>
复制代码


2.4 递归组件与列表条件渲染


在 Vue.js 中,可以使用name选项来递归组件。

<div id="app">  <tree :data="data"></tree></div><script>  Vue.component('tree', {    template: `      <ul>        <li v-for="(item, index) in data" :key="index">          {{ item.name }}          <tree v-if="item.children" :data="item.children"></tree>        </li>      </ul>    `,    props: {      data: {        type: Array,        required: true      }    }  })
new Vue({ el: '#app', data: { data: [ { name: 'A', children: [ { name: 'A1' }, { name: 'A2', children: [ { name: 'A2-1' }, { name: 'A2-2' } ] } ] }, { name: 'B' }, { name: 'C' } ] } })</script>
复制代码


在这个示例中,我们使用了v-for指令来渲染列表,并使用了递归组件tree来渲染树结构。


第 3 章:列表渲染与循环


3.1 v-for 指令


v-for指令是 Vue.js 中用于渲染列表的常用指令。它基于一个数组或者对象来重复渲染一个模板。基本的语法是:

<template v-for="item in items">  <!-- 模板内容 --></template>
复制代码


这里,items是一个数组或者对象,item是当前迭代的元素。


3.2 动态列表与响应式数组


在 Vue 中,列表渲染不仅仅是静态的,它还可以是动态的。这意味着,当源数据发生变化时,Vue 可以自动更新渲染的列表。这是通过响应式系统实现的,Vue 会对数组的变化做出追踪,并更新 DOM。


3.3 key 属性的重要性


在使用v-for渲染列表时,推荐为每个列表项设置一个唯一的key属性。这有助于 Vue 追踪每个节点的身份,从而重用和重新排序现有元素。如果没有key,Vue 会默认使用元素的index作为其身份标识,这可能在列表排序或数据更新时导致问题。


3.4 具有复杂条件的列表渲染


有时候,我们可能需要根据复杂的条件来渲染列表。Vue.js 允许我们通过在模板中使用三元表达式或计算属性来处理这些情况。


例如,我们可以使用计算属性来确定是否应该渲染某个列表项:

<ul>  <li v-for="(item, index) in items" :key="index">    {{ item.name }}    <!-- 使用计算属性来判断是否显示子列表 -->    <ul v-if="shouldShowChildren(item)">      <li v-for="child in item.children" :key="child.id">        {{ child.name }}      </li>    </ul>  </li></ul>
复制代码


在这个例子中,shouldShowChildren是一个计算属性,它根据item的某些条件来决定是否渲染子列表。


第 4 章:动态数据绑定与响应式更新


4.1 动态绑定与自定义指令


Vue.js 的核心特性之一就是它的动态数据绑定。开发者可以使用v-bind指令或简写:来动态地将数据绑定到视图上的元素上。这种绑定是单向的,即从数据模型到视图。但是,有时候我们需要更复杂的绑定,比如双向数据绑定或自定义行为。这时,我们可以使用自定义指令。


自定义指令允许我们定义自己的 HTML 属性,它们可以有 own watcher,可以被链式调用,并且可以访问组件的context


4.2 数据劫持与深度监听


Vue.js 通过数据劫持(或称响应式系统)来实现数据的自动更新。在 Vue 2 中,这是通过 Object.defineProperty 实现的,而在 Vue 3 中,则是使用 Proxy 对象。数据劫持允许 Vue 追踪数据的变化,当数据变化时,视图可以自动更新。


深度监听是指 Vue 是否应该监听对象内部属性的变化。在 Vue 2 中,默认情况下,Vue 不会深度监听嵌套对象的变化。但是,在 Vue 3 中,深度监听是默认开启的。


4.3 数据变化检测的策略


Vue.js 使用了多种策略来检测数据的变化。其中包括:


  1. 直接侦听器(Direct 侦听器) :这是最基础的侦听器,它会对基础数据类型(如 number、string、boolean)进行侦听。

  2. 对象侦听器(Object 侦听器) :对于对象类型的数据,Vue 会使用一个代理对象来侦听对象的变化。

  3. 数组侦听器(Array 侦听器) :对于数组类型的数据,Vue 会使用一个“重排”策略来侦听数组的变化。这是因为数组的变化可能是通过索引来进行的,而不是通过对象属性的方式。

  4. 函数侦听器(Function 侦听器) :对于函数类型的数据,Vue 会侦听其字符串值的变化。


这些策略共同工作,确保了 Vue 能够准确地检测到数据的变化,并相应地更新视图。


第 5 章:数组操作与列表管理


5.1 数组方法的应用


在 Vue.js 中,数组是常用的数据结构,用于存储和展示列表数据。Vue.js 提供了一些数组方法,可以方便地对数组进行操作,例如pushpopshiftunshiftsplice等。这些方法可以用于添加、删除、修改和查询数组元素,是实现列表管理的重要工具。


5.2 push、pop、shift 与 unshift


  • push方法:可以在数组的末尾添加一个或多个元素,并返回数组的新长度。

  • pop方法:可以删除数组的最后一个元素,并返回该元素的值。

  • shift方法:可以删除数组的第一个元素,并返回该元素的值。

  • unshift方法:可以在数组的开头添加一个或多个元素,并返回数组的新长度。


在使用这些方法时,需要注意以下几点:

  • push方法和unshift方法可以添加多个元素,元素之间用逗号分隔。

  • pop方法和shift方法只能删除一个元素,不能删除多个元素。

  • pop方法和shift方法会改变数组的长度,而push方法和unshift方法不会改变数组的长度。


5.3 splice 与数组切片


  • splice方法:可以删除、替换或添加数组元素,并返回被删除的元素组成的数组。

  • slice方法:可以返回数组的一个切片,即从原数组中选取一部分元素组成的新数组。


在使用这些方法时,需要注意以下几点:


  • splice方法可以接收多个参数,第一个参数表示要删除或替换的元素的起始位置,第二个参数表示要删除的元素的数量,后面的参数表示要添加的元素。

  • slice方法可以接收两个参数,第一个参数表示要选取的元素的起始位置,第二个参数表示要选取的元素的结束位置(不包括该位置的元素)。

  • splice方法会改变原数组,而slice方法不会改变原数组。


5.4 分页与懒加载策略


在 Vue.js 中,分页和懒加载是常用的列表管理策略。分页可以将大量数据分成多个页面展示,提高用户体验和性能。懒加载可以在用户滚动页面时动态加载数据,减少页面加载时间和流量消耗。


在使用分页和懒加载时,需要注意以下几点:


  • 分页可以使用v-for指令和计算属性实现,计算属性可以根据当前页码和每页显示的数据量计算出要展示的数据。

  • 懒加载可以使用Intersection Observer API实现,该 API 可以在元素进入视口时触发回调函数,可以在回调函数中加载数据。

  • 分页和懒加载都需要考虑数据的缓存和去重,避免重复加载和展示相同的数据。


第 6 章:列表渲染进阶:虚拟 DOM 与性能优化


6.1 虚拟 DOM 的原理


虚拟 DOM 是 Vue.js 中使用的一种技术,用于优化列表渲染的性能。虚拟 DOM 是一个轻量级的 JavaScript 对象,可以表示一个 DOM 节点,包含节点的类型、属性和子节点。


虚拟 DOM 的优势在于可以在内存中进行 Diff 操作,比较新旧虚拟 DOM 的差异,并生成最小化的 DOM 更新操作。这样可以减少不必要的 DOM 操作,提高列表渲染的性能。


6.2 性能优化技巧


在使用虚拟 DOM 时,可以使用以下技巧进行性能优化:


  • 使用key属性:可以使用key属性来标识列表中的每个项,可以提高 Diff 操作的性能。

  • 使用v-show指令:可以使用v-show指令来控制元素的显示和隐藏,可以避免不必要的 DOM 操作。

  • 使用v-ifv-for指令:可以使用v-ifv-for指令来控制元素的渲染,可以避免不必要的渲染操作。

  • 使用v-once指令:可以使用v-once指令来标记元素的不可变性,可以避免不必要的更新操作。


6.3 ref 与 $refs 的使用


在 Vue.js 中,可以使用ref属性来获取元素的引用,可以用于操作元素的属性和方法。可以在模板中使用ref属性来为元素添加一个引用,可以在组件的方法中使用this.$refs来获取元素的引用。


示例代码:

<template>  <div>    <input type="text" ref="input">    <button @click="handleClick">点击</button>  </div></template>
<script>export default { methods: { handleClick() { this.$refs.input.focus(); } }}</script>
复制代码


在上面的示例代码中,使用ref属性为输入框添加了一个引用,可以在点击按钮时调用输入框的focus方法。


6.4 虚拟列表与列表渲染性能提升


在 Vue.js 中,可以使用虚拟列表来优化列表渲染的性能。虚拟列表可以将大量数据分成多个页面展示,并仅渲染可见部分的数据,可以减少不必要的渲染操作,提高列表渲染的性能。


可以使用v-for指令和计算属性来实现虚拟列表,计算属性可以根据当前页码和每页显示的数据量计算出要展示的数据。可以使用Intersection Observer API来监听元素的可见性,可以在元素进入视口时加载数据。


示例代码:

<template>  <div>    <ul>      <li v-for="(item, index) in visibleData" :key="index">{{ item }}</li>    </ul>    <button @click="handleClick">加载更多</button>  </div></template>
<script>import { IntersectionObserver } from 'intersection-observer';
export default { data() { return { data: [], pageSize: 10, pageIndex: 1, observer: null }; }, computed: { visibleData() { return this.data.slice((this.pageIndex - 1) * this.pageSize, this.pageIndex * this.pageSize); } }, mounted() { this.observer = new IntersectionObserver(entries => { if (entries[0].isIntersecting) { this.pageIndex++; } }); this.observer.observe(this.$refs.observer); }, methods: { handleClick() { this.pageIndex++; } }}</script>
复制代码


在上面的示例代码中,使用v-for指令和计算属性来实现虚拟列表,可以在点击按钮时加载更多数据。使用Intersection Observer API来监听元素的可见性,可以在元素进入视口时加载数据。


第 7 章:Vue Router 与列表状态管理


7.1 Vue Router 集成


Vue Router 是 Vue.js 的官方路由器,可以用于实现单页应用(SPA)的导航和路由。可以在 Vue.js 中使用 Vue Router 来管理组件之间的跳转和传参。


可以使用vue-router包来安装 Vue Router,可以在main.js中进行路由器的配置,可以使用router-linkrouter-view组件来实现组件之间的跳转和渲染。


示例代码:

import Vue from 'vue';import VueRouter from 'vue-router';import Home from './components/Home.vue';import About from './components/About.vue';
Vue.use(VueRouter);
const router = new VueRouter({ routes: [ { path: '/', component: Home }, { path: '/about', component: About } ]});
new Vue({ router, render: h => h(App)}).$mount('#app');
复制代码


在上面的示例代码中,使用vue-router包来安装 Vue Router,并在main.js中进行路由器的配置。使用router-linkrouter-view组件来实现组件之间的跳转和渲染。


7.2 状态管理:Vuex 简介


Vuex 是 Vue.js 的官方状态管理库,可以用于管理组件之间的共享状态。可以使用 Vuex 来实现单向数据流,可以避免组件之间的耦合,提高组件的可重用性。


可以使用vuex包来安装 Vuex,可以在store.js中进行状态管理的配置,可以使用mapStatemapMutations等辅助函数来在组件中使用状态和操作。


示例代码:

import Vue from 'vue';import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++; } }});
export default store;
复制代码


在上面的示例代码中,使用vuex包来安装 Vuex,并在store.js中进行状态管理的配置。使用mapStatemapMutations等辅助函数来在组件中使用状态和操作。


7.3 状态管理在列表渲染中的应用


在列表渲染中,可以使用状态管理来管理列表的状态,可以避免在多个组件中重复的状态管理,提高组件的可重用性。


可以在 Vuex 中创建一个list模块,可以在模块中维护一个list数组,可以在模块中创建一个addItem操作,可以在组件中调用操作来添加列表项。


示例代码:

// store.jsimport Vue from 'vue';import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({ modules: { list: { state: { list: [] }, mutations: { addItem(state, item) { state.list.push(item); } } } }});
export default store;
// List.vue<template> <div> <input type="text" v-model="item"> <button @click="addItem">添加</button> <ul> <li v-for="(item, index) in list" :key="index">{{ item }}</li> </ul> </div></template>
<script>import { mapMutations } from 'vuex';
export default { data() { return { item: '' }; }, computed: { list() { return this.$store.state.list.list; } }, methods: { ...mapMutations('list', [ 'addItem' ]), addItem() { this.addItem(this.item); this.item = ''; } }};</script>
复制代码


在上面的示例代码中,使用 Vuex 中的modules来创建一个list模块,可以在模块中维护一个list数组,可以在模块中创建一个addItem操作,可以在组件中调用操作来添加列表项。使用mapMutations辅助函数来调用操作。


第 8 章:复杂场景实战


8.1 表单验证与条件渲染


在实际开发中,表单验证是一个常见的功能。可以使用 Vue 的表单绑定和计算属性来实现表单验证。也可以使用第三方库如 VeeValidate 来进行表单验证。


条件渲染可以使用 Vue 的v-ifv-else-ifv-else指令来实现,可以根据条件来显示不同的内容。


示例代码:

<template>  <div>    <form @submit.prevent="submitForm">      <input v-model="form.name" placeholder="姓名">      <input type="email" v-model="form.email" placeholder="邮箱">      <button type="submit">提交</button>    </form>    <p v-if="error">{{ errorMessage }}</p>  </div></template>
<script>export default { data() { return { form: { name: '', email: '' }, error: false, errorMessage: '' }; }, computed: { emailValid() { const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; return regex.test(this.form.email); } }, methods: { submitForm() { if (this.form.name === '' || !this.emailValid) { this.error = true; if (this.form.name === '') { this.errorMessage = '姓名不能为空'; } else { this.errorMessage = '邮箱格式不正确'; } } else { // 表单验证通过,处理提交逻辑 alert('表单提交成功'); } } }};</script>
复制代码


在上面的示例代码中,使用v-model来绑定表单输入框的数据,使用computed属性emailValid来验证邮箱格式。在submitForm方法中进行表单验证,如果验证失败,则显示错误信息。


8.2 动态表格操作与数据绑定


在 Vue 中,可以使用v-for指令来渲染动态表格,使用v-model来绑定表格的数据。也可以使用第三方库如 ElementUI 的表格组件来简化表格操作。


示例代码:

<template>  <div>    <table>      <thead>        <tr>          <th>姓名</th>          <th>年龄</th>          <th>操作</th>        </tr>      </thead>      <tbody>        <tr v-for="(item, index) in tableData" :key="index">          <td>{{ item.name }}</td>          <td>{{ item.age }}</td>          <td>            <button @click="deleteItem(index)">删除</button>          </td>        </tr>      </tbody>    </table>  </div></template>
<script>export default { data() { return { tableData: [ { name: '张三', age: 25 }, { name: '李四', age: 30 } ] }; }, methods: { deleteItem(index) { this.tableData.splice(index, 1); } }};</script>
复制代码


在上面的示例代码中,使用v-for指令来渲染动态表格,使用v-model来绑定表格的数据。在deleteItem方法中删除表格中的一行数据。


8.3 网络请求与列表更新


在实际应用中,经常需要从服务器获取数据并更新列表。可以使用 Vue 的created钩子来发送网络请求,使用methods来处理请求结果。


示例代码:

<template>  <div>    <ul>      <li v-for="item in items" :key="item.id">{{ item.name }}</li>    </ul>    <button @click="loadData">加载更多</button>  </div></template>
<script>export default { data() { return { items: [], page: 1, pageSize: 10 }; }, methods: { async loadData() { try { const response = await axios.get('/api/items', { params: { page: this.page, pageSize: this.pageSize } }); this.items = response.data; this.page++; } catch (error) { console.error('加载数据失败:', error); } } }, created() { this.loadData(); }};</script>
复制代码


在上面的代码中,loadData方法使用axios发送 GET 请求获取更多数据,然后更新items数据。created钩子在组件创建时立即调用loadData获取初始数据。


8.4 组件化与列表渲染的高级应用


Vue 组件化可以让你将复用的代码块封装成独立的可重用组件。对于列表渲染,可以创建一个通用的列表组件,接受数据源作为参数,并使用v-for进行渲染。


通用列表组件示例:

<template>  <ul>    <li v-for="item in items" :key="item.id">      {{ item.name }}    </li>  </ul></template>
<script>export default { props: { items: { type: Array, required: true } }};</script>
复制代码


在父组件中使用:

<template>  <div>    <list-component :items="itemsList" />  </div></template>
<script>import ListComponent from './ListComponent.vue';
export default { components: { ListComponent }, data() { return { itemsList: [ { id: 1, name: '张三' }, { id: 2, name: '李四' } ] }; }};</script>
复制代码


这样,ListComponent可以复用在多个地方,只需要传入不同的数据源即可。


第 9 章:测试与调试


9.1 单元测试与 Vue Test Utils


单元测试是确保代码质量和可维护性的关键部分。Vue Test Utils 是 Vue.js 官方提供的单元测试实用工具库,它允许你以简单直观的方式测试 Vue 组件。


安装 Vue Test Utils

npm install --save-dev @vue/test-utils
复制代码


基本使用示例

import { shallowMount } from '@vue/test-utils';import MyComponent from '@/components/MyComponent.vue';
describe('MyComponent', () => { it('renders correctly', () => { const wrapper = shallowMount(MyComponent); expect(wrapper.text()).toContain('Hello Vue Test Utils'); });});
复制代码


在这个例子中,我们使用shallowMount创建了一个组件的浅渲染实例,并检查其文本内容是否包含预期的字符串。


9.2 E2E 测试与 Cypress


端到端(E2E)测试是从用户的角度出发,测试整个应用程序的功能。Cypress 是一个流行的 E2E 测试框架,它提供了易于使用的 API 和强大的调试工具。


安装 Cypress

npm install --save-dev cypress
复制代码


基本使用示例

describe('My Vue.js App', () => {  it('Visits the app root url', () => {    cy.visit('/');    cy.contains('Welcome to Your Vue.js App');  });});
复制代码


在这个例子中,我们访问应用程序的主页,并检查页面中是否包含特定的文本。


9.3 Vue Devtools 的使用


Vue Devtools 是一个浏览器扩展,用于调试 Vue 应用程序。它允许你检查组件层次结构、观察状态变化、查看事件日志等。


安装 Vue Devtools

  • 在 Chrome 或 Firefox 中,可以通过扩展商店安装 Vue Devtools。


基本使用

  • 打开浏览器的开发者工具,切换到 Vue 标签页,即可开始使用。


9.4 调试技巧与性能分析


调试 Vue 应用程序时,除了使用 Vue Devtools,还可以使用以下技巧:


  • 使用console.log和断点:在代码中插入console.log语句或使用浏览器的断点功能来跟踪变量的值和程序流程。

  • 使用 Vue 的errorCaptured钩子:这个钩子可以捕获子组件的错误,有助于定位问题。


性能分析:

  • 使用 Chrome DevTools 的 Performance 面板:它可以记录和分析应用程序的性能,帮助你找到瓶颈。

  • 使用 Vue 的vue-loader插件:如vue-loadercache-loaderhard-source-webpack-plugin,可以提高构建性能。


文章转载自:Amd794

原文链接:https://www.cnblogs.com/Amd794/p/18214251

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Vue.js条件渲染与列表渲染指南 __vue.js_不在线第一只蜗牛_InfoQ写作社区