reactive相关

88 阅读1分钟

与ref的区别

  • ref支持所有类型 reactive只支持object引用类型
type r={
    name:string,
    age:number
}
let form = reactive<r>({
    name:'bb',
    age:10
})
  • ref取值赋值都需要.value reactive不需要

  • reactive proxy 不能直接赋值 否则会破坏响应式对象

    • 解决方案:1、用数组的方法 2、写成对象 总之就是不能破坏他身上的proxy
<template>
  <div>
    {{form}}
    <button @click="change">修改</button>
​
  </div>
</template>
<script setup lang='ts'>
import { ref , reactive } from 'vue'
​
​
let form = reactive([1,2,3,4])
//let form = reactive({
    arr:[]
})
const change = () =>{
   form.push(1,2,3,4)
}
</script>

readonly

let obj = reactive({name:'b'})
const read = readonly(obj)
read.name = '1' //报错改不了
obj.name = '2' //修改成功

shallowReactive

与shallowRef类似 浅层响应式

同时会被reactive所影响

const obj = shallowReactive({
    foo:{
        bar:{
            num:1
        }
    }
})
const obj2 = reactive({
    name:'1'
})
obj.foo = {xxx} //具有响应式
// obj2.name = '2'  若不注释掉  会影响下面 与ref类似
obj.foo.bar = {} //不具有响应式

reactive源码

if(isReadonly(target)) return target  //只读类型 直接返回
return createReactiveObject(
    target,
    false, //isReadonly
    mutableHandlers, //用于引用类型创建proxy
    mutableCollectionHandlers,//用于set map weakset weakmap 类型创建proxy
    reactiveMap
)
​
/*
大量的判断 
若传入类型不合法 提示 直接返回
若传入已经代理过了 直接返回
若传入还没代理 new一个proxy
*/

\