• vue3-基础知识(2)- 响应式


    1. ref:创建可以使用任何值类型的响应式 ref
      ref() 方法来允许我们创建可以使用任何值类型的响应式,解决reactive的局限性.
    • ref 的 .value 属性也是响应式的。(等价于reactive的响应式属性)
    • 替换
      • 对象替换:一个包含对象类型值的 ref 可以响应式地替换整个对象
      • 参数传递和解构:ref 被传递给函数或是从一般对象上被解构时,不会丢失响应性
      • ref属性替换:如果将一个新的 ref 赋值给一个关联了已有 ref 的属性,那么它会替换掉旧的 ref
    • 解包
      • 顶层属性时:仅当 ref 是模板渲染上下文的顶层属性时才适用自动“解包”
      • 深层响应式对象:当一个 ref 被嵌套在一个reactive(响应式对象)中,作为属性被访问或更改时,它会自动解包
      • 数组、Map:当 ref 作为响应式数组或像 Map 这种原生集合类型的元素被访问时,不会进行解包
      • 模板中:自动解包
      • 作为浅层响应式对象的属性被访问:不会解包
    • 用于useVue中
    • 【进阶】编译时宏命令:Vue的响应式语法糖
      • 默认关闭
        • Vite启用
        • vue@^3.2.25
        • @vitejs/plugin-vue@>=2.0.0
        • 用于 SFC 和 js(x)/ts(x) 文件
        • 配置
        // vite.config.js
          export default {
            plugins: [
              vue({
                reactivityTransform: true
              })
            ]
          }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 其他启用方式:vue-cli/webpack+vue-loader
      • API宏
        • 自动引入:宏函数都是全局可用的、无需手动导入。
        • 手动引入:import { $ref } from 'vue/macros'
        • 用法: 前缀$ + API。eg:ref => $ref,不需要再使用var.value,而是直接使用var
      • 手动解构:$() 宏
        • 返回toRef()包装后的值。
        • 适用于响应式对象包含数个 ref 的对象
        • 会返回 ref 的函数。Vue 编译器并不能够提前知道该函数会返回一个 ref。需使用$() 宏来将现存的 ref 转换为响应式变量。
    • 响应式props 解构
      • 痛点:
        • 无法解构defineProps。必须使用props.x
        • 当使用基于类型的 props 的声明时,无法很方便地声明这些 prop 的默认值。
      • 解决:当 defineProps 与解构一起使用时,我们可以通过应用编译时转换来解决这些问题,类似于我们之前看到的 $()。
    • 保持在函数间传递时的响应性:$ref的困扰
      • 响应式丢失
        • 以参数形式传入函数
          • 问题:直接传入ref会丢失响应式,fn($ref)编译结果会是fn($ref.value)。而函数内期望是传入一个$ref
          • 解决:使用$$(ref) 包装,效果是去掉.value
        • 将响应式变量直接放在返回值表达式中
          • 问题:return { x, y } => return { x: x.value, y: y.value }
          • 解决:return $$({ x, y })
        • 已解构props
          • 适用:const { prop } = defineProps({a: 1}); fn($$prop);,解析成toRef()包裹。
    1. reactive:创建一个响应式对象或数组
    • 响应式类型
            (1)definedProxy           (2)proxy-reactive   (3)value setter-ref
      缺点  数组和属性删除等拦截不了     不兼容ie11         只拦截了value
      优点  兼容                        全拦截             实现简单   
      
      • 1
      • 2
      • 3
    • 为保证访问代理的一致性,对同一个原始对象调用 reactive() 会总是返回同样的代理对象,而对一个已存在的代理对象调用 reactive() 会返回其本身:
        // 在同一个对象上调用 reactive() 会返回相同的代理
        console.log(reactive(raw) === proxy) // true
      
        // 在一个代理上调用 reactive() 会返回它自己
        console.log(reactive(proxy) === proxy) // true
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 代理对象和原始对象不是全等的
    • 深层响应式的
    • 更新时机:缓冲更新,下一个时机使用nextTick()
    • reactive() 的局限性:“引用” 机制
      • 仅对对象类型有效
      • 不可“替换”对象,否则丢失属性相应链接。(使用ref)
      • 将属性赋值或解构至本地变量,将该属性传入一个函数时,我们会失去响应性。(使用ref)
  • 相关阅读:
    【算法】计数排序算法的讲解和代码演示
    idea把项目打成jar包步骤详解
    企业安全生产双重预防机制的构建和应用
    【编程不良人】SpringSecurity实战学习笔记01---权限管理、环境搭建
    【Docker 基础教程】Centos7.5安装Docker并配置阿里云镜像
    ESANet语义分割与realsense D455的结合
    基于springboot实现数码论坛系统设计与实现系统【项目源码+论文说明】计算机毕业设计
    Vscode - 修改插件安装目录
    无需训练、APP可玩,商品、车辆、菜品20+场景一键识别
    圆心科技,很焦虑?
  • 原文地址:https://blog.csdn.net/junjiahuang/article/details/127921729