Vue中watch、computed、updated三者的区别及用法


Posted in Javascript onJuly 27, 2020

1、watch

理解: 监听器,监听某个数据的变化从而来执行一些操作,当data里面的数据发生变化的时候来执行一下开销较大或异步的操作

1、监听值类型(简单类型)数据

//在一个vue实例中
  new Vue({
    el:"#myApp",
    data:{
      num1:1,
      num2:2
    },
    methods:{},
    watch:{
     //这里两个属性,第一个值是变化后最新的值,第二个是变化前
      num1(after,before){
        this.num2 = after +1
      }
      immediate:true  //页面首次加载的时候做一次监听。
     //这里的意思就是,监听num1的变化,当num1的数据发生变化的时候,来操作num2的值
    }
  })

2、监听引用(复杂)类型的数据

new Vue({
    el:"#myApp",
    data:{
      obj:{
        userName:"caicai"
      }
    },
    watch:{
      obj:{
        handler(newValue,oldValue){
          // handler函数是当你的obj发生变化的时候你要做什么          
         console.log(newValue.userName,oldValue.userName);
        },
        deep:true //是否深度侦听,true开启,false关闭,默认false
        //加了deep之后相当于在对象obj每一层的属性都加上了handler侦听器。否则的话侦听到的只是引用地址,不会执行handler函数
      }
    }
  });

2、computed

理解: 计算属性,顾名思义就是通过某个属性(数据)来计算得到某个属性,这个重点在于计算,我们希望的是拿到data数据后处理一下,得到计算的结果。

在原vue中的template模板,作者初衷只是进行一些简单的运算,那么比较复杂的计算就可用computed来进行操作

<div id="myApp">
    <input type="text" v-model="str">
  1、第一种操作,写在模板里,导致模板过重,难于维护
    <p>{{str.split("").reverse().join("")}}</p> 
  2、第二种,使用一个方法来调用,若多处使用,就执行多次,降低运行速度,性能减少
    <p>{{fn(str)}}</p>
  3、第三种,使用过滤器,具有缓存,只要str不发生变化,就不会再次进行运算
    <p>{{reverseStr}}</p>
  </div>
<script type="text/javascript">
new Vue({
  el:"#myApp",
  data:{
    str:"abcd"
  },
  methods:{
    fn(v){
     //若多出调用,就执行多次
     return v.split("").reverse().join("")//炸开--反转--组合
    }
  },
  computed:{
    reverseStr(){
     //str不发生变化的话,我只执行一次,具有缓存
      return this.str.split("").reverse().join("")
    }
  }
})
</script>

到这里我先略微总结一下这两者的区别,以及使用场景

computed:

1、监控自己定义的变量,不用再data里面声明,函数名就是变量名

2、适合多个变量或对象进行处理后返回一个值(结果)。若这多个变量发生只要有一个发生变化,结果都会变化。

3、计算的结果具有缓存,依赖响应式属性变化,响应式属性没有变化,直接从缓存中读取结果。

4、在内部函数调用的时候不用加()。

5、必须用return返回

6、不要在computed 中对data中的数据进行赋值操作,这会形成一个死循环。

watch:

1、watch 函数是不需要调用的。

2、重点在于监控,监控数据发生变化的时候,执行回调函数操作。

3、当我们需要在数据变化时执行异步或开销较大的操作时,应该使用 watch

4、函数名就是你要监听的数据名字

使用场景:

computed:

1、一个需要的结果受多个数据影响的时候,比如购物车结算金额(受到很多处的价格结算)。

2、操作某个属性,执行一些复杂的逻辑,并在多处使用这个结果。

3、内部函数中多处要使用到这个结果的。

watch :

1、监控一些input框值的特殊处理,适合一个数据影响多个数据。

2、数据变化时,执行一些异步操作,或开销比较大的操作

3、updated

理解: 是vue生命周期里面的一个钩子函数—data数据更新后触发视图更新。这里是视图更新之后的操作可以在这里执行。

触发条件:

1、当data中定义的数据有变化时就会加载updated方法。

2、任何数据的更新,如果要做统一的业务逻辑处理

3、在大多数情况下,此期间避免更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。

特点:

1.执行到它的时候时候是数据发生变化且界面更新完毕

2.不能监听到路由数据(例如网址中的参数)

3.所有的数据发生变化都会调用(消耗性能)

4.只要数据发生变化,每次触发的代码都是同一个

补充知识:vue中渲染数据可能有一个无限更新循环--You may have an infinite update loop in a component render function.

今天在在工作中碰到个问题,在此记录下。

今天在接接口数据时发现数据搞反了,于是想着把数据倒叙一下

<row-list 
 v-if="dataList.rules" 
 :canSelect="!isClose" 
 :dataList="dataList.rules[0].subLotteryRule[0].subLotteryRule.reverse()" 
 @selectRow="selectRow"></row-list>

结果报了个错

找了好久发现问题就在于reverse()这个方法

vue的响应式原理中对于数组的更新检测包含了一组观察数组的编译方法

push()

pop()

shift()

unshift()

splice()

sort()

reverse()

而我在呈现的数据中调用了reverse()这个方法,这样就会导致无限的更新循环。

解决办法也很简单,可以在vue实例的数据对象赋值之前调用reverse()就可以了

以上这篇Vue中watch、computed、updated三者的区别及用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于mouseout和mouseover等类似事件的冒泡问题解决方法
Nov 18 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
Sep 08 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
May 18 Javascript
jQuery实现QQ空间汉字转拼音功能示例
Jul 10 jQuery
vue vuex vue-rouert后台项目——权限路由(适合初学)
Dec 29 Javascript
json对象及数组键值的深度大小写转换问题详解
Mar 30 Javascript
使用webpack3.0配置webpack-dev-server教程
May 29 Javascript
vue 使用vue-i18n做全局中英文切换的方法
Oct 29 Javascript
Node.js 路由的实现方法
Jun 05 Javascript
重置Redux的状态数据的方法实现
Nov 18 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
Jul 24 Javascript
JS相册图片抖动放大展示效果的示例代码
Jan 29 Javascript
Element Backtop回到顶部的具体使用
Jul 27 #Javascript
解决vue中的无限循环问题
Jul 27 #Javascript
Element MessageBox弹框的具体使用
Jul 27 #Javascript
Vue 组件复用多次自定义参数操作
Jul 27 #Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
Jul 27 #Javascript
Element InfiniteScroll无限滚动的具体使用方法
Jul 27 #Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
Jul 27 #Javascript
You might like
PHPMailer邮件发送的实现代码
2013/05/04 PHP
php中文验证码实现示例分享
2014/01/12 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
简介JavaScript中search()方法的使用
2015/06/06 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
非常实用的js验证框架实现源码 附原理方法
2016/06/08 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
对pandas中Series的map函数详解
2018/07/25 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
关于box-sizing的全面理解
2016/07/28 HTML / CSS
顶岗实习接收函
2014/01/09 职场文书
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
小区的门卫岗位职责
2014/10/01 职场文书
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS