vue3 | shallowReactive 、shallowRef、triggerRef

vue3,shallowreactive,shallowref,triggerref · 浏览次数 : 45

小编点评

```html <n-el class="flex flex-col justify-center items-center w-full h-200"> <n-el>{{ state.a }}</n-el> <n-el>{{ state.b.res }}</n-el> <n-el>{{ state.b.c.res }}</n-el> <n-button class="!w-20" @click="handleCLick" class="!w-20">点击</n-button> </n-el> </n-el> ``` **描述:** 该代码展示了使用 `shallowReactive` 和 `shallowRef` 来监听组件状态的示例。 * `state` 是一个 `shallowReactive` 声明的变量,它监听 `a`、`b` 和 `b.c` 对象的更改。 * `handleCLick` 函数通过 `shallowRef` 调用 `triggerReftriggerRef` 方法手动触发视图更新。 * `triggerRef` 方法会调用 `state2` 的 `res`、`res2.data` 和 `res2.res3.data` 属性,并触发它们对应的 `shallowRef` 的更新。 * `state2` 是一个嵌套的对象,其中 `res2` 和 `res2.res3` 是 `data` 属性。 **注意:** * `shallowRef` 只监听首层对象的变化。 * `shallowReactive` 只监听 `value` 属性。 * `triggerReftriggerRef` 方法可以手动触发视图更新,即使 `state2` 的任何属性发生变化。

正文

shallowReactive

使用 reactive 声明的变量为递归监听,使用 shallowReactive 声明的变量为非递归监听(通俗的讲就是 reactive 创建的对象将会被 vue 内部进行递归监听,可以监听到对象中的对象是否发生了改变从而更新视图,而 shallowReactive 创建的对象只能监听到首层对象的变化)。

<script setup lang="ts">
  import { shallowReactive } from 'vue'
  const state = shallowReactive({
    a: 1,
    b: {
      res: 2,
      c: {
        res: 3,
      },
    },
  })

  const handleCLick = () => {
    state.a = 100
    state.b.res = 200
    state.b.c.res = 300
  }
</script>
<template>
  <n-el class="flex flex-col justify-center items-center w-full h-200">
    <n-el>{{ state.a }}</n-el>
    <n-el>{{ state.b.res }}</n-el>
    <n-el>{{ state.b.c.res }}</n-el>
    <n-button @click="handleCLick" class="!w-20">点击</n-button>
  </n-el>
</template>

shallowRef

其中 shallowRef 为非递归监听,ref 为递归监听,与 shallowReactive 和 reactive 不同的是 shallowRef 和 ref 监听的对象首层是 value 这一层,只有当 value 发生改变时 shallowRef 声明的变量才会在视图上进行更新。
shallowRef只有对  .value  的访问是响应式的。

<n-el>{{ state2.res }}</n-el>
<n-button class="!w-20" @click="handleCLick">点击</n-button>

......
 const handleCLick = () => {
    // state2.value.res = 9999 //不会触发
  }

const handleCLick = () => {
  //会触发
  state2.value = {
    res: 9999,
  };
};

    <n-el>{{ state2.res }}</n-el>
    <n-el>{{ state2.res2.data }}</n-el>
    <n-el>{{ state2.res2.res3.data }}</n-el>
    <n-button class="!w-20" @click="handleCLick">点击</n-button>

......
  const handleCLick = () => {
    state2.value = {
      res: 100,
      res2: {
        data: 200,
        res3: {
          data: 300,
        },
      },
    }
  }

triggerRef

triggerRef 的作用则是手动执行与 shallowRef 关联的任何副作用,强制更新视图。

  const handleCLick = () => {
    state.value.a = 100
    state.value.b.res = 200
    state.value.b.c.res = 300
    state2.value.res = 9999
    triggerRef(state2)
  }


  ......
   <n-el>{{ state2.res }}</n-el>
   <n-el>{{ state2.res2.data }}</n-el>
   <n-el>{{ state2.res2.res3.data }}</n-el>
   <n-button class="!w-20" @click="handleCLick">点击</n-button>

参考文档:

1、https://www.jianshu.com/p/4e0d4fcff950

2、https://blog.csdn.net/zxBlogs/article/details/114546382

与vue3 | shallowReactive 、shallowRef、triggerRef相似的内容:

vue3 | shallowReactive 、shallowRef、triggerRef

shallowReactive 使用 reactive 声明的变量为递归监听,使用 shallowReactive 声明的变量为非递归监听(通俗的讲就是 reactive 创建的对象将会被 vue 内部进行递归监听,可以监听到对象中的对象是否发生了改变从而更新视图,而 shallowReactive

vue3 | isRef、unref、toRef、toRefs

isRef 检查某个值是否是ref。是返回true,否则返回false。 const num = ref(10); const num1 = 20; const num2 = reactive({ data: 30 }); console.log(isRef(num)); //true consol

vue3 | slots

一、什么是插槽 插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签,父组件填充的内容称为插槽内容。 子组件不提供插槽时,父组件填充失效 父组件无填充

vue3 | readonly、shallowReadonly

readonly 接受一个对象(不管是响应式还是普通的)或者是一个ref,返回的是一个原值的只读代理。 {{ data }}<

vue3 | mitt的基本使用

# 一、安装 npm安装 ``` npm i mitt ``` pnpm安装 ``` pnpm i mitt ``` yarn安装 ``` yarn add mitt ``` # 二、使用 ## (一)、当前组件内使用 ```javascript import mitt from 'mitt' //

vue3 | defineExpose的使用

简介 使用

uniapp+vue3聊天室|uni-app+vite4+uv-ui跨端仿微信app聊天语音/朋友圈

原创研发uniapp+vue3+pinia2跨三端仿微信app聊天模板Uniapp-Wechat。 uni-vue3-wchat基于uni-app+vue3+pinia2+uni-ui+uv-ui等技术跨端仿制微信App界面聊天项目,支持编译到H5+小程序端+App端。实现编辑框多行消息/emoj混

Vite5+Electron聊天室|electron31跨平台仿微信EXE客户端|vue3聊天程序

基于electron31+vite5+pinia2跨端仿微信Exe聊天应用ViteElectronChat。 electron31-vite5-chat原创研发vite5+electron31+pinia2+element-plus跨平台实战仿微信客户端聊天应用。实现了聊天、联系人、收藏、朋友圈/短

vue3 + mark.js | 实现文字标注功能

页面效果 具体实现 新增 1、监听鼠标抬起事件,通过window.getSelection()方法获取鼠标用户选择的文本范围或光标的当前位置。 2、通过 选中的文字长度是否大于0或window.getSelection().isCollapsed (返回一个布尔值用于描述选区的起始点和终止点是否位于

Vite-Wechat网页聊天室|vite5.x+vue3+pinia+element-plus仿微信客户端

基于Vue3+Pinia+ElementPlus仿微信网页聊天模板Vite5-Vue3-Wechat。 vite-wechat使用最新前端技术vite5+vue3+vue-router@4+pinia+element-plus搭建网页端仿微信界面聊天系统。包含了聊天、通讯录、朋友圈、短视频、我的等功