composition用法,Composition API原理深度剖析
本文探索内容包括:
- composition和options如何做到和谐共存?
- setup中的this指向哪?
- setup的参数是什么?
- setup的执行时刻
- setup中的生命周期钩子是怎么实现的?
下面,正式开始表演闪电五连鞭
,我们点到为止
第一鞭:composition和options如何做到和谐共存?
小右同学在vue3中引入composition api,起初很多人害怕它会影响我们一直熟悉的options写法,事实上两者可以共存,而且还很和谐,谁说年轻人不讲武德?小右这一拳明明是点到为止~
下面看一下vue3中如何两者和谐共存:
结论:到这里我们知道了vue3对setup和其他选项的处理逻辑:如果设置了setup则先调用它,随后再处理别的options。
但是现在的年轻人不讲武德,他们可能不按套路出拳,比如:
// data和setup中都定义了foo,那谁起作用哪?
createApp({
data() {
return {
foo: 'foo'
}
},
setup(props, ctx) {
const foo = ref('foo in setup')
return { foo }
}
}).mount('#app')
复制代码
小右可不是假大师,自然会闪
第二鞭:setup中的this指向哪?
我们看看setup被调用时时怎么处理的:
结论:所以setup中的this
就是它执行时的上下文,如果是esm
方式打包,会是undefined
;如果是单文件的方式运行,会是window
;但是不管怎样都没有什么意义,所以请大家彻底忘了this
吧,再也不用被它烦恼了。
第三鞭:setup的参数是什么?
我们看看setup执行时都传了什么进去:
参数4开始分别是instance.props
、setupContext
再看看setupContext
结论:参数1是组件属性对象,它是Proxy
对象,所以我们不能解构它,否则将失去响应性;参数2 是个对象,attrs
可以访问组件所有特性,slots
可以访问插槽内容,包括普通的和作用域插槽,它们都是函数,执行之后才能获取vnode
数组。emit
用来派发自定义事件。
// 不能解构props, 可以解构setupContext
setup({ foo, bar }, { attrs, slots, emit }) {
watchEffect(() => {
console.log(foo, bar) // foo,bar发生变化,也不会有输出
})
}
复制代码
第四鞭:setup的执行时刻
setup执行时刻非常早,甚至比beforeCreated还早:
结论:setup
里面没有beforeCreate
和created
,相关代码写到setup
里面就行;setup执行时会传入组件实例,因此在里面可以通过getCurrentInstance()
访问到它。
第五鞭:setup中的生命周期钩子是怎么实现的?
setup里面可以很灵活的使用生命周期钩子,它们可以多次编写,最后会按注册顺序依次执行:
setup() {
onMounted(() => {})
onMounted(() => {})
}
复制代码
这是怎么实现的哪?我们去看看onMounted
之类函数的实现:
看看这些钩子的别名
最后自然是这些钩子的调用
遍历执行它们