核心概念:
渐进式框架:灵活性强,可以用不同的方式使用,从单页应用(SPA)到全栈/服务端渲染(SSR)在到静态站点生成(SSG),以及桌面端、移动端、Webgl甚至命令行
单文件组件:是指将逻辑(JS)模板(HTML)和样式(CSS)放在同一个文件中
API风格:
- 选项式API :用包含多个选项的对象来描述组件的逻辑,例如
data
、methods
和mounted
- 组合式API:组合式 API 通常会与
<script setup>
搭配使用,<script setup>
中的导入和顶层变量/函数都能够在模板中直接使用。
基础
创建应用
官方默认的脚手架是create-vue, 打包工具(编译?)是vite 应用配置:可以通过app.config配置错误处理 和app.component进行组件注册,应用内任何地方可使用。
多个应用实例:| 如果你正在使用 Vue 来增强服务端渲染 HTML,并且只想要 Vue 去控制一个大型页面中特殊的一小部分,应避免将一个单独的 Vue 应用实例挂载到整个页面上,而是应该创建多个小的应用实例,将它们分别挂载到所需的元素上去。
模板语法
文本插值:{{msg}}
[!文本插值和v-html的区别] 文本插值同步更新组件中的指定属性,但是会将数据解释为纯文本。 如果要插入一个纯html需要用v-html,但要注意在网站动态渲染HTML是很危险的,容易造成XSS漏洞。
属性绑定:v-bind
- 如果绑定的值是
null
或者undefined
,那么该 attribute 将会从渲染的元素上移除 - 当
isButtonDisabled
为真值或一个空字符串 (即<button disabled="">
) 时,元素会包含这个disabled
attribute。而当其为其他假值时 attribute 将被忽略。
|
|
JS表达式
使用JS表达式的场景:在 Vue 模板内,JavaScript 表达式可以被使用在如下场景上:
- 在文本插值中 (双大括号)
- 在任何 Vue 指令 (以
v-
开头的特殊 attribute) attribute 的值中 (引号中- [ ? ] )
[!important]- 判断是否是JS表达式 一个简单的判断方法是是否可以合法地写在
return
后面。
- [?] 可以在绑定的表达式中使用一个组件暴露的方法:
|
|
表达式中受限的访问:
模板中的表达式将被沙盒化,仅能够访问到有限的全局对象列表。该列表中会暴露常用的内置全局对象,比如
Math
和Date
。 没有显式包含在列表中的全局对象将不能在模板内表达式中访问,例如用户附加在window
上的属性。然而,你也可以自行在app.config.globalProperties
上显式地添加它们,供所有的 Vue 表达式使用。
指令:带有 v-
前缀的特殊 attribute
指令 attribute 的期望值:为一个 JavaScript 表达式 (除了少数几个例外,即之后要讨论到的 v-for
、v-on
和 v-slot
)。
指令的任务:是在其表达式的值变化时响应式地更新 DOM
动态参数 ⭐
|
|
动态参数的表达式的值应该是一个字符串or null
响应式基础
reactive()
通过reactive()函数创建一个响应式对象:
- vue会跟踪该对象的访问和更新
- 使用reactive()生命的状态都是默认深层响应式的
|
|
[!info] reactive使用 在setup()函数中定义和返回,进行手动暴露 或者直接使用标签,不用手动暴露状态和方法
[!impotant] raective()局限性
- 仅对对象有效 ,只适用于引用类型(因为reactive基于proxy实现,proxy不适用于基本类型数据)
- 因为 Vue 的响应式系统是通过属性访问进行追踪的,因此我们必须始终保持对该响应式对象的相同引用。也意味着当我们将响应式对象的属性赋值或解构至本地变量时,或是_将该属性传入一个函数时_,我们会失去响应性。
使用 Vue 的响应式系统的最佳实践是 仅使用你声明对象的代理版本。
ref()
允许我们创建可以使用任何值类型的响应式
ref()
将传入参数的值包装为一个带 .value
属性的 ref 对象
当值为对象类型时,会用 reactive()
自动转换它的 .value
[!info] ref()
- ref 被传递给函数或是从一般对象上被解构时,不会丢失响应性
- 当 ref 在模板中作为顶层属性被访问时,它们会被自动“解包”,所以不需要使用
.value
reactive和ref
- 对于基本类型变量,使用 ref。
- 对于对象和数组,使用 reactive。
- 如果需要对一个复杂的对象进行响应式处理,并且还需要对某个属性进行引用。我们可以将该对象用reactive包裹,然后使用ref获取其属性。这样就可以实现对复杂对象及其属性的响应式处理。
计算属性
cmputed()
使用计算属性描述依赖响应式状态的复杂逻辑
computed()
方法期望接收一个 getter 函数,返回值为一个计算属性 ref。
[!tip]- 为什么使用计算属性而不是方法 计算属性值会基于其响应式依赖被缓存。意味着只有响应式依赖更新时才重新计算,而方法调用总是会在重渲染时再次执行。 如果计算属性中没有响应式依赖,则永远不会更新。
最佳实践: 计算属性中应****制作计算而没有任何副作用(异步请求或者更改DOM),一个计算属性的声明中描述的是如何根据其他值派生一个值,因此计算属性的返回值应该被视为只读的。
类与样式绑定
#todo 使用计算属性绑定类
条件渲染
v-if
v-if
指令在其后条件为真的时候进行渲染。
如果多个元素需要条件渲染,可以用<template>
包裹,在<template>
上使用v-if
。
v-show
会在DOM中保留元素,不支持在<template>
元素上使用
[!important] v-if和v-show v-if在切换时,条件区块内的事件监听器和子组件都会被销毁与重建。
v-show
简单许多,元素无论初始条件如何,始终会被渲染,只有 CSSdisplay
属性会被切换。 总的来说,v-if
有更高的切换开销,而v-show
有更高的初始渲染开销。因此,如果需要频繁切换,则使用v-show
较好;如果在运行时绑定条件很少改变,则v-if
会更合适。
列表渲染 v-for
v-for
指令的值需要使用 item in items
形式的特殊语法,其中 items
是源数据的数组,而 item
是迭代项的别名.
使用解构定义变量别名:
|
|
v-for用于数组:
|
|
v-for用于对象:
|
|
v-for嵌套作用域:类似于函数作用域,可访问到父级作用域
|
|
事件处理 v-on|@
事件处理器 (handler) 的值可以是:
- 内联事件处理器:事件被触发时执行的内联 JavaScript 语句 (与
onclick
类似)。 - 方法事件处理器:一个指向组件上定义的方法的属性名或是路径。 ?
- [?] 举例来说,
foo
、foo.bar
和foo['bar']
会被视为方法事件处理器,而foo()
和count++
会被视为内联事件处理器。
内联事件处理器
- 调用方法:这允许我们向方法传入自定义参数以代替原生事件:(?观察使用场景
|
|
- 在内联事件处理器中访问事件参数:访问原生DOM
- 使用特殊的
$event
变量 - 内联剪头函数
- 使用特殊的
|
|
|
|
修饰符
- 事件修饰符:触发事件后在方法内调用
|
|
- 按键修饰符
- 鼠标修饰符
表单输入绑定 v-model
基本用法
v-model指令相当于v-bind+v-on,可用于:
- 文本类型的
<input>
和<textarea>
元素会绑定value
property 并侦听input
事件; <input type="checkbox">
和<input type="radio">
会绑定checked
property 并侦听change
事件;<select>
会绑定value
property 并侦听change
事件。
[!tip] 注意
v-model
会忽略任何表单元素上初始的value
、checked
或selected
attribute。它将始终将当前绑定的 JavaScript 状态视为数据的正确来源。你应该在 JavaScript 中使用响应式系统的 API 来声明该初始值。
复选框trule-value,false-value属性设定复选框的值,默认为true和FALSE
修饰符
.lazy
:v-model默认在input事件后更新数据,通过lazy
修饰符改为在change事件后更新(change事件是失去焦点后触发.number
:将用户输入自动转换为数字.trim
:自动去除空格
组件中使用v-model
#todo 在后面章节、
生命周期
#todo
侦听器 watch()
- 使用
watch
函数在每次响应式状态发生变化时触发回调函数。 - watch函数第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组。
[!attention] 注意 不能直接侦听响应式对象的属性值,需要用一个返回该属性的getter函数 为什么vue3 watch( )无法监听对象属性 - 掘金 (juejin.cn)
|
|
初步理解:直接监听属性的话watch拿到obj.count是一个值类型,也就是数字0,在watch源码中对于第一个参数source只处理ref、reactive、数组和函数,对于值类型直接返回空函数
即时回调:
watch默认是仅当数据源变化时才会执行回调,如果要创建侦听器时立即执行一遍回调,例如想请求一些初始数据,然后在相关状态更改时重新请求数据。可以通过传入 immediate: true
选项来强制侦听器的回调立即执行:
|
|