首页 > 其他分享 >面试官:竟然用广度优先搜索实现Vue的watch?有意思...

面试官:竟然用广度优先搜索实现Vue的watch?有意思...

时间:2023-08-07 23:34:02浏览次数:40  
标签:... 面试官 Vue const name watch state key newValue


1.# 两种watch的基本用法

1.1# 通过函数回调监听数据

最基本的用法是给watch指定一个回调函数并返回你想要监听的响应式数据

const state1 = reactive({
  name: '前端胖头鱼',
  age: 100
})

watch(() => state1.age, () => {
  console.log('state1的age发生变化了', state1.age)
})

state1.age = 200

setTimeout(() => {
  state1.age = 300
}, 500)

面试官:竟然用广度优先搜索实现Vue的watch?有意思..._响应式

1.2# 直接监听一个对象

还可以直接监听一个响应式对象来观测它的变化。

const state1 = reactive({
  name: '前端胖头鱼',
  age: 100,
  children: {
    name: '胖小鱼',
    age: 10
  }
})

watch(state1, () => {
  console.log('state1发生变化了', state1)
})

state1.age = 200

setTimeout(() => {
  state1.children.age = 100
}, 500)

面试官:竟然用广度优先搜索实现Vue的watch?有意思..._Vue.js_02

2.# 实现watch最核心的点

其实watch的底层实现非常简单,和computed一样都需要借助任务调度

简单来说就是感知数据的变化,数据发生了变化就执行对应的回调,那么怎么感知呢?

const state = reactive({
  name: '前端胖头鱼'
})

useEffect(() => {
  // 原本state发生变化之后,应该执行这里
  console.log(state.name)
}, {
  // 但是指定scheduler之后,会执行这里
  scheduler () {
    console.log('state变化了')
  }
})

state.name = '胖小鱼'

聪明的你肯定也猜到了,scheduler不就是天然感知数据的变化的工具吗?

没错,watch的实现少不了它,来吧,搞起!!!

3.# 支持两种使用方式

3.1 支持回调函数形式

const watch = (source, cb) => {
  effect(source, {
    scheduler () {
      cb()
    },
  })
}

// 测试一波
const state = reactive({
  name: '前端胖头鱼',
})

watch(() => state.name, () => {
  console.log('state.name发生了变化', state.name)
})

state.name = '胖小鱼'

面试官:竟然用广度优先搜索实现Vue的watch?有意思..._Vue.js_03

3.2 支持直接传递响应式对象

不错哦!第一种方式已经初步实现了,接下来搞第二种。

第二种直接传入响应式对象的方式和第一种传入回调函数并指向响应式数据的区别是什么?

在于我们需要手动遍历这个响应式对象使得它的任意属性发生变化我们都能感知到。

3.3 广度优先搜索遍历深层嵌套的属性

此时就到了这篇文章装逼(额~~)的点了。如果想访问一个深层嵌套对象的所有属性,最常见的做法就是递归。

如果你想在面试的过程中秀一波,我觉得使用广度优先搜索是个不错的主意(狗头脸

标签:...,面试官,Vue,const,name,watch,state,key,newValue
From: https://blog.51cto.com/u_13736610/7000015

相关文章

  • vue3 'alex' is defined but never used
    解决方法在package.json中的rules下加入"no-unused-vars":"off"即可......
  • You are using the runtime-only build of Vue where the template compiler is not a
    使用vue-cli搭建的项目,页面自定义带template内容的组件无法渲染,控制台报错,页面不展示组件内容,代码如下:<template><divclass="hello">my-component:<my-component></my-component></div></template><script>importVuefrom"vue"......
  • Vue中Router笔记学习整理
    1:摘要:  Vue中的Router是Vue.js框架中的一个核心插件,用于实现单页应用(SPA)的前端路由管理。它允许你在应用中定义不同的URL路径与对应的组件之间的映射,以便在不刷新整个页面的情况下,实现页面间的切换和数据加载。主要功能包括以下几个方面:声明式路由:你可以通过定义路由......
  • Vue学习笔记:路由开发 Part 03
    在Part1中提到了router-link。本文档使用一个标签栏来演示其功能在之前的例子中引入一个新的组件TabBartabbar.vue<template><divclass="tabbar"><ul><li><router-linkto="/center"active-class="tabbar-active">Cent......
  • 微信公众号授权回调 vue网址中带#号的处理
    1、改变vue模式为history,小编没有试2、通过配置nginx实现   A、替换跳转网址中的#为其他字符串,例如我的    consturl=this._getUrl("https://open.weixin.qq.com/connect/oauth2/authorize",{appid:this.appId,......
  • vue通过style切换背景图片,出现闪屏现象
    1.情况:通过监控swiper的index修改背景图片,出现闪屏情况 2.解决:尝试过多种方法例如v-clock,提前定义路径变量等都无法解决问题,最终使用提前定义好类名,通过修改类名动态更改类解决,在浏览器网络中可发现只请求过一次,不再是滑动时每次重新请求图片,因此不会出现闪屏现象 ......
  • vue图片压缩插件
    图片压缩插件1.安装插件npmijs-image-compressor2.引入importImageCompressorfrom'js-image-compressor'3.使用compressionImage(file){returnnewPromise((resolve,reject)=>{//eslint-disable-next-lineno-newnewImageCom......
  • node14 升级 node16 后 vue2 项目中 sass 报错问题
    起因不知道因为个什么手贱把之前的node14版本卸载了去官网重新下载安装了一下node,最近版本升级到了node16,以为应该不会有什么问题吧,结果把项目一跑,我勒个去,一堆飘红的,看控制台提示主要是这个node-sass报的错。  #卸载npmuninstallnode-sasssass-loader#重新安......
  • vue可拖拽悬浮按钮组件
    效果预览预览地址:http://120.79.163.94/JYeontuComponents/#/JHoverBtnView关键代码实现阻止默认拖动选择事件preventEvent(){ document.getElementById('j-hover-btn').ondragstart=function(){ returnfalse; }; document.getElementById('j-hover-btn').onselectstart......
  • 警惕职场PUA,远离某......
    在这个经济的寒冬,一职难求的时间节点,还是憋不住,想聊聊这个敏感的职场话题。为什么想写这篇文章,并且把前同事被PUA的事分享给大家?是因为之前悲惨的经历和他十二分的相似,也是被某阿空降过来的领导PUA到严重怀疑人生;好在现在已经走出来了。想分享给更多的新人,希望能做到提前识别,有效应......