问题描述

学习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方法的更多相关文章

  1. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  2. SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

    Spring boot +Spring Security + Thymeleaf认证失败返回错误信息踩坑记录 步入8102年,现在企业开发追求快速,Springboot以多种优秀特性引领潮流,在众多使 ...

  3. VUE使用微信JDK(附踩坑记录)

    VUE使用微信分享SDK(附踩坑记录) 微信分享官方文档 安装JS-SDK npm i -S weixin-jsapi 引入包 ES5 写法 const wx = require('weixin-js ...

  4. [技术博客]iview组件样式踩坑记录

    [技术博客]iview组件样式踩坑记录 iview官方文档. 在本次项目开发中,前端项目主要使用vue框架+iview组件构建,其中iview组件在使用过程中遇到了许多官方文档中没有明确说明或是很难注 ...

  5. unionId突然不能获取的踩坑记录

    昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...

  6. CentOS7.4安装MySQL踩坑记录

    CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...

  7. ubuntu 下安装docker 踩坑记录

    ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...

  8. SpringBoot + Shiro + shiro.ini 的踩坑记录

    0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...

  9. google nmt 实验踩坑记录

       最近因为要做一个title压缩的任务,所以调研了一些text summary的方法.    text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...

  10. ABP框架踩坑记录

    ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...

随机推荐

  1. 阿里云开源业内首个应用多活项目 AppActive,与社区共建云原生容灾标准

    ​简介:继高可用架构团队的 Sentinel.Chaosblade 开源后,第三个重磅高可用产品:应用多活 AppActive 正式开源,形成高可用的三架马车,帮助企业构建稳定可靠的企业级生产系统,提 ...

  2. [GPT] Nginx+PHP 技术栈 504 Gateway Time-out 解决方案

      1. 504 Gateway Time-out 是什么情况? 504 Gateway Time-out 是一种 HTTP 状态码,表示服务器在作为网关或代理时无法从上游服务器(例如应用程序服务器) ...

  3. [FAQ] WPS 服务程序是一种流氓软件吗

    是的,周而复始的后台进程,频率大致是每隔一个小时会运行一个购物车图标的后台程序,点击之后就会打开电商网站,随后这个程序消失.再出现. 当前时间:2021-10-29 Other:[FAQ] 你所看过的 ...

  4. 修改python别名

    修改Python别名 发现课程提供的启动python程序的命令均为python3,而我们的环境中只能用python来启动 Python 解释器,可以通过修改python的别名来实现不同名称调用同一个程 ...

  5. 阿里巴巴Canal常见问题:重复解析/Filter失效/消费落后

    前言 Canal是阿里巴巴开源的数据库Binlog日志解析框架,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 在之前我写的文章阿里开源MySQL中间件Canal快速入门中, ...

  6. (更新中)Python、JavaScript、Java和C++语言的语法对比与梳理

    目录 引言 1. 构造函数 Python JavaScript Java C++ 2. 构造类 Python JavaScript Java C++ 3. 总结 引言 在开发过程中不免需要用到多种编程 ...

  7. Gem离线包安装

    Gem离线包安装 项目环境 以 rest-client 为例 本地如果是rails项目环境: ruby '2.7.0' gem 'rails', '~> 6.0.3', '>= 6.0.3 ...

  8. Jetbrains系列产品最新激活方法[持续更新]

    Jetbrains系列产品最新激活方法[持续更新] 2021.3.4系列激活 方法一: 2021.3.4参考文章: https://www.exception.site/essay/how-to-fr ...

  9. CentOS7部署ES(单机)

    一.创建路径,解压 ## 创建路径 [root@localhost /]# cd /data [root@localhost data]# mkdir ES ## 解压 [root@localhost ...

  10. 【PB案例学习笔记】-02 目录浏览器

    写在前面 这是PB案例学习笔记系列文章的第二篇,该系列文章适合具有一定PB基础的读者, 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求. 文章中设计到的源码 ...