Vue3的响应式机制分析

1. 响应式原理

三种响应式方案:defineProperty、Proxy、和 value setter

请添加图片描述

前两种大家都很熟悉,value setter就是利用了 object 对象的 get 和 set 属性进行的劫持,Vue3 ref实现就是第三种方法。

2. 定制响应式数据

想办法解决所有的操作状态在刷新后就都没了这个问题?

localStorage + watchEffect

import { ref, watchEffect, computed } from "vue";

let title = ref("");
let todos = ref(JSON.parse(localStorage.getItem('todos')||'[]'));
watchEffect(()=>{
    localStorage.setItem('todos',JSON.stringify(todos.value))
})
function addTodo() {
  todos.value.push({
    title: title.value,
    done: false,
  });
  title.value = "";
}

我们可以封装一个useStroage函数

function useStorage(name, value=[]){
    let data = ref(JSON.parse(localStorage.getItem(name)|| JSON.stringify(value)))
    watchEffect(()=>{
        localStorage.setItem(name,JSON.stringify(data.value))
    })
    return data
}

3. Vueuse工具包

开发可以参考:https://vueuse.org/functions.html

安装:

npm install @vueuse/core

利用Vueuse工具包简单实现一个全屏功能:

<template>
  <h1 @click="toggle">click</h1>
</template>
<script setup>
import { useFullscreen } from '@vueuse/core'
const { isFullscreen, enter, exit, toggle } = useFullscreen()
</script>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Vue2和Vue3的响应式原理有所不同。 在Vue2中,响应式是通过Object.defineProperty来实现的。当一个对象被传入Vue的观察者系统中时,Vue会遍历对象的每个属性,并使用Object.defineProperty将它们转换为getter和setter。当属性被访问或修改时,Vue会通知相关的观察者进行更新。 而在Vue3中,响应式是通过Proxy对象来实现的。Proxy是ES6中的一个内置构造函数,可以拦截并代理对目标对象的操作。在Vue3中,当一个对象被传入Vue的观察者系统中时,Vue会使用Proxy对对象进行代理。当属性被访问或修改时,Proxy会拦截这些操作,并通知相关的观察者进行更新。 总结起来,Vue2使用Object.defineProperty来实现响应式,而Vue3使用Proxy来实现响应式。这两种实现方式都能实现相同的效果,但Vue3的Proxy机制更加灵活和高效,对于大型应用和性能要求较高的场景来说,Vue3的响应式系统更加优秀。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue2 和 Vue3响应式原理的区别](https://blog.csdn.net/qq_43835345/article/details/125378237)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [详细分析vue响应式原理](https://download.csdn.net/download/weixin_38752830/12925418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [ruoyi-vue-pro yudao 项目报表设计器 积木报表模块启用及相关SQL脚本](https://download.csdn.net/download/zengwenbo225566/88234865)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影风莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值