程序猿之Vue - Day01

day01

一、为什么要学习Vue

1.前端必备技能

2.岗位多,绝大互联网公司都在使用Vue

3.提高开发效率

4.高薪必备技能(Vue2+Vue3)

🧠 理论理解:
Vue 是当前前端三大主流框架之一,特别在中国生态中应用最广(远超 React)。它以“低学习门槛 + 高工程化能力”著称,适合从小项目快速扩展到大型系统开发。

🏢 企业实战理解:

  • 阿里旗下的饿了么、飞猪等多个前台系统基于 Vue 构建

  • 字节跳动的抖音后台管理系统大量使用 Vue2 + Vue3 共存架构

  • 国内中小企业几乎 Vue 优先,Vue 工程化(+Vite、+TypeScript)已成招聘基础门槛

✅ 一、为什么要学习 Vue?

Q1:你为什么选择 Vue 而不是 React?*答:Vue 更适合我当前的学习路径和项目需求。它的语法更贴近前端开发者的直觉,文档完善,生态成熟,尤其在国内拥有非常广泛的应用场景。相比之下,React 更灵活但上手门槛略高,对于初学者而言,Vue 的“渐进式”特性更友好,能快速上手并做出完整项目。

📌 场景题 1:实时搜索建议功能如何用 Vue 实现?

背景描述:
字节跳动的搜索框组件,需要在用户输入关键字时从后端获取实时搜索建议,并展示在下拉列表中。希望保持输入的流畅性,避免请求过多或卡顿。

问题:

  • 你如何用 Vue2 实现该组件的响应式行为?

  • 如何避免用户每输入一个字就发送一次请求?

  • 如何保证组件渲染和状态是同步的?

我会使用 v-model 实现 input 框双向绑定,配合 watch 监听 keyword 变化,并引入防抖机制(lodash.debounce)来减少请求频率。

列表展示部分用 v-if/v-for 渲染下拉候选项,避免空数据时渲染空结构。

响应式部分由 Vue 内部处理:keyword 的变化自动触发 watch,而候选数据绑定在 data 中,视图会自动更新。

核心代码包括:

- input 框:`<input v-model="keyword" />`
- watch 防抖:监听 keyword,并防抖请求
- 列表展示:v-if="results.length > 0" + v-for

二、什么是Vue

概念:Vue (读音 /vjuː/,类似于 view) 是一套 构建用户界面 渐进式 框架

Vue2官网:Vue.js

1.什么是构建用户界面

基于数据渲染出用户可以看到的界面

 

2.什么是渐进式

所谓渐进式就是循序渐进,不一定非得把Vue中的所有API都学完才能开发Vue,可以学一点开发一点

Vue的两种开发方式:
  1. Vue核心包开发

    场景:局部模块改造

  2. Vue核心包&Vue插件&工程化

    场景:整站开发

3.什么是框架

所谓框架:就是一套完整的解决方案

举个栗子

如果把一个完整的项目比喻为一个装修好的房子,那么框架就是一个毛坯房。

我们只需要在“毛坯房”的基础上,增加功能代码即可。

提到框架,不得不提一下库。

  • 库,类似工具箱,是一堆方法的集合,比如 axios、lodash、echarts等

  • 框架,是一套完整的解决方案,实现了大部分功能,我们只需要按照一定的规则去编码即可。

下图是 库 和 框架的对比。

 

框架的特点:有一套必须让开发者遵守的规则或者约束

咱们学框架就是学习的这些规则 官网

总结:什么是Vue?

Vue是什么:

什么是构建用户界面:

什么是渐进式:

什么是框架:

🧠 理论理解:

  • 构建用户界面即“把数据变成界面”,Vue 提供数据响应式能力,使页面和数据自动同步

  • 渐进式意味着你可以“从小到大”逐步引入 Vue 特性,适应各种开发规模

  • 框架区别于库:框架负责“掌控流程”,而库由你来调用

🏢 企业实战理解:

  • 比如在支付宝中,“Vue 的小组件”可以嵌入传统页面实现局部升级

  • 拼多多在做活动页时,采用“Vue 核心包嵌入老页面”方式,快速上线

  • 饿了么使用完整工程化框架 + Vue CLI + TS + ESLint + 自动化部署,实现复杂系统治理

