[踩坑记录] Vue3 customRef 传入对象没有进入set方法
问题描述
学习Vue3 Ref 相关 API 的时候,遇到了 customRef 这个 API,它可以让我们自定义 ref 的更新的过程
但是使用 customRef 有一个问题就是,如果你传入的是初始值,那么一切正常,如果你传入的是一个对象,那 set 函数将会不起作用
customRef 简单使用
function myRef<T>(value: T) {
return customRef((track, trigger) => {
return {
get() {
// do something
// 跟踪
// console.log('track');
track();
return value;
},
set(newValue) {
// also do something
console.log('update')
value = newValue;
trigger();
},
};
});
}
const azouxCustom = myRef('custom');
const azouxCustomObject = myRef({ name: 'obj' });
azouxCustom.value = '123'; // 一切正常
azouxCustomObject.value.name = 'yoyoyo'; // NOT WORK
原因分析
如果我们传入的是对象,那么实际上 Value 记录的是一个地址值,我们在 set 方法中进行的 value = newValue 本质上只是给一个对象赋了它原本的地址值,因此不会更新
但是为什么连set方法都没有进去呢?原因应该是customRef底层用的是shallowRef(有待考证),是一个浅层更新,深层次的数据更新不会触发视图更新,因此就不会进入set方法
解决方法
- triggerRef()
- 直接替换 value
triggerRef
使用 triggerRef 只需要在我们更新属性值之后强制刷新一下ref对象即可
azouxCustomObject.value.name = 'azzz';
triggerRef(azouxCustomObject); // 之后会进入 set 方法,并触发视图更新
直接替换 value
azouxCustomObject.value = { name: 'aaa' }; // 这样也可以触发视图更新
[踩坑记录] Vue3 customRef 传入对象没有进入set方法的更多相关文章
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录
Spring boot +Spring Security + Thymeleaf认证失败返回错误信息踩坑记录 步入8102年,现在企业开发追求快速,Springboot以多种优秀特性引领潮流,在众多使 ...
- VUE使用微信JDK(附踩坑记录)
VUE使用微信分享SDK(附踩坑记录) 微信分享官方文档 安装JS-SDK npm i -S weixin-jsapi 引入包 ES5 写法 const wx = require('weixin-js ...
- [技术博客]iview组件样式踩坑记录
[技术博客]iview组件样式踩坑记录 iview官方文档. 在本次项目开发中,前端项目主要使用vue框架+iview组件构建,其中iview组件在使用过程中遇到了许多官方文档中没有明确说明或是很难注 ...
- unionId突然不能获取的踩坑记录
昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
- SpringBoot + Shiro + shiro.ini 的踩坑记录
0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...
- google nmt 实验踩坑记录
最近因为要做一个title压缩的任务,所以调研了一些text summary的方法. text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...
- ABP框架踩坑记录
ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...
随机推荐
- 如何用 Serverless 低成本打造个人专属网盘?
简介:想要做个网盘不知如何开始,不妨花3分钟读读这篇,看看如何借助 Serverless ,低成本的做一个"不限制网速.无限扩展.同时支持数百种文件格式在线预览.编辑.协作"的专 ...
- 阿里云边缘云ENS再升级 四大场景应用加速产业数字化落地
简介: 云栖大会 | 于10月21日上午举办的边缘云应用升级与技术创新论坛中,阿里云边缘云ENS产品全面升级,从边缘云产品.技术.行业应用等维度全面阐述阿里云在边缘计算领域的技术积累.产品& ...
- SQL server 树形递归查询
1,原始查询 原始表格查询: select * from dbo.T_DeptInfo; 原始表格查询结果: 2,递归查询 -- with 一个临时表(括号里包括的是你要查询的列名) with tem ...
- 设计模式之装饰器-AOP
HelloWorld简单例子如下:此例子好好体会下继承 is a和组合 has a的异同. using System; using System.Runtime.InteropServices; na ...
- 程序是怎样跑起来的_第一章-对程序员来说CPU是什么
通过对第一章的学习,我了解了大体上CPU可以说是电脑的"大脑",即中央处理器.从功能来看可以分为寄存器,控制器,运算器和时钟.在这四个部分中,寄存器是最值得程序员注意的.总的来说, ...
- ES_CCS/R(三):跨集群复制 Cross-cluster replication(CCR)
跨集群复制(CCR)功能支持将远程集群中的索引复制到本地集群. 可以在一些常见的生产用例中使用此功能: 灾难恢复(DR)/高可用性(HA):如果主群集发生故障,则进行灾难恢复. 辅助群集可以用作热备份 ...
- goland dlv在远程linux里运行代码开发,并debug调适
一.配置好ssh自动同步代码 参考下面连接: https://www.cnblogs.com/haima/p/13257524.html 二.配置devbug监听运行 GO Remote 填写配置 l ...
- golang之UrlEncode编码/UrlDecode解码
为什么需要编码和解码 1.是因为当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符的: 2.因为 url 对字符有限制,比如把一个邮箱放入 url,就需要使用 urle ...
- linux下nginx安装和配置
一.软件安装 1.环境说明 操作系统:CentOS 7.4 64位 nginx版本:1.16.1 安装日期:2019/10/01 安装用户:root 2.安装运行库 yum -y install gc ...
- IPv6 — 实践
目录 文章目录 目录 前文列表 常用命令 开启/关闭 IPv6 支持 在 CentOS7 上配置 IPv6 地址 自动获取链路本地地址 配置静态全球唯一地址 配置临时 IPv6 地址 添加 IPv6 ...