手写vue-watch

这篇具有很好参考价值的文章主要介绍了手写vue-watch。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、watch的使用

watch有多重形式,可能是字符串、函数、数组

// 函数形式 数组形式  vm.$watch
            // 最终调用的都是vm.$watch
            watch:{
                firstname(newValue,oldValue){
                    // 观察者 观察变量改变 执行回调函数
                    console.log(newValue,oldValue)
                }
            }
 vm.$watch(()=>vm.firstname,(newValue,oldValue)=>{
            console.log(newValue,oldValue,11)
        })

二、实现原理

本质是一个Wathcer,观测一个响应式数据,当数据发生变化时通知并执行相应的回调函数。
在监听对象变化的时候,加上 deep 这个属性即可深度监听对象数据;如果你想在页面进来时就执行 watch 方法,加上 immediate 即可。值得注意的是,设置了 immediate 属性的 watch 的执行顺序是在 created 生命周期之前的

三、实现watch

3.1初始化

export function initState(vm) {
  const opts = vm.$options;
  ...
  if (opts.watch) {
    // 初始化watch
    initWatch(vm);
  }
}

createWatcher 中会判断 handler 是否是对象,如果是对象将 handler 挂载到 options 这个属性,再将对象的 handler 属性提取出来;如果 handler 是一个字符串的话,会从 Vue 实例找到这个方法赋值给 handler。从这里我们也能看出来,watch 还可以支持字符串的写法。执行 Vue 实例上的 $watch 方法。文章来源地址https://www.toymoban.com/news/detail-462546.html

function initWatch(vm){
  let watch = vm.$options.watch
  for(let key in watch){ //字符串 数组 函数
    const handler = watch[key]
    if(Array.isArray(handler)){
      // 循环创建watch
      for(let i=0;i<handler.length;i++){
        createWatcher(vm,key,handler[i])
      }
    }else{
      createWatcher(vm,key,handler)
    }

  }
}

// 字符串 函数
function createWatcher(vm,key,handler){
  if(typeof handler === 'string'){
    handler = vm[handler]
  }
  return vm.$watch(key,handler)
}
// 监控的某个值,回调
Vue.prototype.$watch = function (expreOrFn, cb) {
  // firstname
 // ()=>vm.firstname
 // 表示用户自己写的watcher


//  firstname的值变化直接执行cb函数
  new Watcher(this,expreOrFn,{user:true},cb)
}
class Watcher {
  constructor(vm, exprOrFn, options, cb) {
    this.id = id++;
    this.renderWatcher = options; //标识是一个渲染watcher

    if (typeof exprOrFn === 'string') {
      this.getter = function () {
        return vm[exprOrFn]
      }
    } else {
      this.getter = exprOrFn; //getter意味着调用这个函数可以发生取值操作
    }


    this.deps = []; // watcher记住dep,比如计算属性和组件卸载,希望watcher清理掉所有响应式数据
    this.depsId = new Set(); //去掉重复的dep

    this.vm = vm
    this.user = options.user //标识是否是用户自己的watcher
    this.cb = cb
    this.lazy = options.lazy;
    this.dirty = options.lazy;
    this.value = this.lazy ? undefined : this.get(); //此处先调用get是因为,首次渲染组件需要去取到数据放到页面上
  }

 run() {
    let newValue = this.get(); // 渲染的时候用的是最新的vm来渲染的
    if(this.user){
      this.cb.call(this.vm,newValue,this.value)
    }
  }

到了这里,关于手写vue-watch的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue中使用watch监听同时监听两个数据

    使用场景,创建一个子组件,父组件会向子组件中穿递一个状态 - \\\"status\\\" ,子组件需要同时监听this.$route.params中的值和status,然后再去调方法,所以需要同时监听

    2024年02月11日
    浏览(32)
  • 【 vue使用请求loading:组件形式】

    这是我项目中想使用loading之后踩的第一个坑,后面优化用了vant自带的提示框,比较简单, 可移步这篇文章→→→ vue+vant使用请求loading 1. com/loading.vue 2. main.js 全局引用 3. 在页面中使用