✅ 二、Vue 是什么?渐进式是什么意思?

Q2:Vue 被称为“渐进式框架”,你理解的“渐进”指什么?

答:“渐进式”是指 Vue 的特性可以按需引入、逐步深入。从简单的插值表达式、事件绑定,到组件化开发、路由管理、状态管理等高级功能,开发者可以按项目规模逐步学习和使用,而不需要一开始就掌握所有功能。这种特性使 Vue 既适合小型组件嵌入,也适合构建大型 SPA 项目。

📌 场景题 2:你在管理系统中如何实现“根据角色动态显示菜单”?

背景描述:
你在腾讯的后台管理系统项目中,系统需要根据用户角色(admin / editor / visitor)动态显示侧边栏菜单,避免非权限用户访问非法页面。

问题:

  • 如何结合 Vue 的响应式系统实现动态菜单?

  • 在路由层级如何实现权限控制?

  • 页面刷新后如何保证菜单和权限不丢失?

首先,角色信息应在登录后存入 Vuex/Pinia 和 localStorage。

路由层使用 Vue Router 提供的路由守卫,在 beforeEach 中根据权限进行页面访问判断。菜单组件通过动态遍历 route 配置生成菜单项(如 element 中的 <el-menu>)。

刷新后,会通过 token 获取用户角色并重新生成可访问路由列表并挂载到 router.addRoutes 中,从而保持权限一致。

关键技术点包括:

- 响应式菜单生成:v-for 动态渲染权限菜单
- 权限路由守卫:router.beforeEach 判权限
- 持久化:localStorage/sessionStorage 保留用户信息

三、创建Vue实例

我们已经知道了Vue框架可以 基于数据帮助我们渲染出用户界面,那应该怎么做呢?

 

比如就上面这个数据,基于提供好的msg 怎么渲染后右侧可展示的数据呢?

核心步骤(4步):

  1. 准备容器

  2. 引包(官网) — 开发版本/生产版本

  3. 创建Vue实例 new Vue()

  4. 指定配置项,渲染数据

    1. el:指定挂载点

    2. data提供数据

 

总结:创建Vue实例需要执行哪4步

🧠 理论理解:
Vue 采用 new Vue({...}) 创建实例的方式,本质上是“响应式对象工厂”。实例生命周期由 Vue 接管,并渲染绑定的 DOM 元素。

🏢 企业实战理解:

  • 在小米商城,产品页中的多个推荐模块用“多个 Vue 实例”分别挂载

  • Vue 实例设计为响应式的好处是:不用手动更新 UI,减少 Bug、提升效率

✅ 三、Vue 实例创建步骤及原理

Q3:Vue 实例创建后发生了什么?它是怎么实现数据响应的?

**答:**创建 Vue 实例后,Vue 会执行以下几个关键步骤:

  1. data 中的数据通过响应式系统处理(Vue2 使用 Object.defineProperty,Vue3 使用 Proxy);

  2. 编译模板(或模板字符串),生成渲染函数;

  3. 建立数据和 DOM 之间的依赖关系;

  4. 当数据发生变化时,触发 watcher,重新渲染 DOM。

📌 场景题 3:你是如何处理 v-if 和 v-show 的性能问题的?

背景描述:
在美团的 Vue 项目中,页面存在多个 tab 切换,每个 tab 内容渲染复杂,你发现性能不佳,切换卡顿。

问题:

  • 你会用 v-if 还是 v-show?

  • 如何判断是否要缓存内容组件?

  • 有没有更优解?

在频繁切换的 tab 场景中,我会优先使用 v-show,因为它不会频繁销毁和重建 DOM。

如果 tab 页内容较重(如复杂表格、图表),我会配合 <keep-alive> 组件缓存每个 tab 页面状态,避免切换时重新渲染。

当然,前提是每个组件内部需要有 name 属性以供缓存识别。

使用 v-if 是在完全不展示/创建 DOM 的场景,如 “新建弹窗”。

性能优化是平衡点:频繁切换 + 保留状态 → v-show + keep-alive;一次性判断 → v-if。

