VUE3
2022-10-06 20:50:23 2 举报
AI智能生成
vue3 api
作者其他创作
大纲/内容
全局api
应用实例
createApp()
创建一个应用实例
function create(rootComponent:Component, rootProps?:object):APP
第一个参数是根组件,第二个可选参数是根组件的proops
createSSRApp()
ssr模式激活一个应用实例,参数同createApp
app.mount()
实例挂在到一个容易元素中
mount(rootContainer:Element|string):componentPunlicInstance
参数是DOM元素或者css选择器,返回根组件实例。如果组件有模板或者渲染函数,组件会替换这个DOM节点内的元素,否则容器元素内额innerHTML被用作模板
每个应用实例的mount只调用一次
app.unmount()
卸载一个已挂载的应用实例,会触发应用组件树所有组件的卸载生命周期
app.provide()
提供一个值,可以在应该所有后代中注入使用
provide<T>(key:InjectionKey<T>|Symbol|string, vlaue:T):this
第一个参数是key,第二个参数是值返回实例本身
app.component()
2个重载,如果传递组件字符串定义则注册一个全局组件;如果只传递名字,返回改名字注册的组件
component(name:string):Component|undefined
component(name:string, component:Component):this
app.directive()
2个重载如果同时传递名字和指令定义则注册一个全局指令;如果只传递名字。则返回对应的指令
directive(name:string):Directive|undefiend
directive(name:string, directive:Directive):this'
app.use()
安装一个插件
use(plugin:Plugin, ...optuions:any[]):this
第一个参数是插件本身,第二个参数是传递给插件的选项
插件是一个带有install方法的对象,或者是一个被用作install方法的函数。use的第二个参数会传递给install方法
app.mixin()
应用全局的mixin,会作用域映众中的每个组件实例
不推荐使用,vue3推荐使用组合式函数替代
mixin(mixin:ComponentOptions):this
app.version
提供当前vue的版本号
version:string
app.config
暴露的应用的配置设定,可以在挂在应用前更改这些属性
app.config.errorHandler
为未捕获的错误提供一个全局的处理函数
errorHandler?:(err:unknow,instance:ComponentPublicInstance|null, info:string)=>void
三个参数分别是错误对象,触发错误的组件实例,支出错误来源信息的字符串(例如是从哪个生命周期抛出的)
app.config.warnHandler
为运行时警告指定一个自定义处理函数
warnHandler(msg:string, instance:ComponentPublicInstance|undefined, trcace:string)=>void
三个参数:警告信息、来源组件实例、组件追踪字符串
app.config.performance
设置为true可以在浏览器开发工具的性能/时间线页面中启用对组件初始化、编译、渲染和修补的性能表现追踪。仅开发模式和支持performance.mark的浏览器中工作
app.config.compilerOptions
运行时的编译选项。设置到此对象上的值会在浏览器进行模板编译时使用,会影响所有配置应用的组件。也可以通过compileroptions选项在每个组件上付给这些选项
注意这个选项只在完整构建版本,即在浏览器中编译模板的vuejs中使用。如果使用的是带构建的项目配置且仅含运行时的vue,那么编译器必须通过构建工具的相关配置传递给@vue/compiler-dom
app.config.compilerOptions.isCustomELement
用于指定一个检查方法来识别自定义元素
(tag:string)=>boolean
app.config.compilerOptions.whitespace
调整模板中空格的处理行为
condense|preserve
默认是缩短condense
1.元素开头和结尾的空额符会被缩短为一个空格
2.包含换行的元素之间的空白字符会被删除
3.文本节点中的连续空白字符缩短城一个空格
选项是preserve会禁用2、3项
app.config.compilerOptions.delimiters
调整模板内文本插值的分割符
[string,string]
默认['{{','}}']
app.config.compilerOptions.comments
调整是否溢出模板中的注释
boolean
默认false
true会保留注释
app.config.globalProperties
用于注册能够被应用中所有组件实例访问的全局属性对象
globalProperties:Record<string, any>
如果全局属性和组件自己属性有冲突,则组件自己的属性优先级更高
app.config.optionMergeStrategies
用于定义自定义组件选项合并策略的对象
optionMergeStrategies:Record<string, OptionMergeFunction>
OptionMergeFunction = (to:unknown, from:unknown)=>any
用于多个mixin合并时的策略,合并策略函数接受附实例和子实例上定义的该选项额值作为第一个和第二个参数
通用
version
暴露vue版本
import {version} from 'vue' ;
nextTick()
等阿迪下一次DOM更新刷新的工具方法
function nextTick(callback?:()=>void)=>promise<void>
在vue中更爱响应式状态时,最终的DOm更新并不是同步生效的,而是有vue将他们缓存在一个队列中吗,直到下一个tick才一起执行,这样是为了确保每个组件无论发生多少状态改变,都只执行一次更新
defineComponent()
定义VUe组件是提供类型 推导的辅助函数
function defineComponent(component:ComponentOptions|components['setup']):componentConstructor
第一个参数是组件选项对象,返回该选项对象本身,该函数没有任何操作只是提供了类型推导
defineAsyncComponent()
定义一个异步组件,它的运行时是懒加载的,参数是一个异步加载函数或者对加载行为进行更具体定时的选项对象
function defineAsyncComponent(
source: AsyncComponentLoader | AsyncComponentOptions
): Component
type AsyncComponentLoader = () => Promise<Component>
interface AsyncComponentOptions {
loader: AsyncComponentLoader
loadingComponent?: Component
errorComponent?: Component
delay?: number
timeout?: number
suspensible?: boolean
onError?: (
error: Error,
retry: () => void,
fail: () => void,
attempts: number
) => any
}
source: AsyncComponentLoader | AsyncComponentOptions
): Component
type AsyncComponentLoader = () => Promise<Component>
interface AsyncComponentOptions {
loader: AsyncComponentLoader
loadingComponent?: Component
errorComponent?: Component
delay?: number
timeout?: number
suspensible?: boolean
onError?: (
error: Error,
retry: () => void,
fail: () => void,
attempts: number
) => any
}
defineCustomELemet()
参数和defineComponent参数相同,不同的是它会返回一个原生自定义元素类的构造器
function defineCustomElement(
component:
| (ComponentOptions & { styles?: string[] })
| ComponentOptions['setup']
): {
new (props?: object): HTMLElement
}
component:
| (ComponentOptions & { styles?: string[] })
| ComponentOptions['setup']
): {
new (props?: object): HTMLElement
}
返回的构造器可以被customElement.define(name:string, ele:HTMLElement)来注册
组合API
setup()
组合式API的入口
使用场景
1.需要在非单文件组件中使用组合式API
2.需要在基于选项式API的组见证继承基于组合式API的代码时
其他情况都应优先使用<scripot setup>
基本使用
可以使用响应式API(reactive、ref)来什么响应式的状态,在setup()函数中返回的对象会暴露给模板和组件实例
模板中返回从setup中返回的ref时,它会自动的浅层解包,无需再模板中写.value。当通过this访问时也会有这样的解包
访问props
setup函数的第一个参数是组件的props。若果结构了props对象,结构出的变量会丢失响应性。推荐使用props.xxx的形式来使用props
如果需要结构,可以使用toRefs和toRef这个两个工具函数
export default{
setup(props){
const {title} = toRefs(props)
console.log(title,value)
const title = toRef(props, 'title')
}
}
setup(props){
const {title} = toRefs(props)
console.log(title,value)
const title = toRef(props, 'title')
}
}
setup上下文
传入setup的第二个参数是setUp上下文对象,上下文对象中暴露了其他可能用到的值
上下文是非响应式的,可以安全的结构
context.attrs context.slots context.emit context.expose
暴露公共属性
expose函数用于显示的限制该组件暴露出的属性,当父组件通过模板引用访问改组件的实例时,将仅能访问expose函数暴露出的内容
export default {
setup(props, { expose }) {
// 让组件实例处于 “关闭状态”
// 即不向父组件暴露任何东西
expose()
const publicCount = ref(0)
const privateCount = ref(0)
// 有选择地暴露局部状态
expose({ count: publicCount })
}
}
setup(props, { expose }) {
// 让组件实例处于 “关闭状态”
// 即不向父组件暴露任何东西
expose()
const publicCount = ref(0)
const privateCount = ref(0)
// 有选择地暴露局部状态
expose({ count: publicCount })
}
}
与渲染函数一起使用
可以返回一个渲染函数,此时在渲染函数中可以使用在同一作用域下的响应式状态
export default{
setup(){
const count = ref(0)
return()=>h('div', count)
}
}
setup(){
const count = ref(0)
return()=>h('div', count)
}
}
响应式API:核心
ref()
接受一个内部值,返回一个响应式可更改的ref对象,此对象只有一个指向其内部值的属性.value
function ref<T>(value:T):Ref<UnwrapRef<T>>
interface Ref<T>{value:T}
interface Ref<T>{value:T}
如果把对象赋值给ref,那么这个对象会通过reactive()转为具有深层次降仪式的对象,这意味着如果对象中包含了嵌套的ref,他们会被深层的解包。若果需要薄面这种深层的转换,可以使用shallowRef()替代
computed()
接受一个getter函数,返回一个只读的响应式ref对象,该ref通过.value暴露getter函数的返回值。也可以接受一个带有get、set函数的喜爱那个来创建一个可写的ref对象
function computed<T>(getter:()=>T):Readonlu<Ref<Readonly<T>>>
function computed<T>(options:{
get:()=>T
set:(value:T)=>void
},
debuggerOptions?:DebuggerOptions
):Ref<T>
get:()=>T
set:(value:T)=>void
},
debuggerOptions?:DebuggerOptions
):Ref<T>
DebuggerOptions:{onTrack,onTrigger}
reactive()
返回一个对象的响应式代理
function reactive<T extends onject>(target:T):UnwrapNestedRefs<T>
响应式转换是深层的,他会影响所有嵌套属性,会深层的解包任何ref属性,同时保持响应性
如果想避免深层转换,可以说会用shallowReactive()
返回的对象是proxy的包裹,不等于源对象,需要避免使用源对象
readonly()
接受一个对象,或者是一个ref,返回一个原值的只读代理
function readonly<T extends object>(target:T):DeepReaonly<UnwrapNestedRefs<T>>
只读代理是深层的,对任何嵌套属性的访问都是只读的,行为与reactive一致
避免深层转换使用shallowReadonly()
watchEffect()
立即运行一个函数,同时响应式的追踪依赖,并在依赖更改时重新执行
function watchEffect(
effect: (onCleanup: OnCleanup) => void,
options?: WatchEffectOptions
): StopHandle
type OnCleanup = (cleanupFn: () => void) => void
interface WatchEffectOptions {
flush?: 'pre' | 'post' | 'sync' // 默认:'pre'
onTrack?: (event: DebuggerEvent) => void
onTrigger?: (event: DebuggerEvent) => void
}
type StopHandle = () => void
effect: (onCleanup: OnCleanup) => void,
options?: WatchEffectOptions
): StopHandle
type OnCleanup = (cleanupFn: () => void) => void
interface WatchEffectOptions {
flush?: 'pre' | 'post' | 'sync' // 默认:'pre'
onTrack?: (event: DebuggerEvent) => void
onTrigger?: (event: DebuggerEvent) => void
}
type StopHandle = () => void
第一个参数是要运行的副作用函数,这个副作用函数的参数也是一个函数,用来注册清理回调。清理回调会在该副作用下一次执行前被调用,可以用来清理无效的副作用,例如等待中的异步请求
watchEffect(async (onCleanup) => {
const { response, cancel } = doAsyncWork(id.value)
// `cancel` 会在 `id` 更改时调用
// 以便取消之前
// 未完成的请求
onCleanup(cancel)
data.value = await response
})
const { response, cancel } = doAsyncWork(id.value)
// `cancel` 会在 `id` 更改时调用
// 以便取消之前
// 未完成的请求
onCleanup(cancel)
data.value = await response
})
第二个参数是一个可选地选项,可以调整副作用的刷新时机和调试副作用的依赖
默认情况下,侦听器会在组件渲染之前执行。设置flush:post之后,将侦听器延迟到组件渲染之后执行。flush:sync可以在依赖发生变化立即触发侦听器(谨慎使用,若果有多个属性同事更新,会导致一些性能和属性一致性的问题);返回值可以用来停止副作用
const stop = watchEffect(() => {})
// 当不再需要此侦听器时:
stop()
// 当不再需要此侦听器时:
stop()
默认情况下,用户创建的侦听器回调,都会在 Vue 组件更新之前被调用。这意味着你在侦听器回调中访问的 DOM 将是被 Vue 更新之前的状态。
如果想在侦听器回调中能访问被 Vue 更新之后的DOM,你需要指明 flush: 'post' 选项
如果想在侦听器回调中能访问被 Vue 更新之后的DOM,你需要指明 flush: 'post' 选项
watchPostEffect
watchEffect使用了flush:post选项时的别名
watchSyncEffect
watchEffect使用了flush:sync选项时的别名
watch()
侦听一个或者多个响应式数据源,并在数据源发生变化时调用所给的回调函数
// 侦听单个来源
function watch<T>(
source: WatchSource<T>,
callback: WatchCallback<T>,
options?: WatchOptions
): StopHandle
// 侦听多个来源
function watch<T>(
sources: WatchSource<T>[],
callback: WatchCallback<T[]>,
options?: WatchOptions
): StopHandle
type WatchCallback<T> = (
value: T,
oldValue: T,
onCleanup: (cleanupFn: () => void) => void
) => void
type WatchSource<T> =
| Ref<T> // ref
| (() => T) // getter
| T extends object
? T
: never // 响应式对象
interface WatchOptions extends WatchEffectOptions {
immediate?: boolean // 默认:false
deep?: boolean // 默认:false
flush?: 'pre' | 'post' | 'sync' // 默认:'pre'
onTrack?: (event: DebuggerEvent) => void
onTrigger?: (event: DebuggerEvent) => void
}
function watch<T>(
source: WatchSource<T>,
callback: WatchCallback<T>,
options?: WatchOptions
): StopHandle
// 侦听多个来源
function watch<T>(
sources: WatchSource<T>[],
callback: WatchCallback<T[]>,
options?: WatchOptions
): StopHandle
type WatchCallback<T> = (
value: T,
oldValue: T,
onCleanup: (cleanupFn: () => void) => void
) => void
type WatchSource<T> =
| Ref<T> // ref
| (() => T) // getter
| T extends object
? T
: never // 响应式对象
interface WatchOptions extends WatchEffectOptions {
immediate?: boolean // 默认:false
deep?: boolean // 默认:false
flush?: 'pre' | 'post' | 'sync' // 默认:'pre'
onTrack?: (event: DebuggerEvent) => void
onTrigger?: (event: DebuggerEvent) => void
}
默认是懒监听,只有侦听源发生变化才会执行回调
第一个参数是侦听的源,可以使一个函数,返回一个值,可以是ref、响应式对象,或者以上类型组成的数组
第二个参数是发生变化需要执行的回调函数。回调函数有3个参数,新值、旧值、用于注册副作用清理的回调函数,该回调会在副作用下次重新执行前调用,可以用来清除无效的副作用,例如等待中的异步请求
第三个参数是一个对象选项
immediate
创建侦听器时立即触发回调,默认false
deep如果源是对象,强制深度遍历,一遍在深层级变更时触发回调,默认false
flush 调整回调函数的刷新时机
ontrack onTrigger 调试侦听器的依赖
侦听一个函数时,只有在函数的返回值发生变化时才会执行回调函数
响应式API:工具函数
isRef()
检查某个值是否为一个ref
function isRef<T>(r:Ref<T>|unknown):r is Ref<T>
unRef()
如果参数是ref,则返回内部值,否则返回参数本身
这是一个语法糖
val = isRef(val)?val.value:val
function unRef<T>(ref:T|Ref<T>):T
toRef()
基于响应式对象上的一个属性,创建一个对应的ref。这样创建的ref与其源属性保持同步,改变原属性的值将更新ref的值反之亦然
function toRef<T extend object, k extends keyof T>(object:T, key:K, defaultVlaue?:T[K]):ToRef<T[K]>
type ToRef<T> = T extends Ref?T:Ref<T>
type ToRef<T> = T extends Ref?T:Ref<T>
注意const fooRef= ref(state.foo) 这里的fooRef和state.foo不会保持同步
toRefs()
将一个响应式对象转换成一个普通对象,这个普通对象的每个属性都指向源对象相应属性的ref。每个单独的ref都是使用toRef创建的
functions toRefs<T extends object>(object:T):{[K in keyof T ]:ToRef<T[K]>}
type ToRef = T extends Ref? T:Ref<T>
type ToRef = T extends Ref? T:Ref<T>
使用它,可以结构返回的对象而不失去响应性
isProxy()
返回对象是否由reactive、readonly、shallowReactive、shallowReadonly()创建的代理
function isPoxy(vlue:unknown):boolean
isReactive()
检查对象是否由reactive或者shallowReactive创建的代理
function isReactive(value:unknown):boolean
isReadonly()
检查对象是否是由readonly或者shallowReadonly创建的代理
function isReadonly(value:unknown):boolean
响应式:进阶
shallowRef()
ref的浅层作用形式
function shallowRef<T>(value:T):shallowRef<T>
interface shallowRef<T>{value:T}
interface shallowRef<T>{value:T}
不会深层地柜的转为响应式。只有对.valu的访问是响应式的
triggerRef()
function triggerRef(ref: shallowRef):void
因为浅层ref不会在深层次数据改变时有响应式,使用triggerRef可以手动触发响应式
customRef()
创建一个自定义的ref,显示声明对其依赖和更新触发的控制方式
function customRef<T>(factory:CustomRefFactory<T>):Ref<T>
type CustomRefFactory<T>=(track:()=>Void, trigger:()=>void)=>{get:()=>T, set:(value:T)=>void}
type CustomRefFactory<T>=(track:()=>Void, trigger:()=>void)=>{get:()=>T, set:(value:T)=>void}
预期接受一个工厂函数作为参数,这个工厂函数接受track和trigger两个函数作为参数,返回一个带有get、set的对象
一般来说track在get方法中调用,trigger在set方法找那个调用,然而事实上我们对何时调用有完全的控制权
shallowReactive()
reactive的浅层作用形式
function shallowReactive<T extends object>(target:T):T
没有深层级的转换:一个浅层响应式对象只有跟级别的属性时响应式的。而且对ref不会自动解包了
shallowReadonly()
readonly的浅层作用形式
function shallowReadonly<T extends onject>(target:T):Readonly<T>
对ref不会自动解包
toRow()
根据一个vue创建的代理返回其原始对象
function toRaw<T>(proxy:T):T
可以返回由reactive readonly shallowReactive shallowReadonly创建的代理对应的原始对象
markRaw()
将一个对象标记为不仅可被转为代理,返回该对象本身
function markRaw<T extends object>(value:T):T
effectScope()
创建一个effect作用域,可以捕获其中所创建的响应式副作用(即计算属性和侦听器),这样捕获到的副作用可以一起处理
function effectScope(detached?: boolean): EffectScope
interface EffectScope {
run<T>(fn: () => T): T | undefined // 如果作用域不活跃就为 undefined
stop(): void
}
interface EffectScope {
run<T>(fn: () => T): T | undefined // 如果作用域不活跃就为 undefined
stop(): void
}
用于收集所有副作用,可以一起结束
getCurrentScope()
如果有的话,返回当前活跃的effect作用域
function getCurrentScope():EffectScope|undefined
onScopeDispose()
在当前活跃的effect作用域上注册一个处理回调函数。当相关effec它作用于停止时,会调用这个回调函数
这个方法可以作为可复用的组合式函数中onUnmounted的替代品,它并不与组件耦合,因为每一个vue组件的setip函数也是在一个effect作用域中调用的
function onScopeDispose(fn:()=>void):void
全局钩子onScopeDispose()提供与 类似的功能onUnmounted(),但适用于当前范围而不是组件实例。这可能有利于可组合函数清理其副作用及其范围。由于setup()还为组件创建了一个作用域,它相当于onUnmounted()没有创建显式的效果作用域。
生命周期
onMounted()
组件挂在完成后执行
已挂载
所有同步子组件都被挂载
自身DOM树已经创建完成并插入了父容器中。
这个钩子在服务器端渲染期间不会被调用
onUpdated()
组件应为响应式状态变更而更新其DOm树之后调用
父组件的更新钩子会在子组件的更新钩子之后调用
这个钩子在服务器端渲染期间不会被调用
onUnMounted
组件实例卸载之后调用
卸载
左右子组件都已经被卸载
所有相关的响应式作用都已经停止
可以用来手动清理一些副作用,例如计时器、DOM监听器
这个钩子在服务器端渲染期间不会被调用
onBeforeMount()
组件挂载之前被调用
组件已经完成了额响应式状态的设置,但还没有创建DOM节点
这个钩子在服务器端渲染期间不会被调用
onBeforeUpdate()
组件即将因为响应式状态变更二跟他更新其DOM树之前调用
这个钩子在服务器端渲染期间不会被调用
onBeforeUnMount()
组件被卸载之前调用,调用时,组件实例一样保有全部功能
这个钩子在服务器端渲染期间不会被调用
onErrorCapture()
在捕获了后代组件传递的错误时调用。
返回false可以阻止错误向上传递
错误来源
1. 组件渲染
2、 事件处理器
3. 生命周期钩子
4. setup函数
5. 侦听器
6. 自定义指令钩子
7. 过度钩子
错误传递规则
1. 默认情况下,所有错误都会被发送到应用级的app.config.errorHandler,这样错误都能在一个同一的地方报告给分析服务
2. 如果组件的继承链或组件链上存在多个errprCapture钩子,对于同一个错误,这些钩子会被按从底至上的顺序一一调用。这个过程被称为向上传递
3. 如果errorCapture钩子本身抛出错误,这个错误和原来的错误都会被发送到app.config.errorHandler
4. errprCapture可以返回false来阻止向上传递
onRenderTracked()
组件渲染过程中追踪到响应式依赖时调用,开发模式可用
这个钩子在服务器端渲染期间不会被调用
onRenderTriggered()
当响应式依赖的变更触发了组件渲染时调用,开发模式下可用
这个钩子在服务器端渲染期间不会被调用
onActivated()
若组件实例是 <KeepAlive> 缓存树的一部分,当组件被插入到 DOM 中时调用。
这个钩子在服务器端渲染期间不会被调用
onDeactivated()
若组件实例是 <KeepAlive> 缓存树的一部分,当组件从 DOM 中被移除时调用。
这个钩子在服务器端渲染期间不会被调用
onServePrefeach()
注册一个异步函数,在组件实例在服务器上被渲染之前调用。
这个钩子仅会在服务端渲染中执行,可以用于执行一些仅存在于服务端的数据抓取过程。
依赖注入
provide()
提供一个值,可以被后代注入
function provide<T>(key:InjectionKey<T>|string, value:T):void
第一个参数是注入的key,可以使字符串或者symbol;第二个参数是要注入的值
当时用ts时,key可以是一个被断言为InjectionKey的symbol。InjectionKey是一个工具类型,继承自Symbol,可以用来同步provide和inject之间值得类型
inject
注入由祖先或整个应用通过provide提供的值
funtion inject<T>(key:InjectionKey<T>|string):T|undefined
function inject<T>(key:InjectionKey<T>|string, default:T):T
function inject<T>(key:InjectionKey|string, default:()=>T, treatDefaultAdFactory:true):T
function inject<T>(key:InjectionKey<T>|string, default:T):T
function inject<T>(key:InjectionKey|string, default:()=>T, treatDefaultAdFactory:true):T
第一个参数是key,vue会遍历组件链,通过匹配key来确定所提供的值,如果有多个key对应,那么离得近的会覆盖更远的值,没有匹配到则返回undefind,除非有默认值
第二个参数可选,即默认值。他也可以是一个工厂函数,用来返回创建起来比较复杂的值。如果默认值本身是一个函数,那么必须将第三个参数传递false,表示这个函数就是默认值而不是工厂函数
选项API
状态选项
data
用于声明组件初始响应式状态的函数
该函数返回一个普通的javascript对象,vue会把他转换成响应式对象。实例创建后可以通过this.$data访问,组件实力上也代理了对象上所有的属性
_或者$开头的属性不会被组件实例代理,因为他们可能可vue内置属性、方法冲突,必须用this.$data._property的方式访问
props
声明组件的props
vue中所有组件的props都需要被显式声明
使用字符串数组
使用对象的完整形式,key对应props名称,值对应具有的类型的构造函数或者其他选项
选项如下
type
可以是String、Number、Boolean、Array、Object、Date、Function、Symbol、任何自定义的构造函数
defalut
默认值
对象或者数组的默认值必须从一个工厂函数返回
boolean
定义是否必须传入
validator
prop值作为唯一参数出入的自定义验证函数,return fale,会抛出控制台警告
computed
用于声明要在组件实例上暴露的计算属性
接受一个对象,key是计算属性的名称,值时计算属性的getter,或者一个具有get和set方法的对象
注意,如果你为一个计算属性使用了箭头函数,则 this 不会指向该组件实例,不过你仍然可以通过该函数的第一个参数来访问实例
methods
声明要混入到组件实例中的方法
声明的方法可以直接通过组件实例访问,或者在模板语法表达式中使用。所有的方法都会将它们的 this 上下文自动绑定为组件实例,即使在传递时也如此。
在声明方法时避免使用箭头函数,因为它们不能通过 this 访问组件实例。
在声明方法时避免使用箭头函数,因为它们不能通过 this 访问组件实例。
watch
声明在数据更改时调用的侦听回调
期望接受一个对象,key是需要侦听的响应式组件的实例属性,值时相应的回调函数。该回调函数接受被侦听源的新值和旧值
键名支持点分割符的路径
额外选项
immediate
在侦听器创建时立即触发回调
deep
如果源是对象或者数组,则强制深度遍历源
flush
调整回调的刷新时机
onTrack/onTrigger
调试侦听器的依赖关系
emit
声明由组件触发的自定义事件
声明形式
1.字符串数组
2.对象的完整形式,key是事件的名称,value是null或者验证函数,验证函数会接收到传递给组件的¥emit调用的额外参数,返回boolean
expose
声明当组件实例被父组件通过模板引用时访问的公共属性
默认情况下,组件实例会向父组件暴露所有的实例属性。expose选项包含要暴露的属性名字符串数组
渲染选项
template
声明组件的字符串模板
会在运行时编译,需要vue带有模板编译器。文件名中带有runtime的vue未包含模板编译器
如果以#开头,则会被用作querySelector的选择器,使用选中元素的innerHTML作为模板字符串
如果组件不包含template和render选项,vue会使用关在元素的innerHTML作为模板
render
优先级大于template,因为所有的模板都会被编译成渲染函数
用于创建组件虚拟DOM树的函数
compilerOptions
配置组件模板的运行时编译器选项
仅在使用完整构建版本,即在浏览器中编译模板的vue文件才有效
生命周期选项
beforeCreate
会在实例初始化完成、props解析完成之后、data和computed等选项处理之前立即调用
setup在所有选项式API钩子之前调用
created
在组件实例处理完所有与状态相关的选项后调用
这个钩子调用时,响应式数据、计算属性、方法和侦听器已经完成,但是挂载还未开始,$el不可用
beforeMount
挂载之前调用
组件完成了响应式状态的设置,但没有创建DOM节点,它即将首次执行DOM渲染过程
mounted
组件挂载之后调用
beforeUpdate
updated
beforeUnmounted
unmounted
errorCaptured
renderTracked
renderTriggered
activated
deactivated
serverPrefeach
组合选项
provide
提供被后代组件注入的值
inject
声明从上次提供方匹配并注入当前组件的属性
选项时以下两种
1.字符串数组
2.一个对象
key是在当前组件绑定的名称
value
1.匹配可用于注入的key
2.一个对象,from属性用于匹配注入,default用于默认值,如果默认值是对象,那么需要工厂函数
mixins
组件选项对象的数组,这些选项会被混入当前组件
不再推荐
extends
要继承的基类组件
使一个组件可以继承另一个组件的组件选项,extends和mixins几乎相同
mixins选项用于组合功能,extends一般更关注继承关系
其他
name
name显式声明组件展示时的名称
在keepAlive通过include和exclude来匹配需要缓存的组件时,组件的name必须声明
在<script setup>的单文件组件中会自动根据文件名生成name选项,即使配合keepalive也不用手动声明
inheriAttrs
控制是否启用默认的组件attribute透传行为
boolean
默认名情况下,父组件传递的,但没有被子组件解析为props的attribute绑定会被透传。这意味着当有一个单根节点的子组件,这些绑定会作为常规的HTML attribute应用在子组件的更节点元素上。
components
一个对象,用于注册当前组件可用的组件
key是组建中使用的名字,value是组件
directives
对象,用来注册当前组件可用的指令
key是指令名称,value是指令对象
组件实例
$data
$props
$el
该组件实例管理的DOM根节点
$options
已解析的用于实例化当前组件的组件选项
$parent
$root
$slots
返回一个对象,默认插槽的key是default,key对应插槽名字
$refs
$attrs
所有透传的attribute对象
$watch
命令式侦听器的API
$emit
$forceUpdate
$nextTick
内置内容
指令
v-text
期望绑定值类型string,更新元素的文本内容
v-html
更新元素的innerHTML
v-show
改变可见性,设置diaplay
v-if
有条件的渲染元素或者模板片段
v-else
v-else-if
v-for
v-on
缩写@
修饰符
.stop
event.stopPropagation
.prevent
event.preventDefault
.capture
捕获模式添加事件监听器
.self
只有事件从元素本身发出才触发
.once
最多触发一次处理函数
.left
鼠标左键
.right
鼠标右键
.middle
鼠标中建
.passive
.{keuyAlias}
某些按键触发
v-bind
缩写:
修饰符
.camel
将短横线命名的attribute转变成驼峰式命名
.prop
强制绑定为DOM property
.attr
前置绑定为DOM attribute
v-model
修饰符
.lazy
监听change事件而不是input
.number
将输入的合法字符串转为数字
.trim
移除内容两端空格
v-slot
缩写#
参数:插槽名
v-pre
跳过该元素及其子元素的编译
所有vue模板语法回报被保留并按原样渲染,最常见的就是显示原始大括号标签及其内容
v-once
仅渲染元素和组件一次,并跳过之后的更新
用于优化更新时的性能
v-memo v3.2
缓存一个模板的子树。该指令需要传入一个固定铲毒的依赖值数组进行比较。如果每个值都一样会跳过子树的更新
甚至可以跳过虚拟dom的纯谷酒,因为缓存的子树副本可以重新使用
最常见的场景是用于优化渲染海量v-fro列表(超过1000)
v-cloak
隐藏尚未完全编译的DOM模板
当在DOM中书写模板时,可能会出现一种未编译模板闪现的情况,用户先看到大括号再替换成真实渲染的内容
v-cloak会保留在所绑定的元素上,知道相关实例挂载后才移除。配合css [v-clock]{diaplay:none}可以在组件编译完成之前隐藏原始模板
组件
内置组件在模板中使用无需引入,但是在渲染函数中使用需要导入
Transition
为单个元素或组件提供动画过度效果
事件
@before-enter
@before-leave
@enter
@leave
@after-enter
@after-leave
@after-appear
@enter-cancelled
@leave-cancelled
@appear-cancelled
TransitionGroupop
为列表中的多个元素或组件提供过度效果
默认情况想,不会渲染一个容器DOM,可以通过tag启用一个容器
每个子节点必须由独立的key
KeepALive
缓存包裹在其中的动态切换组件
include
需要缓存的组件名称数组
exclude
不需要缓存的组件名称数组
max
最大缓存数
Teleport
将其插槽内容渲染到DOM的另一个位置
to
string|HTMLElemet
disabled
Suspense
实验属性
用于协调对组件树中嵌套的一步依赖的处理
事件
@resolve
@pending
@fallback
插槽
#default
#fallback
特殊元素
component
用于渲染动态组件或元素的元组件
is
string,决定渲染成什么组件
slot
模板中插槽内容出口
name指定具名插槽的名字
其他attribute,作为作用域插槽的props
特殊Attributes
key
用作vue的虚拟DOM算法提示,比较纠结点列表时用于识别vnode
同一个父节点下的key必须唯一
可以用于前置替换一个元素、组件而不是复用它
ref
注册模板引用
is
绑定动态组件
单文件组件
语法定义
SFC使用.vue作为扩展名,三种顶层语言构成template script style
template
编译城渲染函数,附在导出的组件上作为render选项
script
作为es模块执行,默认导出应该是vue的组件选项对象,或者是一个对象子目录或者是defineComponent函数的返回值
script setup
脚本被预处理为setup函数
style
封装当前组件的样式
SFC会在开发警告信息、devtools、地柜自检自引用时根绝文件名推导组件名
预处理器
script使用lang来什么预处理器语言<script lang=ts>
src导入
template、script、style都可以说使用src来引用另一个外部文件
script setup
单文件组件中使用组合式API的编译时语法糖
顶层的绑定会被暴露给模板,都能在模板中直接使用
响应式
使用响应式API来创建。ref、reactive、readonly、shallow版本
自定义指令
遵循vNameOfDirective的命名规范可以作为一个指令
使用defineProps和defineEmits来定义props和emits并且获得完整的类型推导
defineExpose
默认的模板引用不会公开任何属性和方法,可以使还是用defineExpose开公开
useSlots、useAttrs()
在script中获取插槽和属性
和普通script一起使用
可以用来声明无法在setup中声明的选项,例如inheriAttrs或者插件的自定义选项
运行只需要在模块作用域执行一次的副作用,或者是创建单例对象
声明模块的具名导出
顶层await
顶层的await会被编译成async setup,成为一个异步组件,需要和suspense组合使用(实验阶段)
props默认值
witdhDefault
限制
不能和src外部导入模板、style、js一起使用
css功能
作用域css scope
scope的css只影响当前组件的元素和shadowDOM中的样式封装类似
使用scoped后,父组件的样式不会渗透到子组件中。但是子组件的根节点会同时被父组件的作用域样式和子组件的作用域样式影响
深度选择器
如果处于scoped样式中的样式想要做深度的选择,想要影响到子组件可以使用:deep这个伪类
插槽选择器
默认作用域样式不会影响插槽中的内容
使用:slotted伪类明确的将插槽内容作为选择器目标
全局选择器
:global
可以同时包含作用域样式和非作用域样式
css module
一个<style module>标签会被编译城cssModule并将生成的css class作为$tyle对象暴露给组件
可以在模板中使用使用$style.red,实现了将css仅作用域当前组件的效果
自定义注入名称<style module='name'> 可以把默认的$style换成name
和组合式API一起使用,useCssModule()
css中的v-bind
单文件组件中的样式,支持使用v-bind,把css的值连接到动态的组件状态
<style>
.text {
color: v-bind(color);
}
</style>
.text {
color: v-bind(color);
}
</style>
进阶API
渲染函数
h()
创建虚拟DOM节点
第一个参数是一个字符串或者组件定义,说明渲染的是什么元素或组件
第二个参数是要传递的props
第三个参数是子节点
// 传递单个默认插槽
h(Foo, () => 'default slot')
// 传递具名插槽
// 注意,需要使用 `null` 来避免
// 插槽对象被当作是 prop
h(MyComponent, null, {
default: () => 'default slot',
foo: () => h('div', 'foo'),
bar: () => [h('span', 'one'), h('span', 'two')]
})
h(Foo, () => 'default slot')
// 传递具名插槽
// 注意,需要使用 `null` 来避免
// 插槽对象被当作是 prop
h(MyComponent, null, {
default: () => 'default slot',
foo: () => h('div', 'foo'),
bar: () => [h('span', 'one'), h('span', 'two')]
})
mergeProps()
合并多个props对象,用于处理含特定的props参数的情况
支持合并class、style、onXxx事件监听器(多个同名的事件监听器被合并到一个数组)
import { mergeProps } from 'vue'
const one = {
class: 'foo',
onClick: handlerA
}
const two = {
class: { bar: true },
onClick: handlerB
}
const merged = mergeProps(one, two)
/**
{
class: 'foo bar',
onClick: [handlerA, handlerB]
}
*/
const one = {
class: 'foo',
onClick: handlerA
}
const two = {
class: { bar: true },
onClick: handlerB
}
const merged = mergeProps(one, two)
/**
{
class: 'foo bar',
onClick: [handlerA, handlerB]
}
*/
cloneVNode()
克隆一个vnode
返回一个克隆的vnode,并可以在原有基础上添加一些额外的prop
vnode被创建之后不能被修改,应该附带额外的prop来克隆
cloneVNode(original,{id:'foo'})
isVNode()
判断一个值是否是vnode
resolveComponent()
按名称手动解析已注册的组件
如果可以直接引入组件就不需要使用此方法
为了能够从正确的组件上下文解析,resolveComponent必须在setup或渲染函数内调用,如果组件未找到,会爆出一个运行警告
resolveDirective
按名称手动解析已注册的指令
如果可以直接引入组件就不需要使用测方法
必须在setUp或者渲染函数内调用,指令未找到会抛出一个运行时警告
withDirective
用于给vnode添加自定义指令
使用自定义指令包装一个现有的vnode,第二个参数是自定义指令数组,每个自定义指令可以表示为[Directive, value, argument, modefiers]
import { h, withDirectives } from 'vue'
// 一个自定义指令
const pin = {
mounted() {
/* ... */
},
updated() {
/* ... */
}
}
// <div v-pin:top.animate="200"></div>
const vnode = withDirectives(h('div'), [
[pin, 200, 'top', { animate: true }]
])
// 一个自定义指令
const pin = {
mounted() {
/* ... */
},
updated() {
/* ... */
}
}
// <div v-pin:top.animate="200"></div>
const vnode = withDirectives(h('div'), [
[pin, 200, 'top', { animate: true }]
])
widthModifiers
用于向事件处理函数添加内置v-on修饰符
import { h, withModifiers } from 'vue'
const vnode = h('button', {
// 等价于 v-on.stop.prevent
onClick: withModifiers(() => {
// ...
}, ['stop', 'prevent'])
})
const vnode = h('button', {
// 等价于 v-on.stop.prevent
onClick: withModifiers(() => {
// ...
}, ['stop', 'prevent'])
})
服务端渲染
renderToString
renderToNodeStream
将输入渲染为一个 Node.js Readable stream 实例。
pipeToNodeWritable()
将输入渲染并 pipe 到一个 Node.js Writable stream 实例。
renderToWebStream()
将输入渲染为一个 Web ReadableStream 实例。
pipeToWebWritable()
将输入渲染并 pipe 到一个 Web WritableStream 实例。
renderToSimpleStream()
通过一个简单的接口,将输入以 stream 模式进行渲染。
useSSRContext()
一个运行时 API,用于获取已传递给 renderToString() 或其他服务端渲染 API 的上下文对象
ts工具类型
PropsType<T>
用于在运行时props声明时给一个props标注更复杂的类型定义
import { PropType } from 'vue'
interface Book {
title: string
author: string
year: number
}
export default {
props: {
book: {
// 提供一个比 `Object` 更具体的类型
type: Object as PropType<Book>,
required: true
}
}
}
interface Book {
title: string
author: string
year: number
}
export default {
props: {
book: {
// 提供一个比 `Object` 更具体的类型
type: Object as PropType<Book>,
required: true
}
}
}
ComponentCustomProperties
用于增强组件实例类型以支持自定义全局属性。
import axios from 'axios'
declare module 'vue' {
interface ComponentCustomProperties {
$http: typeof axios
$translate: (key: string) => string
}
}
declare module 'vue' {
interface ComponentCustomProperties {
$http: typeof axios
$translate: (key: string) => string
}
}
ComponentCustomOptions
用来扩展组件选项类型以支持自定义选项。
import { Route } from 'vue-router'
declare module 'vue' {
interface ComponentCustomOptions {
beforeRouteEnter?(to: any, from: any, next: () => void): void
}
}
declare module 'vue' {
interface ComponentCustomOptions {
beforeRouteEnter?(to: any, from: any, next: () => void): void
}
}
ComponentCustomProps
用于扩展全局可用的 TSX props,以便在 TSX 元素上使用没有在组件选项上定义过的 props。
declare module 'vue' {
interface ComponentCustomProps {
hello?: string
}
}
export {}
interface ComponentCustomProps {
hello?: string
}
}
export {}
// 现在即使没有在组件选项上定义过 hello 这个 prop 也依然能通过类型检查了
<MyComponent hello="world" />
<MyComponent hello="world" />
CSSProperties
用于扩展在样式属性绑定上允许的值的类型。
declare module 'vue' {
interface CSSProperties {
[key: `--${string}`]: string
}
}
interface CSSProperties {
[key: `--${string}`]: string
}
}
<div style={ { '--bg-color': 'blue' } }>
<div :style="{ '--bg-color': 'blue' }">
自定义渲染
createRenderer()
创建一个自定义渲染器。通过提供平台特定的节点创建以及更改 API,你可以在非 DOM 环境中也享受到 Vue 核心运行时的特性。
import { createRenderer } from '@vue/runtime-core'
const { render, createApp } = createRenderer({
patchProp,
insert,
remove,
createElement
// ...
})
// `render` 是底层 API
// `createApp` 返回一个应用实例
export { render, createApp }
// 重新导出 Vue 的核心 API
export * from '@vue/runtime-core'
const { render, createApp } = createRenderer({
patchProp,
insert,
remove,
createElement
// ...
})
// `render` 是底层 API
// `createApp` 返回一个应用实例
export { render, createApp }
// 重新导出 Vue 的核心 API
export * from '@vue/runtime-core'
0 条评论
下一页