LogoLogo
github
  • 💪Upupup
  • React
    • hook
    • redux
    • Router
    • umimax+nest.js 实现 权限管理系统
    • umimax + Nest.js 实现权限管理系统
  • Vue
    • effectScope 是干啥的
    • Object.assign()
    • 响应式理解
    • @babel/preset-env 问题
    • 自定义指令
    • 问题及解决
    • 🧐权限管理(动态路由)
  • docker
    • Docker 常用命令
    • Docker部署遇到的问题
    • Docker Compose 常用命令
    • docker修改daemon.json
    • jenkins
    • Jenkinsfile 语法进阶
    • nginx配置
    • 问题
    • 玩转Nginx:轻松为Docker部署的服务添加域名的完美指南
    • Docker部署前后端项目:经验分享与问题解决
  • git
    • command
    • problem
    • rebase实践
  • 前端开发面试题集
    • CSS 面试题
    • 前端工程化面试题
    • HTML 面试题
    • JavaScript 面试题
    • NestJS 面试题
    • Node.js 面试题
    • 性能优化面试题
    • React 面试题
    • 安全面试题
    • Vue 面试题
  • interviewer
    • 计算机网络
    • 性能优化
  • leetcode
    • 算法
      • 分治算法
      • 滑动窗口与双指针
        • 🦸定长滑动窗口
        • 🚴不定长滑动窗口
        • 🚴‍♂️单序列双指针
      • 回溯
      • 二分法
  • nestjs
    • mail
    • mini-order
    • nestjs
    • prisma
    • 登录注册
  • nextjs
    • 用 V0 和 Cursor 实现全栈开发:从小白到高手的蜕变
  • tauri
    • 思路
    • 自动通知应用升级
  • vite
    • vite实现原理
  • webpack
    • 资料
  • 工具
    • Eslint
    • jenkins
    • 关于cicd
  • 微信小程序
    • ScoreDeck
    • h5跳转小程序问题
  • 思路
    • carTool
  • 操作系统学习
    • Linux命令
    • 计算机是如何计数的
    • nginx
      • location
      • try_files
  • 浏览器
    • session、location
    • web crypto
    • 性能监控和错误收集与上报
    • 预请求
  • 知识点整理
    • 知识点整理
  • 面试
    • Promise
    • 备战
    • 数码3
    • 腾娱
    • 腾讯云智
    • 重复请求合并
  • 前端工程化
    • 在 pnpm Monorepo 中使用公共方法包
由 GitBook 提供支持
在本页
  • 两种劫持方式
  • 两种声明响应式状态的方法

这有帮助吗?

在GitHub上编辑
  1. Vue

响应式理解

上一页Object.assign()下一页@babel/preset-env 问题

最后更新于5个月前

这有帮助吗?

面试必问:首先查看官网

响应式:变量的依赖发生变化时,变量也变化

两种劫持方式

getter/setter

function ref(value) {
  const refObject = {
    get value() {
      track(refObject, 'value')
      return value
    },
    set value(newValue) {
      value = newValue
      trigger(refObject, 'value')
    }
  }
  return refObject
}

vue2的响应式和 vue3的ref都是基于 getter setter

proxy

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key)
      return target[key]
    },
    set(target, key, value) {
      target[key] = value
      trigger(target, key)
    }
  })
}

proxy:用于reactive

在get 中执行追踪 set中执行触发

两种声明响应式状态的方法

ref()

主要用于基础数据类型

为什么要使用这个函数 :依赖追踪 组件首次渲染时 会追踪渲染过程中的每个ref 改变了此ref 会触发它的组件重新渲染

接收一个参数 将其包裹在一个带有 .value的属性中

模板字符串中会自动解包 不需要 带 .value,特殊情况const count =ref({a:ref(1)}) 此时在 template中需要 count.a.value 才能访问值

非原始值会通过 reactive来转换响应式代理

reactive

主要用来包装 复杂数据类型

不需要使用.value 就可以使用

局限性:

不能直接替换整个对象 ,这意味着 该变量将失去响应式,变量的引用地址发生了改变

例如:

let state = reactive({ count: 0 })

// 上面的 ({ count: 0 }) 引用将不再被追踪
// (响应性连接已丢失!)
state = reactive({ count: 1 })

dom更新时机

当修改了响应式状态后,dom会自动更新,dom更新不是同步的,vue会在“next tick"周期中缓冲所有的状态,确保不管做了多少次状态修改,只做一次dom更新,如果需要等待dom更新完成后再执行额外的代码可以使用nextTick()

import { nextTick } from 'vue'

async function increment() {
  count.value++
  await nextTick()
  // 现在 DOM 已经更新了
}
深入响应式系统 | Vue.js (vuejs.org)