延续前面的四篇文章:html
看完上面其实能够本身开发vue3.0了,可是这里介绍一下vue组合式API,东西很少vue
// html //点击count+1 <template> <div class="demo"> <span @click="addCount">{{count}}</span> </div> </template> //ts <script lang="ts"> import {ref} from 'vue' export default { name: 'demo', setup(props,{slot,emit,attr}){ const count = ref(0) const addCount = ()=>{ count.value++ } return {count,addCount} } } </script>
reactive与refreact
computedgit
const count = ref(1) //也可只传入一个 const plusOne = computed(() => count.value + 1) //传入get或者set属性, const plusOne = computed({ get: () => count.value + 1, set: (val) => { count.value = val - 1 }, })
watchEffectgithub
当即执行传入的一个函数,并响应式追踪其依赖,并在其依赖变动时从新运行该函数。segmentfault
//初始化运行是在组件 mounted 以前执行的 初始化时就会执行一次 建议写在onMounted钩子内 watchEffect(() => console.log(count.value))
可传入optiondom
interface WatchEffectOptions { //设置function须要同步或在组件更新以前从新运行,默认post flush?: 'pre' | 'post' | 'sync' //onTrack 和 onTrigger 选项可用于调试一个debugger的行为。 //当一个 reactive 对象属性或一个 ref 做为依赖被追踪时,将调用 onTrack //依赖项变动致使反作用被触发时,将调用 onTrigger onTrack?: (event: DebuggerEvent) => void onTrigger?: (event: DebuggerEvent) => void }
中止监听行为和中止回调ide
const stop = watchEffect((onInvalidate) => { console.log(count.value) onInvalidate(()=>{ console.log('watchEffect结束') }) }) stop() //中止
watch函数
//与watchEffect相比 1. 懒执行回调函数 2. 更明确哪些状态的改变会触发侦听器从新运行反作用 3. 访问侦听状态变化先后的值 4. 初始化时就不会执行
2.0 | 3.0 |
---|---|
beforeCreate | 使用 setup() |
created | 使用 setup() |
beforeMount | onBeforeMount |
mounted | onMounted |
beforeUpdate | onBeforeUpdate |
updated | onUpdated |
beforeDestroy | onBeforeUnmount |
destroyed | onUnmounted |
errorCaptured | onErrorCaptured |
功能相似 2.x 的 provide/inject,只能在setup中调用post
// 二者之间能够相互响应 // 提供者: const themeRef = ref('dark') provide(ThemeSymbol, themeRef) // 使用者: const theme = inject(ThemeSymbol, ref('light')) watchEffect(() => { console.log(`theme set to: ${theme.value}`) })
相似在vue2.0里面的this.$refs,可是用法已经变了
//html <div class="demo" ref="demo"> <span @click="addCount">{{count}}--{{countObject.count}}</span> </div> //setup const demo = ref(null) onMounted(()=>{ //只在渲染初始化后才能访问。 console.log(demo.value) })
// 获取list的refs <div v-for="(item, i) in list" :ref="el => { divs[i] = el }"> {{ item }} </div>
isRef与unref
//isRef 检查一个值是否为一个 ref 对象。 //unref是val = isRef(val) ? val.value : val 的语法糖
toRef与toRefs
在介绍setup中,props做为参数传入,这里的props不可用解构的方式获取,否则会失去响应性
// toRef 能够用来为一个 reactive 对象的属性建立一个 ref const countObject = reactive({count:0}) const countinObject = toRef(countObject,'count') //props获取单独的数据,并保持响应性 const propsCount = toRef(props, 'count')
//toRefs 把响应式对象转化为一个个的ref const state = reactive({ foo: 1, bar: 2, }) const stateAsRefs = toRefs(state) /* stateAsRefs 的类型以下: { foo: Ref<number>, bar: Ref<number> } */
isProxy,isReactive,isReadonly
isReadonly判断一个对象是不是由 readonly 建立的只读代理
markRaw与shallowXX
//markRow与下面的 shallowXXX 这些特性仅停留在根级别(即对象的第一层,深层次的不影响) //1. markRaw:标记一个对象为“永远不会转为响应式代理”,函数返回这个对象自己 const foo = markRaw({}) console.log(isReactive(reactive(foo))) // false // 若是被 markRaw 标记了,即便在响应式对象中做属性,也依然不是响应式的 const bar = reactive({ foo }) console.log(isReactive(bar.foo)) // false // 2.shallowReactive:只为某个对象的私有(第一层)属性建立浅层的响应式代理 // 3.shallowReadonly:只为某个对象的自有(第一层)属性建立浅层的只读响应式代理 // 4.shallowRef:建立一个 ref //注意:shallowRef并不会对变动后的 .value 作响应式代理转换 const foo = shallowRef({}) // 更改对操做会触发响应 foo.value = {} // 但上面新赋的这个对象并不会变为响应式对象 isReactive(foo.value) // false //5. toRow 返回由 reactive 或 readonly 方法转换成响应式代理的普通对象
vue3.0到这里算是尝鲜差不错了,喜欢就点赞哟,溜啦溜啦!
github代码地址