您现在的位置是:首页 >学无止境 >【Vue3】vue3中的watchEffect使用及其他的API网站首页学无止境

【Vue3】vue3中的watchEffect使用及其他的API

Aic山鱼 2023-06-09 20:00:04
简介【Vue3】vue3中的watchEffect使用及其他的API

e301bb2d0ebc466fb95a4e30b5735a63.png

目录

 一,watchEffect

二,生命周期

三,什么是hooks?

四,toRef

 五,其他组合式API

5.1shallowReactive&shallowRef

5.2readonly&shallowReadonly

5.3.toRaw&markRaw

5.4自定义Ref-customRef

​5.5provide$inject

5.6响应式数据的判断

写在最后


 

 

 一,watchEffect

1.watch: 既要指明监视的属性,也要指明监视的回调。

2.watchEffect: 不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。

3.watchEffect类似computed但computed注重的计算出来的值(回调函数的返回值),所以必须要写返回值而watchEffect更注重的是过程(回调函数的函数体),所以不用写返回值

4.watchEffect监视的是他所使用到的数据,当它所使用到的数据发生了变化,watchEffect函数就会执行,有点类似computed计算属性,但是computed更注重执行后的返回值

            watchEffect(() => {
                const x = sum.value
                const y = person.job.work1.gongzi
                console.log('watchEffect变化了')
            })

d11d3a151508479eb162852d0efca234.png

二,生命周期

Vue3提供的组合式API对应关系

beforeCreate()setup
created()setup
beforeMount()onbeforeMount
mounted()...
beforeUpdate()...
updated()...
beforeUnmount()...
unmounted()...

a158a4b8bd064c489168cdc3902f7ecd.png

三,什么是hooks?

其实hooks的本质就是一个函数,他负责把setup函数中的组合式API进行封装,以便得到更好的复用类似于vue2中的mixin

1.首先创建一个hooks文件

ed2b5551ac2d4c6bbb1dc82181b63449.png

 2.将方法,API封装起来并导出

fd88a10b393440f38413857723732c64.png

3.引入hooks并使用封装的方法

a0b9fd08e0e9452587ab7f4fd861200c.png 

四,toRef

作用: 创建一个 ref 对象,其value值指向另一个对象中的某个属性 语法:.const name = toRef(person,'name') 应用:要将响应式对象中的某个属性单独提供给外部使用时 扩展: toRefstoRef 功能一致,但可以批量处理多个ref对象,语法: toRefs(person)

 

let person = reactive(
                {
                    name:'小明',
                    age:11,
                    sex:'男',
                    job:{
                        j1:{
                            work:"student",
                            salary:1000
                        }
                    }
                }
            )            
return {
                person,
                // 逐个拆分person里面的属性并且交出去
                // name:toRef(person,'name'),
                // age:toRef(person,'age'),
                // salary:toRef(person.job.j1,'salary')
​
                // 将person对象拆分并交出去
                ...toRefs(person)
            }

5c5305d67a8f4ac2931e920339ff94c3.png

 81924c563b334d908830fe70b8dd1037.gif

 五,其他组合式API

5.1shallowReactive&shallowRef

sharlowReactive: 只处理对象最外层属性的响应式 (浅响应式)

9d252ddd07aa4c1092a6768afaa14b86.png shallowRef: 只处理基本数据类型的响应式,不进行对象的响应式处理

b177eb35319c4b96b2f7d79c467a1a72.png

 1.什么时候使用? 如果有一个对象数据,结构比较深,但变化时只是外层属性变化 ===> shallowReactive. 如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换 ===> shallowRef

 

 

5.2readonly&shallowReadonly

1.readonly: 让一个响应式数据变为只读的 (深只读)

2.shallowReadonly: 让一个响应式数据变为只读的 (浅只读)

3.应用场景: 不希望数据被修改时

eafeb335ffad448a9223c8a06b22a41b.png

 

5.3.toRaw&markRaw

toRaw 1.作用:将一个由 reactive 生成的响应式对象转为普通对象 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新0 markRaw 1.作用: 标记一个对象,使其永远不会再成为响应式对象 2.应用场景:①有些值不应被设置为响应式的,例如复杂的第三方类库等②当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。

5.4自定义Ref-customRef

<template>
    <input type="text" v-model="dataOne">
    <div>{{dataOne}}</div>
</template>
​
<script>
import {ref,customRef} from 'vue'
export default {
    name:'App',
    setup(){
        function myRew(value,delay){
        return customRef((track, trigger)=>{
            let timer
            return {
                get(){
                    console.log('读取数据')
                    track()
                    return value
                },
                set(newValue){
                    clearTimeout(timer)
                   timer = setTimeout(()=>{
                       console.log('修改数据')
                       value = newValue
                       trigger()
                   },delay)
                }
            }
        })
        }
    let dataOne = myRew('hello',666)
        return{
            dataOne,
            myRew
        }
    },
};
</script>
<style>
</style>

​5.5provide$inject

//祖组件

<script>
    import Child from "@/components/Child";
    import {toRefs,reactive,provide} from 'vue'
    export default {
        name: 'App',
        components: {Child},
        setup() {
            let car = reactive({
                name: '奔驰',
                price: '100w'
            })
            provide('car',car)
            return {...toRefs(car)}
        }
    };
</script>
//孙组件

<script>
import {inject,toRefs} from 'vue'
    export default {
        name:'Son',
        setup() {
​
            let car = inject('car')
            return {...toRefs(car)}
        }
    };
</script>

5.6响应式数据的判断

isRef:检查一 个值是否为一个ref对象 isReactive:检查- 个对象是否是由rreactive创建的响应式代理 isReadonly:检查一个对象是否 是由readonly 创建的只读代理 isProxy:检查一个对象是否是由reactive 或者readonly 方法创建的代理

写在最后

博主简介🛌 某神秘组织成员
前端小白,前端优质创作者,阿里云博主,一个开朗的网友
有一个名为山鱼社区的社区,收录许多优秀博主的创作内容
创作不易希望能得到您的支持,您的支持是我创作的动力✌

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。