    2024年02月16日
    浏览(28)
  • vue中的Computed和watch区别即使用方法、场景

    在Vue.js, computed 是一个非常有用的属性,它允许声明计算属性,这些属性会根据其依赖的数据进行自动更新,而无需手动触发。 computed 属性常用于根据现有的响应式数据进行计算,以生成派生的数据,而这些数据的值会随着依赖数据的变化而自动更新。 计算属性的缓存:

    2024年02月10日
    浏览(33)
  • 在vue中使用swiper轮播图(搭配watch和$nextTick())

    在组件中使用轮播图展示图片信息: 1.下载swiper,5版本为稳定版本 cnpm install swiper@5 2.在组件中引入swiper包和对应样式,若多组件使用swiper,可以把swiper引入到main.js入口文件中: import \\\'swiper/css/swiper.css\\\' //引入swiper样式 import Swiper from \\\'swiper\\\'; //引入swiper  3.在组件中使用: 由于我

    2024年02月13日
    浏览(38)
  • vue中created、watch、methods的区别,一般如何使用,在什么场景下使用

    在Vue中, created 、 watch 和 methods 是Vue实例中常用的三个选项。它们的作用和使用场景如下: created : 作用: created 是Vue实例生命周期钩子函数之一,在Vue实例创建完成后立即调用。在 created 钩子函数中,可以执行一些初始化逻辑、数据请求和监听事件等操作。 使用场景:一

    2024年02月11日
    浏览(35)
  • 在 Vue.js 中,使用 watch 监听data变量如:对象属性/data变量

    在 Vue.js 中,使用 `watch` 监听对象属性 的变化时,应该将属性名作为 字符串 传递给 `watch` 选项。 示例如下: ```javascript updateAddChuZhenForm函数 现在,当 `isCheck1` 或 `isCheck2` 的值发生变化时,相应的 `watch` 函数将被触发。 ``` 如果你想要 监听一个普通变量 ,而 不是 Vue 实例的属

    2024年02月09日
    浏览(35)
  • 【Vue2从入门到精通】Vue监听器watch,计算属性computed,方法methods的区别及使用场景

    ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社区 📙 专栏地址:vue2从入门到精通 【分享几个国内免费可用的ChatGPT镜像】 【10几个类ChatGPT国内AI大模型】 【用《文心一言》1分钟写一篇博客简直yyds】 【用

    2023年04月15日
    浏览(34)
  • vue 初始化方法 create,beforeMount,mount,computed,watch 方法执行顺序及使用场景

    前言:vue 存在一些基本属性和相关对象如果合理使用,可以避免代码混乱 执行顺序 create beforeMount computed mounted watch 方法说明 created执行时挂载阶段还没有开始,模版还没有渲染成html,所以无法获取元素。created钩子函数主要用来初始化数据。 beforeMount 这一步的时候,模版已经

    2024年02月11日
    浏览(40)
  • Linux修改fs.inotify.max_user_watches(“外部文件更改同步可能很慢”和“当前的 inotify(7) 监视限制太低”)

    fs.inotify.max_user_watches 参数是用于控制 Linux 内核中 inotify 子系统的观察者数量限制。inotify 是一种文件系统监控机制,它可以用于检测文件或目录的变化,并在事件发生时通知相关的应用程序。 具体而言, fs.inotify.max_user_watches 参数限制了每个用户所能创建的 inotify 实例的数量

    2024年02月06日
    浏览(34)
  • 使用 Ant Design Vue 你可能会遇到的14个问题

    公司有一个新需求,在原来项目基础上开发,项目中使用 Ant Design Vue,版本是 1.X ,在此记录下遇到的问题;对于没有使用过或者使用程度不深的同学来说,希望可以帮助你在开发中遇到问题时有个参考。对于已经熟练使用的同学,可能这些问题都遇到过,欢迎大家在评论区补

    2024年02月08日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包