reactive解构最深的一层,失去响应性问题

pinia创建的store,使用结构失去响应性

reactive包裹后的对象 重新赋值失去响应性

无法动态引入图片

在computed中传参数

vue3放弃了filter

reactive解构最深的一层,失去响应性问题

<script setup lang="ts">
let target = { a: { b: 1 } };
let target1 = { c: 1 }; const obj = reactive(target)
const obj1 = reactive(target1)
watch(obj, () => {
console.log('obj', obj); // 有打印
})
watch(obj1, () => {
console.log('obj1', obj); // 无打印
})
let { a } = obj
let { c } = obj1
a.b = 3
c = 3
</script>

看看解构后的数据

console.log(a); // Proxy(...)
console.log(c); // 3

由上可以看出,最深一层结构后是数值,所以没有响应性。

使用toRef改写

let { c } = obj1
let c = toRef(obj1, 'c')
c.value = 3

或是toRefs

let { c } = toRefs(obj1)
c.value = 3

:::补充

reactive原理简易实现

function reactive(params) {
return new Proxy(params, {
get(target, p, receiver) {
if (typeof target[p] === 'object') {
reactive(target[p])
}
// track(target,p)
return Reflect.get(target, p, receiver)
},
set(target, p, newValue, receiver) {
// trigger(target,key)
return Reflect.set(target, p, newValue, receiver)
}
})
}

reactive对对像属性做了深层代理。

解构原理大致是创建一个变量,从对象中匹配出 与创建变量名相同的 对象属性名,将这个属性的值(或是地址,对象的引用)复制给新的变量。

从reactive和解构原理可以看出,当reactive解构到最后一层,收集依赖的方法是

track(target,p)

,返回值是一个基本数据,此时都是正常的,问题是接下来,

基本数据的值 复制给了一个新的变量,此时,响应被断开。

!!!!!!!!!!!!!!若有不对,请大佬指导!!!!!!!!!!!!!

pinia创建的store,使用结构失去响应性

 如pinia文档介绍,store由reactive包裹,所以你可以直接访问state,getters,actions,但是也会因此,解构失去响应性。pinia给的解构保持响应性的方法,使用storeToRefs。

reactive包裹后的对象 重新赋值失去响应性

Vue2中,实例会在初始化时对 挂载到$data上的对象 重写并赋值 到 $data相同属性名上,当你直接给$data的属性重新赋值,监听器会认为是对 $data属性值 的更改;

而Vue3 setup中,使用reactive工具函数对 对象进行包裹(代理)实现监听并返回一个新对象,如果对这个新对象进行对象赋值,会直接替换掉上一步 reactive的包裹后的对象,所以失去了响应性,解决方法就是,reactive包裹的对象修改时,避免对象直接赋值的写法。

img标签无法动态引入图片

vite提供了静态资源处理方法:

function getImageUrl(name) {
return new URL(`./dir/${name}.png`, import.meta.url).href
}

文档:

https://vitejs.cn/vite3-cn/guide/assets.html#importing-asset-as-url

在computed中传参数,动态依赖

利用 computed的依赖改变重新计算的特点,可以将一些复杂逻辑抽出来。在循环或是插槽中使用的时候,需要传入参数当作依赖,当这个参数(params)改变时会重新计算获取新的返回值。

let someAttr = computed(() => (params: any) => {
return params //在这里添加逻辑
})

vue3放弃了filter

使用方法或是computed代替;

PPPPS:API中有个app.config.globalProperties可以全局挂载。

