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 的配置

相关内容

热门资讯

7月新一轮涨价潮来袭,功率半导... 6月29日午后,半导体板块震荡拉升,板块指数收涨2.76%。个股方面,华海清科(688120.SH)...
韩国人均两个股票账户 韩国人均... 2026.06.29本文字数:2459,阅读时长大约4分钟作者 |第一财经 潘寅茹韩国股市在暴跌与暴...
创新药支付变天,这些细分赛道或... 2026年6月29日,A股创新药板块出现久违的强势行情。截至收盘,三生国健、舒泰神、广生堂封住20%...
两大国家级集采落地!中药板块迎... 6月29日,A股中药板块上涨,成分股太极集团(600129.SH)、康缘药业(600557.SH)、...
市场监管总局:对火炬集团和鼎晖... 据央视新闻消息,近日,市场监管总局依法对中山火炬集团有限公司(以下简称“火炬集团”)和上海鼎晖百孚投...
恒大地产新增 15.2 亿元执... 近日,天眼查披露司法执行信息显示,6 月 24 日至 25 日,恒大地产集团有限公司新增两笔被执行人...
车企不留后路,盯盯拍冲刺“行车... 原创首发 | 金角财经(ID: F-Jinjiao)作者 | 田羽盯盯拍,有望成为“行车记录仪第一股...
AI存储狂欢背后的反垄断暗雷:... 席卷全球的内存价格飙升,正演变为一场法律风暴。三星、SK海力士与美光这三家掌控全球DRAM市场的芯片...
“光”探底,“芯”走V,“药”... 6月29日,三大指数全线收红,创业板指探底回升,科创50指数大涨4.61%。板块来看,半导体设备板块...
法官的愤怒,富豪的生活有多奢侈... 文 | 李德林如果许家印看到夏海钧的新闻,他会不会比法官还愤怒?香港高等法院对夏海钧做出限制高消费,...