Vue中computed属性和watch,methods的区别

 更新时间:2023年05月08日 11:10:52   作者:zayyo  
本文主要介绍了Vue中computed属性和watch,methods的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在Vue中,computed、watch和methods是处理响应式数据的三种方式。它们的主要区别在于计算方式、响应方式和使用场景。

computed

computed是一种计算属性,它会根据所依赖的响应式数据自动计算出一个新的值,并且该计算结果会被缓存起来,只有当所依赖的数据发生变化时才会重新计算,也就是说, 当所依赖的数据没有发生改变时, 多次访问计算属性它会立即返回之前缓存的计算结果, 而不会再次执行computed中的函数。而且computed本质上是一个只读属性,它不会修改任何响应式数据,只是根据所依赖的数据计算出一个新的值。

使用computed的好处在于它可以将复杂的计算逻辑封装在一个属性中,并且只有在需要时才会计算,并且在依赖数据没有发生变化时只返回上一次的计算缓存值,从而提高了代码的可读性和性能。

computed: {
   get: function () { 
      return this.firstName + ' ' + this.lastName;// 必须要有return
  },
}

watch

watch是一种观察者模式,它会在所观察的响应式数据发生变化时执行一个回调函数,在回调中会传入newVal和oldVal两个参数。watch可以监听一个或多个响应式数据,并可以执行一些异步操作,例如发送网络请求或者操作本地存储等。

使用watch的好处在于它可以监控数据的变化并执行相应的操作。例如,我们可以使用watch来监听一个输入框的变化,并根据输入框的值发送网络请求:

watch: {
  inputValue(newValue, oldValue) {
    // 根据输入框的值发送网络请求
    fetch('http://example.com/api?query=' + newValue)
      .then(response => response.json())
      .then(data => this.result = data);
  }
}

在这个例子中,当inputValue发生变化时,watch会自动执行回调函数,并根据输入框的值发送网络请求。

methods

methods是一个普通的JavaScript方法,它可以接收参数并且可以执行任意的JavaScript代码。methods不会自动响应数据变化,需要手动调用才能更新视图。methods方法是每次调用, 都会执行函数的, methods而且它不是响应式的。

使用methods的好处在于它可以执行任意的JavaScript代码,并且可以根据具体的需求传入不同的参数。例如,我们可以使用methods来处理用户的点击事件:

methods: {
  handleClick(event) {
    // 处理用户的点击事件
    console.log('User clicked on', event.target);
  }
}

在这个例子中,当用户点击某个元素时,会调用handleClick方法,并将事件对象作为参数传入。

归纳三者不同点

methods,watch和computed都是以函数为基础的,但各自却都不同;

1、methods

不存在缓存,执行一次运行一次,执行n次,运行n次

2、computed

使用场景:当页面中有某些数据依赖其他数据进行变动的时候,可以使用计算属性
计算属性 computed 是基于data中数据进行处理的,data数据变化,他也跟着变化
当data中数据没有发生改变时,我们调用computed中函数n次,只会进行缓存(执行一次)
每个计算属性都包含两个set、get 属性
<div>{{get}} </div> //调用时候,直接写上函数名即可

computed: {
   get: function () { //这里不适合写 get(),语法规定
     return this.firstName + ' ' + this.lastName;// 必须要有return
  },
}

3、watch

使用场景:数据变化时执行异步或开销较大的操作,可以随时修改状态的变化
watch:类似于监听机制+事件机制。
在大部分情况下我们都会使用computed,但如果要在数据变化的同时进行异步操作或者是比较大的开销,那么watch为最佳选择。watch为一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。
// 这里直接用 v-model 来绑定,不需要添加 change 事件

<input type="text" v-model="name" />  {{tip}}
  data() {
    return {
      name: "",
      tip: ""
    };
  },
  methods: {
    checkName(value) {
      var arg = this;
      setTimeout(() => {
        if (value == "aa") {
          arg.tip = "用户名已存在";
        } else {
          arg.tip = "用户名可以使用";
        }
      }, 1000);
    }
  },
  watch: {// 数据变化时执行异步或开销较大的操作
    name(value) {
      this.checkName(value);
      this.tip = "正在验证......";
    }
  }