四、插值表达式 {{}}

插值表达式是一种Vue的模板语法

我们可以用插值表达式渲染出Vue提供的数据

 

1.作用:利用表达式进行插值,渲染到页面中

表达式:是可以被求值的代码,JS引擎会讲其计算出一个结果

以下的情况都是表达式:

money + 100
money - 100
money * 10
money / 10 
price >= 100 ? '真贵':'还行'
obj.name
arr[0]
fn()
obj.fn()

2.语法

插值表达式语法:{{ 表达式 }}

<h3>{{title}}<h3>
​
<p>{{nickName.toUpperCase()}}</p>
​
<p>{{age >= 18 ? '成年':'未成年'}}</p>
​
<p>{{obj.name}}</p>
​
<p>{{fn()}}</p>

3.错误用法

1.在插值表达式中使用的数据 必须在data中进行了提供
<p>{{hobby}}</p>  //如果在data中不存在 则会报错
​
2.支持的是表达式,而非语句,比如:if   for ...
<p>{{if}}</p>
​
3.不能在标签属性中使用 {{  }} 插值 (插值表达式只能标签中间使用)
<p title="{{username}}">我是P标签</p>

4.总结

1.插值表达式的作用是什么

2.语法是什么

3.插值表达式的注意事项

🧠 理论理解:
Vue 提供插值表达式语法 {{ }} 来绑定数据和视图,底层基于模板编译器解析并生成渲染函数,渲染过程具有惰性和缓存优化。

🏢 企业实战理解:

  • 在企业项目中,经常用于表格展示中的单元格内容、标题动态渲染

  • 支持表达式但不支持语句的限制,可以防止开发者在模板中写“副作用逻辑”

✅ 四、插值表达式

Q4:Vue 中 {{}} 插值表达式能写 if 吗?为什么不支持?

**答:**不支持。{{}} 中只能写 JS 表达式(返回值的代码),不能写语句(如 if、for、while)。Vue 模板会被编译为渲染函数,插值表达式需要是纯函数式求值,不允许出现控制结构以保证运行时性能和安全性。

📌 场景题 4:Vue 项目中如何防止“删除按钮误点”?

背景描述:
你在支付宝的运营系统中负责一个图书管理页面,有一个“删除”按钮,你发现用户常误点,导致数据丢失。

问题:

  • 你如何设计这个按钮的行为?

  • Vue 中怎么实现这个需求?

  • 如何让交互体验合理且高效?

我会为删除按钮添加“确认操作”机制,使用 ant-design-vue 的 <a-popconfirm> 或 Element 的 MessageBox。

具体流程为:

1. 用户点击删除按钮
2. 弹出确认弹窗
3. 用户点击确认后才执行 delete 操作

实现上,通过 v-on:click 绑定 delete 方法,并在方法中控制 confirm 的逻辑,或直接使用内置组件。

Vue 的响应式可以保证 UI 和状态同步,误操作率也大幅降低。

五、响应式特性

1.什么是响应式?

简单理解就是数据变,视图对应变。

2.如何访问 和 修改 data中的数据(响应式演示)

data中的数据, 最终会被添加到实例上

① 访问数据: "实例.属性名"

② 修改数据: "实例.属性名"= "值"

3.总结

  1. 什么是响应式

  2. 如何访问和修改data中的数据呢

🧠 理论理解:
Vue 的响应式原理基于 Object.defineProperty(Vue2)或 Proxy(Vue3),核心是“依赖收集 + 派发更新”。

🏢 企业实战理解:

  • 在拼多多管理后台,用户点击“启用/禁用”按钮时,状态变更后自动反映在 UI,无需手动 DOM 操作

  • 在百度地图数据看板中,Vue 的响应式系统让图表、数值同步更新成为可能

✅ 五、响应式原理

Q5:Vue 是如何实现响应式的?Vue2 和 Vue3 有什么不同?

答:

  • Vue2 使用 Object.defineProperty 为每个属性添加 getter/setter,配合依赖收集机制实现响应式。

  • Vue3 使用 Proxy,可以监听对象的新增、删除、嵌套等所有操作,性能更好、覆盖面更广。

