首页 > 其他分享 >[踩坑记录] Vue3 customRef 传入对象没有进入set方法

[踩坑记录] Vue3 customRef 传入对象没有进入set方法

时间:2022-10-06 23:14:23浏览次数:54  
标签:value azouxCustomObject set name 更新 customRef Vue3

问题描述

学习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' }; // 这样也可以触发视图更新

标签:value,azouxCustomObject,set,name,更新,customRef,Vue3
From: https://www.cnblogs.com/azoux/p/16758785.html

相关文章

  • 【STL】关联式容器 - Set和Multiset
    Set和MultisetSTL提供的vector,list和deque属于序列式容器即可序群集,每个元素均有固定的位置,取决于插入时机和地点,和元素值无关。如果以追加的方式对一个群集置入六个元素......
  • [转]VUE3 学习之 npm
    使用命令安装expressmysql2nodemon三个插件[email protected] 安装nodemon插件时,要带上-g命令可以参考:https://www.cnblogs.com/z5337/p/16484943.......
  • torch.utils.data.Dataset和torch.utils.data.TensorDataset
    首先我们先看一下Dataset的官方api:CLASStorch.utils.data.Dataset(*args,**kwds)AnabstractclassrepresentingaDataset. Alldatasetsthatrepresentama......
  • vue3 访问原生事件
    两种方法$event变量内联箭头函数官网链接:https://cn.vuejs.org/guide/essentials/event-handling.html#accessing-event-argument-in-inline-handlers如下图所示:......
  • 007-Redis的 Set 命令
    1.Set1.1sadd1.1.1基本信息SADDkeymember[member...]summary:Addoneormorememberstoasetsince:1.0.0Addthespecifiedmemberstothesetstored......
  • Vue3 Vite3 多环境配置 - 基于 vite 创建 vue3 全家桶项目(续篇)
    在项目或产品的迭代过程中,通常会有多套环境,常见的有:dev:开发环境sit:集成测试环境uat:用户接收测试环境pre:预生产环境prod:生产环境环境之间配置可能存在差异,如接口地......
  • Vue3集成Tailwind CSS
    TailwindCSS是一个由js编写的CSS 框架 他是基于postCss去解析的对于PostCSS的插件使用,我们再使用的过程中一般都需要如下步骤:PostCSS配置文件postcss.config.js,新......
  • vue3中动态组件
    动态切换组件代码如下(示例):  1.markRaw标记一个普通对象,使得它不可以被转换成响应式对象。简单来说,就是组件不需要响应式,这样可以提高性能。2.keep-alive组件在非活......
  • Winform 打包之Setup Wizard
    Winform打包网上找了很久,也尝试了别人各种方式,坑还是比较多的。以下流程自己已经尝试过,是可用的。另外:恶心CSDN某些人很久了,都把自己文章设置收益和VIP可见,本身就没技术含......
  • vue3的Async Components异步组件
    前言:当我们的项目达到一定的规模时,对于某些组件来说,我们并不希望一开始全部加载,而是需要的时候进行加载;这样的做得目的可以很好的提高用户体验。传统方式引入组件如下,这......