watch的高级用法

上面的watch方法是当改变值时候,才会触发监听事件,但是我们想刚进入页面时候,就触发监听事件,就要用handler()方法
1,handler():当页面刚进入时,自动绑定watch事件,不需要进行触发

watch: {// 页面加载时,就自动触发此事件
  name:{
    handler(new){
       this.checkName(value);
       this.tip = "正在验证......";
    }
  }
}

2,immediate属性:布尔值
immediate:true:首次加载就监听数据变化
immediate:false:只有发生改变才监听

watch: {// 页面加载时,就自动触发此事件
  name:{
    handler(new){
       this.checkName(value);
       this.tip = "正在验证......";
    },
     immediate: true 
  }
}

3,deep:true;当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,此时就需要deep属性对对象进行深度监听。

data() {
  return {
      name: {
          'fristname': 'a',
          'lastname': 'a'
      },
      nameCount:0
  }
},
watch: {
  name: {
      handler(newVal) {
          this.name++
      },
  deep: true
  }    
}

设置deep:true则可以监听到name的变化,此时会给name的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler。
如果只需要监听对象中的一个属性值,可以字符串的形式监听对象属性:

watch: {
  'name.first': {
      handler(newVal) {
          this.name++
      },
  deep: true
  }    
}

到此这篇关于Vue中computed属性和watch,methods的区别的文章就介绍到这了,更多相关Vue computed属性和watch,methods内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue父子组件slot插槽的使用

    vue父子组件slot插槽的使用

    这篇文章主要介绍了vue父子组件slot插槽的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue 做移动端微信公众号采坑经验记录

    vue 做移动端微信公众号采坑经验记录

    这篇文章主要介绍了vue 做移动端微信公众号采坑经验记录,文中是小编记录的三个坑及解决方案,需要的朋友可以参考下
    2018-04-04
  • vue 使用el-table循环生成表格的过程

    vue 使用el-table循环生成表格的过程

    这篇文章主要介绍了vue 使用el-table循环生成表格的过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue elementUI 自定义表单模板组件功能实现

    Vue elementUI 自定义表单模板组件功能实现

    在项目开发中,我们会遇到这种需求,在管理后台添加自定义表单,在指定的页面使用定义好的表单,这篇文章主要介绍了Vue elementUI 自定义表单模板组件,需要的朋友可以参考下
    2022-12-12
  • Vue3 vite配置css 的sourceMap及文件引用配置别名的过程

    Vue3 vite配置css 的sourceMap及文件引用配置别名的过程

    这篇文章主要介绍了Vue3 vite配置css的sourceMap,及文件引用配置别名的过程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • vue3使用element-plus搭建后台管理系统之菜单管理功能

    vue3使用element-plus搭建后台管理系统之菜单管理功能

    这篇文章主要介绍了vue3使用element-plus搭建后台管理系统之菜单管理,使用element-plus el-tree组件快速开发树形菜单结构,el-tree组件中filter-node-method事件便可以实现树形菜单筛选过滤功能,需要的朋友可以参考下
    2022-04-04
  • 常见的5种Vue组件通信方式总结

    常见的5种Vue组件通信方式总结

    在 Vue.js 中,组件通信是开发过程中非常重要的一部分,它涉及到不同组件之间的数据传递和交互,本文将介绍如何实现父子组件之间的有效通信,并盘点了常见的5种Vue组件通信方式总结,需要的朋友可以参考下
    2024-03-03
  • 详解vue.js的事件处理器v-on:click

    详解vue.js的事件处理器v-on:click

    本篇文章主要介绍了详解vue.js的事件处理器v-on:click,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Vue自定义询问弹框和输入弹框的示例代码

    Vue自定义询问弹框和输入弹框的示例代码

    这篇文章主要介绍了Vue自定义询问弹框和输入弹框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Vue路由组件通过props配置传参的实现

    Vue路由组件通过props配置传参的实现

    本文主要介绍了Vue路由组件通过props配置传参的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论