一、概述
1. Vue 简介
- Vue(发音为
/vjuː/
,类似 view)是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助用户高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任 - 官网:https://cn.vuejs.org/
2. 环境搭建
(1) CND
- 通过 CDN 使用 Vue 时,不涉及“构建步骤”。这使得设置更加简单,并且可以用于增强静态的 HTML 或与后端框架集成。但是无法使用单文件组件(SFC)语法
1 | <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> |
(2) Vue CLI
- Vue CLI 是官方提供的基于 Webpack 的 Vue 工具链,它现在处于维护模式。建议使用 Vite 开始新的项目,除非需要依赖特定的 Webpack 的特性
(3) Vite
- Vite 是一个轻量级的、速度极快的构建工具,对 Vue SFC 提供第一优先级支持。作者是尤雨溪
1 | $ npm init vue@latest |
二、基础
1. 模板语法
(1) HelloWorld
1 | <div id="box"> |
JS 中的全局变量可以直接在 console 中使用,如
app.myname = test
(2) 双向绑定原理
1 | // Vue2:无法监听数组的改变,无法监听class改变,无法监听Map/Set结构 |
(3) 模板语法
1 | // 数据绑定 |
(4) CRUD Demo
1 | <!-- <input type="text" @input="handleInput"> --> |
2. 条件渲染
- v-if 在切换时,条件区块内的事件监听器和子组件都会被销毁与重建
- v-if 是惰性的,条件区块只有当条件首次变为 true 时才被渲染,而 v-show 无论初始条件如何,始终会被渲染
1 | <template v-if="state===0"> |
3. 列表渲染
1 | <!-- 尽量不同时使用v-for和v-if --> |
- Vue 默认按照“就地更新”的策略来更新通过 v-for 渲染的元素列表。当数据项的顺序改变时,Vue 不会随之移动 DOM 元素的顺序,而是就地更新每个元素,确保它们在原本指定的索引位置上渲染
- 可以为每个元素对应的块提供一个唯一的 key attribute,以便它可以跟踪每个节点的标识,从而重用和重新排序现有的元素
1 | <div v-for="item in items" :key="item.id">...</div> |
- 虚拟 DOM:本质是 JS 对象,是真实 DOM 和数据之间的“缓冲层”。通过快速对比 JS 对象(DIFF 算法),避免重复渲染真实 DOM
- 数组变动侦测:Vue 能够侦听响应式数组的变更方法,并在它们被调用时触发相关的更新(
push
、pop
、shift
、unshift
、splice
、sort
、reverse
)。对于一些不可变方法(filter
、concat
、slice
),这些不会改变原数组,而是返回一个新数组,需要重新赋值
1 | this.items = this.items.filter((item) => item.message.match(/Foo/)) |
- 案例:模糊搜索
1 | <li v-for="(item,index) in getList()"> |
4. 事件处理器
1 | <!-- 内联事件处理器 --> |
- 事件修饰符
1 | <!-- |
- 按键修饰符
1 | <!-- enter / tab / delete / esc / space / up / down / left / right --> |
5. 表单控件绑定
1 | <input v-model="message" placeholder="edit me" /> |
- 表单修饰符
1 | <!-- 失去焦点后更新(change事件后更新而不是input) --> |
- 案例:购物车
1 | <ul> |
6. 计算属性和监听属性
- 计算属性值会基于其响应式依赖被缓存(多处使用只会计算一次)。一个计算属性仅会在其响应式依赖更新时才重新计算
- 计算属性返回的值是派生状态。可以把它看作是一个“临时快照”,每当源状态发生变化时,就会创建一个新的快照。更改快照是没有意义的,因此计算属性的返回值应该被视为只读的,并且永远不应该被更改——应该更新它所依赖的源状态以触发新的计算
1 | <input type="checkbox" v-model="isAllChecked" > |
- 不要在计算属性中发送请求或改变 DOM,可以在监听属性 watch 中操作
- watch 选项期望接受一个对象,其中键是需要侦听的响应式组件实例属性(例如,通过 data 和 computed 声明的属性)。值是相应的回调函数,该回调函数接收被侦听源的新值和旧值
1 | watch: { |
7. 数据请求
- XMLHttpRequest 是一个设计粗糙的 API,配置和调用方式非常混乱,而且基于事件的异步模型写起来不友好
- Fetch:
1 | fetch("./test.json") |
- Axios:是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中
1 | axios.get("http://localhost:3000/list").then(res=>{ |
8. 过滤器
- 在 2.x 中,开发者可以使用过滤器来处理通用文本格式。在 3.x 中,过滤器已移除,且不再支持。可以用方法调用或计算属性来替换它们
9. 其他
1 | // 跨站攻击 |