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 相关文章推荐
javascript 判断数组是否已包含了某个元素的函数
May 30 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
Jun 24 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
Nov 30 Javascript
推荐10 个很棒的 jQuery 特效代码
Oct 04 Javascript
使用JQuery实现的分页插件分享
Nov 05 Javascript
JavaScript 闭包机制详解及实例代码
Oct 10 Javascript
微信小程序 loading(加载中提示框)实例
Oct 28 Javascript
清除浏览器缓存的几种方法总结(必看)
Dec 09 Javascript
微信小程序之仿微信漂流瓶实例
Dec 09 Javascript
JS实现二维数组元素的排列组合运算简单示例
Jan 28 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
Jun 14 Javascript
小程序实现列表展开收起效果
Jul 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
PHP4实际应用经验篇(8)
2006/10/09 PHP
PHP IN_ARRAY 函数使用注意事项
2010/07/24 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
php数组指针操作详解
2017/02/14 PHP
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
Python 的内置字符串方法小结
2016/03/15 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
python实现KNN分类算法
2019/10/16 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
python初步实现word2vec操作
2020/06/09 Python
如何在python中判断变量的类型
2020/07/29 Python
出国留学自荐信
2013/10/25 职场文书
楼面经理岗位职责范本
2014/02/18 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
计划生育工作汇报
2014/10/28 职场文书
七夕情人节问候语
2015/11/11 职场文书