📌 场景题 5:你如何在 Vue 中处理异步请求失败后的 UI 恢复?

背景描述:
在网易后台项目中,某些页面需要加载远程数据,如果接口失败要展示“重试”按钮,并确保 UI 状态一致。

问题:

  • Vue 怎么监听接口状态?

  • 如何恢复页面?

  • 你的数据和状态如何组织?

我会使用一个请求状态标志 `loading` 和 `error` 来标记当前接口状态:

- loading: true → 显示加载中组件
- error: true → 显示错误提示和“重试”按钮
- 数据加载成功后:展示页面内容

Vue 的响应式系统会自动根据 data 变化重新渲染 UI。

重试操作只需要再次发起接口请求,同时重置状态标志。

这种状态组织模式符合“最小状态单元”设计,也方便后续维护和调试。

六、Vue开发者工具安装

  1. 通过谷歌应用商店安装(国外网站)

  2. 极简插件下载(推荐) 极简插件官网_Chrome插件下载_Chrome浏览器应用商店

安装步骤:

安装之后可以F12后看到多一个Vue的调试面板

🧠 理论理解:
Vue DevTools 是用于调试响应式状态、组件树、事件派发、路由信息的开发插件。帮助开发者“观察响应式数据流”。

🏢 企业实战理解:

  • 字节跳动内部所有 Vue 项目强制使用 DevTools 开启 debug 模式,提高问题排查效率

  • 饿了么通过 Vue DevTools 快速定位状态未更新的问题,在大型复杂表单中非常常用

✅ 六、v-if 和 v-show 区别

Q6:v-if 和 v-show 区别?怎么选择?

答:

比较项v-ifv-show
原理动态创建/销毁 DOM通过 display: none 控制显示
初次渲染有开销性能好
切换频繁不推荐推荐
适用场景条件复杂、一次性判断频繁显示隐藏,如 tab 页切换

使用建议:频繁切换用 v-show,一次性判断用 v-if

七、Vue中的常用指令

概念:指令(Directives)是 Vue 提供的带有 v- 前缀 的 特殊 标签属性

为啥要学:提高程序员操作 DOM 的效率。

vue 中的指令按照不同的用途可以分为如下 6 大类:

  • 内容渲染指令(v-html、v-text)

  • 条件渲染指令(v-show、v-if、v-else、v-else-if)

  • 事件绑定指令(v-on)

  • 属性绑定指令 (v-bind)

  • 双向绑定指令(v-model)

  • 列表渲染指令(v-for)

指令是 vue 开发中最基础、最常用、最简单的知识点。

🧠 理论理解:
Vue 的指令本质是“运行时 DOM 操作行为的抽象”,本质是绑定到元素生命周期中的钩子函数(如 bind、update、unbind)。

🏢 企业实战理解:

  • 滴滴在设备管理后台中,用 v-if 控制表格弹窗、状态组件是否渲染,提升效率

  • 使用 v-model 快速实现复杂表单绑定是中后台常见场景

✅ 七、事件绑定与传参

Q7:Vue 中事件处理函数怎么传参数?如何传事件对象?

答:
在模板中调用方法时可以这样写:

<button @click="handleClick('参数1', $event)">点击</button>

在 methods 中:

methods: {
  handleClick(arg, e) {
    console.log(arg, e)  // arg 是自定义参数,e 是事件对象
  }
}

注意:传参时需要手动写 $event,否则 Vue 不会自动传递事件对象。

八、内容渲染指令

内容渲染指令用来辅助开发者渲染 DOM 元素的文本内容。常用的内容渲染指令有如下2 个:

  • v-text(类似innerText)

    • 使用语法:<p v-text="uname">hello</p>,意思是将 uame 值渲染到 p 标签中

    • 类似 innerText,使用该语法,会覆盖 p 标签原有内容

  • v-html(类似 innerHTML)

    • 使用语法:<p v-html="intro">hello</p>,意思是将 intro 值渲染到 p 标签中

    • 类似 innerHTML,使用该语法,会覆盖 p 标签原有内容

    • 类似 innerHTML,使用该语法,能够将HTML标签的样式呈现出来。

