watch的使用

template中

 <div>名字:{{name}},年龄:{{age}}</div>

script中

 export default {props: {  name: String  },data() {  return {  age: 10  } },watch: {name(newValue, oldValue) {},age(newValue, oldValue) {}},}

这种情况通过watch监听的数据,当字段被第一次赋值时是不会执行监听函数的。只有值再次发生改变才会执行监听。那如何才能在第一次赋值时就执行监听函数呢?这里就需要用到immediate和handler

immediate和handler使用

在选项参数中指定 immediate: true 将立即以表达式的当前值触发回调
也就是说immediate值为true,则首次赋值时就执行handler函数,immediate值为false,则首次赋值时就不执行handler函数

 watch: {name: {handler(newValue, oldValue) {},immediate: true,},age: {handler(newValue, oldValue) {},immediate: true,},}

首次赋值监听时,oldValue值为undefined

deep 深度监听

当需要监听一个对象的改变时(注意这里监听的是整个对象),正常的watch无法监听到对象内部属性的改变,此时需要使用deep对对象进行深度监听

父组件

  people:{name:"露西"}btnClick() {this.people.name = "宙斯";}

子组件

  props: {people: {type: Object,//对象或数组的默认值必须从一个工厂函数返回。default: () => ({name: ""})}},watch: {people: {handler(newValue, oldValue) {},// immediate: true,  加上则首次也监听deep: true, //必须加上才能监听到people的变化},},

当对一个对象进行监听时,需要添加deep:true属性,此时修改对象内任意属性值都会被监听到。如果只想对对象中某一个属性进行监听,则可以使用字符串的形式监听对象某一个属性,如:

  watch: {'people.name': {handler(newValue, oldValue) {},deep: true,},}

deep和immediate可同时使用,表示首次绑定就触发监听函数

注意事项

1:数组的变动可直接进行监听,不需要deep属性,操作如下,若首次监听则需加immediate: true

  this.list.unshift({name: "宙斯"}) //添加到数组头部this.list.push({name: "宙斯"}) //添加到数组尾部

  this.list.shift() //删除数组头部一个元素this.list.pop() //删除数组尾部一个元素

  this.$set(this.list, 0, {name:"宙斯"}); //修改数组角标为0的数据

数组的splice方法,可用于插入、删除、替换操作,具体操作可移步到前端杂谈之splice用法

2:通过props传递对象或数组时,对象或数组的默认值必须从一个工厂函数返回,否则就会报

Invalid default value for prop “xxx”: Props with type Object/Array must use a factory function to return the default value.

  people: {type: Object,default: ()=>{}}list: {type: Array,default: ()=>[]}

props传递对象时,未传递的字段如何使用默认值

1:通过computed计算属性再定义一个对象,再用assign合并默认值和传递的对象,组件内则使用新定义的对象来展示数据,如

子组件

  <div> 姓名:{{privatePeople.name}} 年龄:{{privatePeople.age}} </div>props: {people: {type: Object,//数组/对象的默认值应当由一个工厂函数返回default: () => {}}},computed: {privatePeople() {let defaultPeople = {name: "露西",age: 10};return Object.assign({}, defaultPeople, this.people);}},

2:使用不带参数的v-bind=xxx

父组件

  <watch-components v-bind=people></watch-components>people: {name: "宙斯"}

子组件

  props: {name:{type:String,default:"露西"},age:{type:Number,default: 10}}

3:使用vuex对状态进行统一管理,子组件通过computed的计算属性获取存储在store中的变量

computed、watch、methods的区别和使用

computed计算属性-引用官网的示例

可监听data和props中的属性

主要用于当一些数据需要随着其它数据变动而变动时使用。如:购物车总金额

  computed: {fullName: function () {return this.firstName + ' ' + this.lastName}}
特点
1:计算属性是基于它们的响应式依赖进行缓存的。只在 相关响应式依赖 发生改变时它们才会重新求值。也就是说当computed函数所依赖的属性值没有发生改变时,调用的结果就会从缓存中读取。

这也同样意味着下面的计算属性将不再更新,因为 Date.now() 不是响应式依赖:

  computed: {now: function () {return Date.now()}}
2:计算属性必须有return返回

watch侦听属性-引用官网的示例

可监听data和props中的属性
主要用于当需要在数据变化时执行异步或开销较大的操作时使用,如搜素框

  watch: {question(newValue, oldValue) {this.axios() //执行异步逻辑}}
特点
1:watch中的函数名称必须和data或props中的属性名称一致
2:watch中函数有两个参数,第一个是newValue新值,第二个是oldValue旧值。

methods:函数方法

主要用于写一段业务逻辑

区别

  • computed计算属性结果会被缓存,只有依赖的属性发生改变才会重新计算,主要用于当一些数据需要随着其它数据变动而变动时使用
  • watch侦听属性用来侦听对象或属性的变化,然后执行对应回调,回调函数内主要用于执行某些业务逻辑,如异步操作或开销较大的操作

vue首次赋值不触发watch及watch和computed的区别相关推荐

  1. vue首次渲染全过程

    昨天有朋友问我vue在页面第一次加载时到底做了些什么,看来这个问题在很多朋友心中可能还比较模糊,今天我们一起来详细的看看vue的首次渲染过程 vue源码下载地址:vue源码 了解vue首次渲染全过程, ...

  2. vue更新数组时触发视图更新的方法

    参考原文: vue更新数组时触发视图更新的方法 - 大橙橙 - 博客园 vue数组对象修改触发视图更新 - 看风景就 - 博客园 直接修改数组元素是无法触发视图更新的,如 this.array[0] ...

  3. vue component created没有触发_Vue的难点解析

    watch 和 computed 和 methods 区别是什么? computed 计算属性,在模板中双向绑定一些数据或表达式时,如果表达式过长,或逻辑更为复杂,就会变得臃肿,难以维护和阅读 < ...

  4. Vue 动态赋值 class

    Vue 动态赋值 class Vue 在操作 DOM 元素的 class 属性时,有以下多种方法 更多精彩 更多技术博客,请移步 asing1elife's blog 比较通用的是否赋值方式 通过以下 ...

  5. vue 加载页面时触发时间_5.6 vue更新数组时触发视图更新的方法,熟记JavaScript原生方法...

    问题:vue更新数组时触发视图更新的方法 变异方法: Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新.什么是变异方法呢?简单理解就是改变了原来的数组,可能包括数组长度length,或者 ...

  6. vue和react相同点_我在React和Vue中创建了相同的应用程序。 这是区别。

    vue和react相同点 by Sunil Sandhu 由Sunil Sandhu 我在React和Vue中创建了相同的应用程序. 这是区别. (I created the same app in ...

  7. vue中created钩子函数与mounted钩子函数的使用区别

    1:在使用vue框架的过程中,我们经常需要给一些数据做一些初始化处理,这时候我们常用的就是在created与mounted选项中作出处理. 首先来看下官方解释,官方解释说created是在实例创建完成 ...

  8. vue路由的两种模式:hash与history的区别

    前言:众所周知,vue-router有两种模式,hash模式和history模式,下面来看看两者的区别. 一.基本情况 直观区别:hash模式url带#号,history模式不带#号. 1.hash模 ...

  9. vue 路由传参 params 与 query两种方式的区别(转载)

    vue 路由传参 params 与 query两种方式的区别 初学vue的时候,不知道如何在方法中跳转界面并传参,百度过后,了解到两种方式,params 与 query.然后,错误就这么来了:  ro ...

最新文章

  1. 在win7下安装SQL sever2005
  2. python opencv-4.1.0 cv2.getTextSize()函数 (计算文本字符串的宽度和高度)
  3. android 利用eclipse观察内存变化情况
  4. u盘往linux考文件过大,U盘拷贝时提示文件过大怎么办,教您如何解决
  5. 【已解决】TypeError: ‘<‘ not supported between instances of ‘str‘ and ‘int‘_Python系列学习笔记
  6. app启动广告页的实现,解决了广告图片要实时更新的问题
  7. Factors of Factorial AtCoder - 2286 (N的阶乘的因子个数)(数论)
  8. 我们活在世界上,不是为了求人们原谅。
  9. mysql开发必知必会
  10. REDGATE又一好用的脚本工具ScriptsManager1.3
  11. java访问网络接口_Java网络访问 java调用http java调用其他接口
  12. 隐马尔可夫模型及其基本假设
  13. Elasticsearch 带中文分词的全文检索(分页+高亮返回)
  14. 计算机基础知识表格斜线,怎么在excel中画斜线-制作好看的Excel表格必备技能:3秒制作斜线表头,简单到没朋友...
  15. 阿里云服务器 ECS 数据盘与系统盘是什么?
  16. JasperReport生成pdf文件 Java开发pdf文件 pdf文件生成及下载
  17. 鸿蒙系统支持双系统吗,双系统同台登出,EMUI11+鸿蒙系统2.0,有大招
  18. 北斗微信与服务器怎么联接,北斗卫星的导航服务全球性升级,手机怎样“连接”使用北斗导航?...
  19. 蓝牙鼠标windows linux,windows linux双系统共用蓝牙鼠标
  20. Discussion 2

热门文章

  1. Unity下载文件的方式小结
  2. API接口使用方法(封装好的电商平台)
  3. Dev-c++怎么设置背景色
  4. 信贷业务:常用风险指标
  5. Linux RHEL/Ubuntu安装教程
  6. 单芯(多芯)液体不锈钢过滤器技术介绍
  7. 【高速接口-RapidIO】5、Xilinx RapidIO核例子工程源码分析
  8. 最优秀好用的免费文件压缩/解压缩工具软件 (可替代WinRAR与7-Zip)——Bandizip
  9. 最大的成功是成为自己尊重的人
  10. 数据结构课设----运动会分数统计系统