Setup
- setup 函数时,它将接受两个参数:(props、context(包含attrs、slots、emit))
- setup函数是处于 生命周期函数 beforeCreate 和 Created 两个钩子函数之前的函数
- 执行 setup 时,组件实例尚未被创建(在 setup() 内部,this 不会是该活跃实例的引用,即不指向vue实例,Vue 为了避免我们错误的使用,直接将 setup函数中的this修改成了 undefined)
- 与模板一起使用:需要返回一个对象 (在setup函数中定义的变量和方法最后都是需要 return 出去的 不然无法再模板中使用)
- 使用渲染函数:可以返回一个渲染函数,该函数可以直接使用在同一作用域中声明的响应式状态
参考文档
- https://v3.cn.vuejs.org/guide/composition-api-setup.html
- https://vue3js.cn/vue-composition-api/#setup
- https://juejin.cn/post/7048543396574527502
- https://juejin.cn/post/7004449155883991054
- https://juejin.cn/post/6944190150406570020
props
setup 函数中的第一个参数是 props。正如在一个标准组件中所期望的那样,setup 函数中的 props 是响应式的,当传入新的 prop 时,它将被更新。
参考文档
- https://v3.cn.vuejs.org/guide/composition-api-setup.html#props
- https://v3.cn.vuejs.org/guide/component-props.html
- https://blog.csdn.net/severestcritic/article/details/121434943
- https://liujiangblog.com/course/Vue3/294
context
传递给 setup 函数的第二个参数是 context。context 是一个普通 JavaScript 对象,暴露了其它可能在 setup 中有用的值
参考文档
- https://v3.cn.vuejs.org/guide/composition-api-setup.html#context
- https://www.jianshu.com/p/44e60f0c681a
Provide
参考文档
- https://v3.cn.vuejs.org/guide/composition-api-provide-inject.html#使用-provide
- https://v3.cn.vuejs.org/guide/component-provide-inject.html
- https://www.jianshu.com/p/f94a6a2559eb
- https://www.jianshu.com/p/6651dccd282c
- https://www.cnblogs.com/vickylinj/p/13368745.html
Inject
参考文档
- https://v3.cn.vuejs.org/guide/composition-api-provide-inject.html#使用-inject
- https://segmentfault.com/a/1190000021216039#:~:text=vue 提供了 provide 和 inject 帮助我们解决多层次嵌套嵌套通信问题。 在 provide,中指定要传递给子孙组件的数据,子孙组件通过 inject 注入祖父组件传递过来的数据。 其实, provide 和 inject 主要为高阶插件%2F组件库提供用例。
- https://blog.csdn.net/ZYS10000/article/details/123243486
ref
ref 是一个函数,它接受一个参数,返回的就是一个神奇的 响应式对象 。我们初始化的这个 0 作为参数包裹到这个对象中去,在未来可以检测到改变并作出对应的相应。
<template>
<h1>{{count}}</h1>
<h1>{{double}}</h1>
<button @click="increase">+1</button>
</template>
import { ref } from "vue"
setup() {
// ref 是一个函数,它接受一个参数,返回的就是一个神奇的 响应式对象 。我们初始化的这个 0 作为参数包裹到这个对象中去,在未来可以检测到改变并作出对应的相应。
const count = ref(0)
const double = computed(() => {
return count.value * 2
})
const increase = () => {
count.value++
}
return {
count,
increase,
double
}
}
参考文档
- https://vue3js.cn/reactivity/ref.html
- https://v3.cn.vuejs.org/guide/composition-api-introduction.html#带-ref-的响应式变量
computed
参考文档
- https://v3.cn.vuejs.org/guide/composition-api-introduction.html#独立的-computed-属性
- https://vue3js.cn/reactivity/computed.html
- https://vue3js.cn/vue-composition-api/#computed
reactive
参考文档
使用 ref 还是 reactive 可以选择这样的准则
- 第一,就像刚才的原生 javascript 的代码一样,像你平常写普通的 js 代码选择原始类型和对象类型一样来选择是使用 ref 还是 reactive。
- 第二,所有场景都使用 reactive,但是要记得使用 toRefs 保证 reactive 对象属性保持响应性。
import { ref, computed, reactive, toRefs } from 'vue'
interface DataProps {
count: number;
double: number;
increase: () => void;
}
setup() {
const data: DataProps = reactive({
count: 0,
increase: () => { data.count++},
double: computed(() => data.count * 2)
})
const refData = toRefs(data)
return {
...refData
}
}
toRefs
参考文档
- https://vue3js.cn/vue-composition-api/#torefs
- https://vueuse.org/shared/torefs/
- https://www.jianshu.com/p/0c6ad50a9055
生命周期钩子函数
import { onMounted, onUpdated, onUnmounted } from 'vue'
const MyComponent = {
setup() {
onMounted(() => {
console.log('mounted!')
})
onUpdated(() => {
console.log('updated!')
})
onUnmounted(() => {
console.log('unmounted!')
})
},
}
参考文档
- https://v3.cn.vuejs.org/guide/composition-api-lifecycle-hooks.html
- https://vue3js.cn/vue-composition-api/#生命周期钩子函数
- https://cn.vuejs.org/v2/guide/instance.html#生命周期图示
- https://www.jianshu.com/p/672e967e201c
- https://juejin.cn/post/7025150810640089119
- https://zhuanlan.zhihu.com/p/196771621
watch
// watch 简单应用
watch(data, () => {
document.title = 'updated ' + data.count
})
// watch 的两个参数,代表新的值和旧的值
watch(refData.count, (newValue, oldValue) => {
console.log('old', oldValue)
console.log('new', newValue)
document.title = 'updated ' + data.count
})
// watch 多个值,返回的也是多个值的数组
watch([greetings, data], (newValue, oldValue) => {
console.log('old', oldValue)
console.log('new', newValue)
document.title = 'updated' + greetings.value + data.count
})
// 使用 getter 的写法 watch reactive 对象中的一项
watch([greetings, () => data.count], (newValue, oldValue) => {
console.log('old', oldValue)
console.log('new', newValue)
document.title = 'updated' + greetings.value + data.count
})
参考文档
- https://vue3js.cn/vue-composition-api/#watch
- https://www.jianshu.com/p/b70f1668d08f
- https://www.jianshu.com/p/9524eca3cb43
defineComponent
参考文档
vue3 +Ts vsCode 报错 处理
使用 // @ts-ignore 隐藏文件中的报错
https://blog.csdn.net/qq_43869822/article/details/121637066
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
import { defineComponent, ref, reactive } from "vue";