代码演示:

  <div id="app">
    <h2>个人信息</h2>
    // 既然指令是vue提供的特殊的html属性,所以咱们写的时候就当成属性来用即可
    <p v-text="uname">姓名:</p> 
    <p v-html="intro">简介:</p>
  </div> 
​
<script>
        const app = new Vue({
            el:'#app',
            data:{
                uname:'张三',
                intro:'<h2>这是一个<strong>非常优秀</strong>的boy<h2>'
            }
        })
</script>

🧠 理论理解:

  • v-text 等价于 innerText

  • v-html 等价于 innerHTML,但注意其存在安全隐患(XSS)

🏢 企业实战理解:

  • 在 Vue 写活动页时,v-html 用于插入后端下发的“带样式说明文本”

  • 多数大厂(如京东)已限制在项目中使用 v-html,转为服务端过滤或富文本组件替代

✅ 八、属性绑定(v-bind)

Q8:v-bind 和插值表达式的区别是什么?

答:

  • 插值表达式({{}})只能用于标签中间渲染文本;

  • v-bind 是用于绑定标签的属性值,如 :src, :href, :title

  • 插值不能在标签属性中使用,但 v-bind 可以。

九、条件渲染指令

条件判断指令,用来辅助开发者按需控制 DOM 的显示与隐藏。条件渲染指令有如下两个,分别是:

  1. v-show

    1. 作用: 控制元素显示隐藏

    2. 语法: v-show = "表达式" 表达式值为 true 显示, false 隐藏

    3. 原理: 切换 display:none 控制显示隐藏

    4. 场景:频繁切换显示隐藏的场景

  2. v-if

    1. 作用: 控制元素显示隐藏(条件渲染)

    2. 语法: v-if= "表达式" 表达式值 true显示, false 隐藏

    3. 原理: 基于条件判断,是否创建 或 移除元素节点

    4. 场景: 要么显示,要么隐藏,不频繁切换的场景

    示例代码:

      
    <div id="app">
        <div class="box">我是v-show控制的盒子</div>
        <div class="box">我是v-if控制的盒子</div>
      </div>
    ​
      <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
      <script>
        const app = new Vue({
          el: '#app',
          data: {
            flag: false
          }
        })
      </script>

  3. v-else 和 v-else-if

    1. 作用:辅助v-if进行判断渲染

    2. 语法:v-else v-else-if="表达式"

    3. 需要紧接着v-if使用

示例代码:

 <div id="app">
    <p>性别:♂ 男</p>
    <p>性别:♀ 女</p>
    <hr>
    <p>成绩评定A:奖励电脑一台</p>
    <p>成绩评定B:奖励周末郊游</p>
    <p>成绩评定C:奖励零食礼包</p>
    <p>成绩评定D:惩罚一周不能玩手机</p>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
​
    const app = new Vue({
      el: '#app',
      data: {
        gender: 2,
        score: 95
      }
    })
  </script>

🧠 理论理解:

  • v-show 修改 CSS display,性能好、但始终保留 DOM

  • v-if 控制 DOM 创建和销毁,初次渲染开销大,但节省内存

🏢 企业实战理解:

  • 淘宝商品页中详情/评价/推荐模块切换采用 v-show,提升切换体验

  • 动态表单字段渲染(如新增地址)用 v-if 控制,有条件才创建

✅ 九、v-for 使用 key 的意义?

Q9:为什么 v-for 中建议设置 key?为什么不推荐 index 作为 key?

答:

Vue 使用 Diff 算法来优化列表更新,通过 key 快速定位节点。

  • 使用 key 是为了提升渲染性能,避免错误复用旧节点;

  • 推荐使用稳定唯一的 id,而不是 index;

  • 使用 index 当 key 会在数据顺序变化时复用错误组件,可能导致数据错乱、动画错位等问题。

十、事件绑定指令

使用Vue时,如需为DOM注册事件,及其的简单,语法如下:

  • <button v-on:事件名="内联语句">按钮</button>

  • <button v-on:事件名="处理函数">按钮</button>

  • <button v-on:事件名="处理函数(实参)">按钮</button>

  • v-on: 简写为 @

  1. 内联语句

    <div id="app">
        <button @click="count--">-</button>
        <span>{{ count }}</span>
        <button v-on:click="count++">+</button>
      </div>
      <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
      <script>
        const app = new Vue({
          el: '#app',
          data: {
            count: 100
          }
        })
      </script>

  2. 事件处理函数

    注意:

    • 事件处理函数应该写到一个跟data同级的配置项(methods)中

    • methods中的函数内部的this都指向Vue实例