VUE3+VITE 常见问题解决的更多相关文章

  1. springmvc环境搭建以及常见问题解决

    1.新建maven工程 a)  打开eclipse,file->new->project->Maven->Maven Project b)  下一步 c)   选择创建的工程为 ...

  2. ubuntu安装navicat及常见问题解决

    1.安装navicat Step1: 下载Navicat ,网址:http://www.navicat.com/en/download/download.html Step2:进入下载目录,解压压缩包 ...

  3. OpenStack安装部署管理中常见问题解决方法

    一.网络问题-network 更多网络原理机制可以参考<OpenStack云平台的网络模式及其工作机制>. 1.1.控制节点与网络控制器区别 OpenStack平台中有两种类型的物理节点, ...

  4. Web Deploy发布网站及常见问题解决方法(图文)

    Web Deploy发布网站及常见问题解决方法(图文) Windows2008R2+IIs7.5 +Web Deploy 3.5 Web Deploy 3.5下载安装 http://www.iis.n ...

  5. 接口测试之——Charles抓包及常见问题解决(转载自https://www.jianshu.com/p/831c0114179f)

    简介 Charles其实是一款代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的.该软件是用Java写的,能够在Windows,Mac,Linux上使用,安装Charl ...

  6. charles抓包的安装,使用说明以及常见问题解决(windows)

    charles抓包的安装,使用说明以及常见问题解决(windows) https://blog.csdn.net/zhangxiang_1102/article/details/77855548

  7. Linux运维常见问题解决集锦【转】

    作为linux运维,多多少少会碰见这样那样的问题或故障,用点心,平时多注意积累,水平肯定越来越高. 下面就是常见问题解决集锦:   1.shell脚本不执行 问题:某天研发某同事找我说帮他看看他写的s ...

  8. Python爬虫编程常见问题解决方法

    Python爬虫编程常见问题解决方法: 1.通用的解决方案: [按住Ctrl键不送松],同时用鼠标点击[方法名],查看文档 2.TypeError: POST data should be bytes ...

  9. Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结

    Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结 1. 本文范围 1 2. Angular的优点 1 2.1. 双向数据绑定 1 2.2. dsl ...

  10. C# .Net Framework4.5中配置和使用managedCUDA及常见问题解决办法

    主要参考英文帖子.我就不翻译了哈.很容易懂的. 先说明我的运行平台: 1.IDE:Visual Studio 2012 C# .Net Framework4.5,使用默认安装路径: 2.显卡类型:NV ...

随机推荐

  1. spring-cloud03-consul

    官网的安装说明https://learn.hashicorp.com/tutorials/consul/get-started-install 1.下载安装 环境:阿里云服务器,consul1.9.5 ...

  2. ACID和CAP的比较

    https://www.jdon.com/artichect/acid-cap.html 1 简介 事务机制ACID和CAP理论是数据管理和分布式系统中两个重要的概念,很不巧,这两个概念中都有相同的& ...

  3. Luogu P1505.[国家集训队]旅游

    题解 真真正正是个码农题,不过很套路,熟练就打得很快,不过要用点维护边的信息在 \(\text{LCA}\) 出要注意,不能处理此点的信息 \(Code\) #include<cstdio> ...

  4. Python接口自动化之pymysql数据库操作

    一.pymysql介绍及安装 01 pymysql介绍 MySQL应该说是如今使用最为普遍的数据库了,没有之一,而Python作为最为流行的语言之一,自然少不了与MySQL打交道,其中PyMySQL就 ...

  5. vue2 使用x2js json转换成xml

    安装: 在项目终端运行以下命令 cnpm install x2js --save 引用: // 引入模块 import x2js from 'x2js' 全部代码: <template> ...

  6. LeetCode-1601 最多可达成的换楼请求数目

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-number-of-achievable-transfer-requests 题目 ...

  7. ASP和jq实现url传递参数乱码的escape编码和unescape解码

    <% Function vbsEscape(str)    dim i,s,c,a    s=""    For i=1 to Len(str)        c=Mid(s ...

  8. CSS3,线性渐变(适用标题背景)

    .test{ margin:200px auto; height:30px; border:1px #D4D4D4 solid; box-shadow:0 -1px 10px rgba(0,0,0,0 ...

  9. layui父页面获取子页面的窗口对象

    1.父窗口 var body = layui.layer.getChildFrame('body', index) body.find("#id").val(obj.data.id ...

  10. 8. fitBounds(用了这个你就不用在设置zoom, minZoom, maxZoom, center)

    1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta charset="U ...