vue3 响应式 ref 、reactive、computed的区别,和watch 监听器的使用
admin
2024-03-03 11:33:50
0

2.0的时候使用的是Object.defineproperty()做的数据劫持
3.0的是使用proxy代理模式进行更新,可以监听数组,只不过穿得参数是一盒数组烦死返回的是对象形式

ref原理

ref官方文档说明是:接受一个参数值并返回一个响应式且可改变的 ref 对象。ref 对象拥有一个指向内部值的单一属性 .value

import { ref } from 'vue';
const userList = ref([{ id: 1, name: '张三' }
])
console.log(userList.value.id)  //1
const refParam = ref();
console.log(refParam)     // 返回是一个RefImpl {_rawValue: undefined, _shallow: false, __v_isRef: true, _value: undefined}
//ref的参数可以是一个任意值,返回的值是当前的参数,或者是一个undefined;
并且如果你什么也不传也可以,会返回一个响应式对象但是value是undefined;

reactive

如果是一个对象,则使用做深度代理,否则直接返回

const loginForm = reactive({username: '',password: '',imageCode: '',smscode: '',
})const { password, username, smscode, imageCode } = loginFormconst params = {username,smscode,imageCode,password: encryptedPassword,grant_type: 'password',scope: 'all',}

computed 计算机属性

computed支持读写操作,不可以进行修改操作,但是我们如果想要修改这个值的话就需要使用对象形式的参数,注意{get() =>{}, set() => {}}get和set是搭配使用的,否则出错误

// 只读模式操作
const count = ref(1)
const plusOne = computed(() => count.value + 1)console.log(plusOne.value) // 2plusOne.value++ // 错误!
// 读写模式操作
const count = ref(1)
const plusOne = computed({get: () => count.value + 1,set: (val) => {count.value = val - 1},
})plusOne.value = 1
console.log(count.value) // 0

总结:
ref:用来定义基本数据类型
reactive:用来定义对象(数组)类型数据

ref: 通过 Object.defineProperty()的 get 与 set 来实现响应式也就是数据劫持
reactive:通过使用 Proxy 来实现响应式

ref:用 ref 定义的数据,操作需要 .value
reactive : 定义的数据,操作不需要

首先ref对比reactive,reactive只能接收一个引用对象,不可以传递普通类型的数据,比如字符串、数字等,但是ref可以,因为ref返回的是一个响应式代理对象,这个对象value值就是我们的传递参数;所以如果是想代理一个对象或者是数组还是使用reactive更合适,如果我们想要代理一个普通类型的值就需要使用ref去代理更合理;

computed与 vue2 中的 computed 配置功能一致

computed接收一个响应式的对象或者值,并且还可以对这个接收的目标进行操作,但是他本身并不是一个响应式的信息,只不过是对这个响应式的参数进行了追踪,获取和修改的操作;

watch 监听器

watch与 vue2 中的 watch 配置功能一致

import { reactive, watch } from 'vue';
// 侦听一个 getter
const state = reactive({ count: 0 })
watch(() => state.count,(count, prevCount) => {/* ... */}
)// 直接侦听一个 ref
const count = ref(0)
watch(count, (count, prevCount) => {/* ... */
})
//监视 ref 定义的多个响应式数据
let msg = ref("你好啊")let sum = ref(0)watch([sum,msg],(newValue,oldValue)=>{console.log("监听sum变了",newValue,oldValue)},{immediate:true})ps:watch 一共可以传递三个值,第一个 监视的数据,监视的行为,watch 的配置

相关内容

热门资讯

华发前产品总黄凤彬空降越秀华东... 大家好,我是地产高富帅。华东市场的硝烟仍在持续,在上海与杭州,头部央企与地方国企已经形成了两大核心力...
巴西出台《商业互惠法》反制贸易... 4月12日消息,据报道称,巴西总统卢拉当地时间11日签署《商业互惠法》,授权联邦政府可对那些对巴西出...
新疆吐鲁番市高昌区发生3.6级... 4月12日消息,中国地震台网正式测定:04月12日16时08分在新疆吐鲁番市高昌区(北纬43.19度...
蔚来李斌回应“换电站被卖”传闻... 4月12日消息,据报道,针对近期“蔚来换电站将被宁德时代收购控股权”的传闻,有车主向蔚来董事长李斌求...
乘联会崔东树:3月全国汽车市场... 4月12日消息,乘联会秘书长崔东树发文称,3月全国汽车市场走势分化,呈现乘强商弱的走势。2025年1...
王莆中评京东外卖:下周发布美团... 4月12日消息,美团核心本地商业CEO王莆中在个人媒体账号发文评论近期“京东入局外卖”一事,他表示,...
海南洋浦区域国际集装箱枢纽港首... 4月12日消息,载有1100余个集装箱的“博亚厦门”轮4月11日顺利停靠海南洋浦区域国际集装箱枢纽港...
9天涨价500元 苹果手机迎涨... 4月12日消息,“目前店内苹果手机和官网价格一致,并未调价。”位于杭州西湖边的苹果直营店店员表示,在...
天津出现14级大风,破历史极值 4月12日消息,从天津市气象台了解到,11日21时起,天津市出现极端大风天气过程,截至今日12时,天...