<div id="app">
    <button>切换显示隐藏</button>
    <h1 v-show="isShow">黑马程序员</h1>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        isShow: true
      }
    })
  </script>

3.给事件处理函数传参

  • 如果不传递任何参数,则方法无需加小括号;methods方法中可以直接使用 e 当做事件对象

  • 如果传递了参数,则实参 $event 表示事件对象,固定用法。

 <style>
    .box {
      border: 3px solid #000000;
      border-radius: 10px;
      padding: 20px;
      margin: 20px;
      width: 200px;
    }
    h3 {
      margin: 10px 0 20px 0;
    }
    p {
      margin: 20px;
    }
  </style>
​
 <div id="app">
    <div class="box">
      <h3>小黑自动售货机</h3>
      <button>可乐5元</button>
      <button>咖啡10元</button>
      <button>牛奶8元</button>
    </div>
    <p>银行卡余额:{{ money }}元</p>
  </div>
​
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        money: 100
      }
    })
  </script>

🧠 理论理解:

  • Vue 事件绑定支持“内联语句 + 方法名 + 参数传递”,自动处理 this 指向

  • @clickv-on:click 的语法糖,适合大量简写操作

🏢 企业实战理解:

  • 美团移动端中,按钮事件几乎全部使用 Vue 的 @click 绑定方式

  • 多模块点击交互统一抽象到 methods 中维护,提高项目可维护性

✅ 十、双向绑定原理

Q10:v-model 的原理是什么?

答:
v-model:value + @input 的语法糖:

<input v-model="msg" />

等价于:

<input :value="msg" @input="msg = $event.target.value" />

Vue 自动帮你绑定 input 事件,同时更新 data 中的值,实现双向数据绑定。

十一、属性绑定指令

  1. 作用:动态设置html的标签属性 比如:src、url、title

  2. 语法v-bind:属性名=“表达式”

  3. v-bind:可以简写成 => :

比如,有一个图片,它的 src 属性值,是一个图片地址。这个地址在数据 data 中存储。

则可以这样设置属性值:

  • <img v-bind:src="url" />

  • <img :src="url" /> (v-bind可以省略)

  <div id="app">
    <img v-bind:src="imgUrl" v-bind:title="msg" alt="">
    <img :src="imgUrl" :title="msg" alt="">
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        imgUrl: './imgs/10-02.png',
        msg: 'hello 波仔'
      }
    })
  </script>

🧠 理论理解:

  • v-bind 绑定任意 HTML 属性,使得属性值可以动态响应 data 数据

  • 支持 JS 表达式,支持对象语法(用于 class、style)

🏢 企业实战理解:

  • 字节跳动的“视频管理系统”中,图片路径、标题、链接全部采用 :src, :title 动态绑定

  • v-bind:class:style 在后台复杂状态控制中非常常用

✅ 十一、实际业务场景题(综合)

Q11:你用 Vue 实现过哪些具体功能?有没有遇到什么难点?

答:
我曾用 Vue 实现一个“智能交通前端管理系统”,实现了视频画面动态切换、行人列表渲染、实时报警提示等功能。用到了 v-if 条件控制警报组件、v-for 渲染摄像头数据、v-model 实现搜索栏联动。难点主要在响应式数据同步和图表渲染节流方面,后来通过 watch + 防抖函数优化了体验。

十二、小案例-波仔的学习之旅

需求:默认展示数组中的第一张图片,点击上一页下一页来回切换数组中的图片

实现思路:

1.数组存储图片路径 ['url1','url2','url3',...]

2.可以准备个下标index 去数组中取图片地址。

3.通过v-bind给src绑定当前的图片地址

4.点击上一页下一页只需要修改下标的值即可

5.当展示第一张的时候,上一页按钮应该隐藏。展示最后一张的时候,下一页按钮应该隐藏

 <div id="app">
    <button>上一页</button>
    <div>
      <img src alt="">
    </div>
    <button>下一页</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        list: [
          './imgs/11-00.gif',
          './imgs/11-01.gif',
          './imgs/11-02.gif',
          './imgs/11-03.gif',
          './imgs/11-04.png',
          './imgs/11-05.png',
        ]
      }
    })
  </script>

🧠 理论理解:

  • v-for 语法支持数组、对象、数字等结构,内部使用 key 优化 diff 过程

  • 建议始终提供稳定的 key,避免性能问题和渲染错误

🏢 企业实战理解:

  • 百度内容管理平台使用 v-for 渲染分页列表,结合分页组件形成高性能 UI

  • key=index 导致 DOM 复用错误的问题在多个大厂项目中出现,官方也明确建议“避免使用 index 作为 key”

十三、列表渲染指令

Vue 提供了 v-for 列表渲染指令,用来辅助开发者基于一个数组来循环渲染一个列表结构。

v-for 指令需要使用 (item, index) in arr 形式的特殊语法,其中:

  • item 是数组中的每一项

  • index 是每一项的索引,不需要可以省略

  • arr 是被遍历的数组

此语法也可以遍历对象和数字

//遍历对象
<div v-for="(value, key, index) in object">{{value}}</div>
value:对象中的值
key:对象中的键
index:遍历索引从0开始
​
//遍历数字
<p v-for="item in 10">{{item}}</p>
item从1 开始

🧠 理论理解:

  • v-model:value + @input 的语法糖,专为表单输入绑定设计

  • 底层使用事件监听 + data 响应式结合,实现数据和 UI 双向流动

🏢 企业实战理解:

  • 头条后台发布系统表单模块采用 v-model 配合验证组件实现“实时校验 + UI 提示”

  • 京东前台使用 v-model 结合搜索推荐功能,提高表单数据同步效率

十四、小案例-小黑的书架

需求:

1.根据左侧数据渲染出右侧列表(v-for)

2.点击删除按钮时,应该把当前行从列表中删除(获取当前行的id,利用filter进行过滤)

 

准备代码:

<div id="app">
    <h3>小黑的书架</h3>
    <ul>
      <li>
        <span>《红楼梦》</span>
        <span>曹雪芹</span>
        <button>删除</button>
      </li>
    </ul>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        booksList: [
          { id: 1, name: '《红楼梦》', author: '曹雪芹' },
          { id: 2, name: '《西游记》', author: '吴承恩' },
          { id: 3, name: '《水浒传》', author: '施耐庵' },
          { id: 4, name: '《三国演义》', author: '罗贯中' }
        ]
      }
    })
  </script>

十五、v-for中的key

语法: key="唯一值"

作用:给列表项添加的唯一标识。便于Vue进行列表项的正确排序复用

为什么加key:Vue 的默认行为会尝试原地修改元素(就地复用

实例代码:

<ul>
  <li v-for="(item, index) in booksList" :key="item.id">
    <span>{{ item.name }}</span>
    <span>{{ item.author }}</span>
    <button @click="del(item.id)">删除</button>
  </li>
</ul>

注意:

  1. key 的值只能是字符串 或 数字类型

  2. key 的值必须具有唯一性

  3. 推荐使用 id 作为 key(唯一),不推荐使用 index 作为 key(会变化,不对应)

十六、双向绑定指令

所谓双向绑定就是:

  1. 数据改变后,呈现的页面结果会更新

  2. 页面结果更新后,数据也会随之而变

作用:表单元素(input、radio、select)使用,双向绑定数据,可以快速 获取设置 表单元素内容

语法:v-model="变量"

需求:使用双向绑定实现以下需求

  1. 点击登录按钮获取表单中的内容

  2. 点击重置按钮清空表单中的内容

<div id="app">
    账户:<input type="text"> <br><br>
    密码:<input type="password"> <br><br>
    <button>登录</button>
    <button>重置</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        username: '',
        password: ''
      },
    })
  </script>

十七、综合案例-小黑记事本

 

功能需求:

  1. 列表渲染

  2. 删除功能

  3. 添加功能

  4. 底部统计 和 清空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值