深入浅析Vue中的 computed 和 watch


Posted in Javascript onJune 06, 2018

computed

计算属性:通过属性计算得来的属性

    计算属性,是在相关联的属性发生变化才计算,计算过一次,如果相关属性没有变化,下一次就不需要计算了,直接去缓存的值

a:<input type="number" v-model.number="a" />
 b:<input type="number" v-model.number="b" />
 <!--c:<input type="number" v-model.number="c" />-->
 总和:{{sum()}}
 总和:{{count}}
 平均值:{{avg}}
 <p v-once>单价:{{price}}</p>
 <p>数量:<input type="number" v-model.number="count"/></p>
 <p>总价:{{sum}}</p>
 <p>运费:{{free}}</p>
 <p>应付:{{pay}}</p>
  data: {
      a: '',
      b:'',
      c:'',
      price: 28.8,
      count: '',
      free: 10
  },
  computed: {
    count(){
      console.log('计算属性触发了');
        return this.a+this.b;
    },
    avg(){
      return this.count/2;
    },
    sum(){
      return this.price * this.count;
    },
   pay(){
    if(this.count>0){
      if(this.sum>=299){
        return this.sum;
    }else{
      return this.sum + this.free;
    }
     }else{
        return 0;
    }
    }
   }

watch

属性变化,就会触发监听的函数。

监听属性变化,一般是用于跟数据无关的业务逻辑操作。

计算属性,适用于属性发生变化后,需要计算得到新的数据。        

<div id="app">
      a: <input type="number" v-model.number="a" /><br />
      b: <input type="number" v-model.number="b" /><br />
      总和:{{count}}
      <br /><br /><br />
      name: <input type="text" v-model="obj.name" /><br />
      age: <input type="text" v-model.number="obj.age" /><br />
    </div>
    <script src="vue.js"></script>
    <script>
      var vm = new Vue({
        el: '#app',
        data: {
          a: '',
          b: '',
          count: '',
          obj: {
            name: '',
            age: ''
          }
        },
        watch: {
          a(newVal, oldVal){
            console.log('触发了a-watch');
            this.count = this.a + this.b;
          },
          b(newVal){
            console.log('触发了b-watch');
            this.count = this.a + this.b;
          },
//          obj(newVal, oldVal){
//            console.log('触发了obj的监听');
//          }
//
          obj: {
            //监听对象中的每一个值
            handler(newVal, oldVal){
              console.log('触发了obj的监听');
            },
            deep: true//深度监听
          },
          //监听对象中的某个属性
          'obj.name': function(){
            console.log('触发了obj.name的监听');
          }
        }
      })
    </script>

watch 也可以在methods里面进行监听配置

<div id="app">
      a: <input type="number" v-model.number="a" /><br />
      b: <input type="number" v-model.number="b" /><br />
      总和:{{count}}
      <br /><br /><br />
      name: <input type="text" v-model="obj.name" /><br />
      age: <input type="text" v-model.number="obj.age" /><br />
      <button @click="btnAction()">开始监听</button>
    </div>
    <script src="vue.js"></script>
    <script>
      var vm = new Vue({
        el: '#app',
        data: {
          a: '',
          b: '',
          count: '',
          obj: {
            name: '',
            age: ''
          }
        },
        methods: {
          btnAction(){
            this.$watch('a', (newVal, oldval)=>{
              console.log('监听到了a的变化');
              console.log(newVal, oldval);
            })
            this.$watch('obj.name', (newVal, oldval)=>{
              console.log('监听到了obj.name的变化');
              console.log(newVal, oldval);
            })
            this.$watch('obj', (newVal, oldval)=>{
              console.log('监听到了obj的变化');
              console.log(newVal, oldval);
            }, {
              deep: true
            })
          }
        }
      })
//      vm.$watch('a', (newVal, oldval)=>{
//        console.log('监听到了a的变化');
//        console.log(newVal, oldval);
//      })
//      
//      vm.$watch('obj.name', (newVal, oldval)=>{
//        console.log('监听到了obj.name的变化');
//        console.log(newVal, oldval);
//      })
//      
//      vm.$watch('obj', (newVal, oldval)=>{
//        console.log('监听到了obj的变化');
//        console.log(newVal, oldval);
//      }, {
//        deep: true
//      })
    </script>

下面在看下computed 和 watch

  都可以观察页面的数据变化。当处理页面的数据变化时,我们有时候很容易滥用watch。 而通常更好的办法是使用computed属性,而不是命令是的watch回调。

/*html:
  我们要实现 第三个表单的值 是第一个和第二个的拼接,并且在前俩表单数值变化时,第三个表单数值也在变化
  */
<div id="myDiv">
  <input type="text" v-model="firstName">
  <input type="text" v-model="lastName">
  <input type="text" v-model="fullName">
</div>
<!--js: 用watch方法来实现-->
//将需要watch的属性定义在watch中,当属性变化氏就会动态的执行watch中的操作,并动态的可以更新到dom中 
 new Vue({
 el: '#myDiv',
 data: {
  firstName: 'Foo',
  lastName: 'Bar',
  fullName: 'Foo Bar'
 },
 watch: {
  firstName: function (val) {
   this.fullName = val + ' ' + this.lastName
  },
  lastName: function (val) {
   this.fullName = this.firstName + ' ' + val
  }
 }
})
<!--js: 利用computed 来写-->
  //计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值。
  //这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
 new Vue({
    el:"#myDiv",
      data:{
        firstName:"Den",
        lastName:"wang",
      },
      computed:{
        fullName:function(){
          return this.firstName + " " +this.lastName;
        }
      }
  })

  很容易看出 computed 在实现上边的效果时,是更简单的。

总结

以上所述是小编给大家介绍的Vue中的 computed 和 watch,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery 连续列表实现代码
Dec 21 Javascript
JavaScript判断一个URL链接是否有效的实现方法
Oct 08 Javascript
深入探寻javascript定时器
Jan 02 Javascript
JS模拟键盘打字效果的方法
Aug 05 Javascript
JS解决移动web开发手机输入框弹出的问题
Mar 31 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
Jul 21 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
Sep 26 Javascript
浅谈Node.js之异步流控制
Oct 25 Javascript
jQuery实现的五星点评功能【案例】
Feb 18 jQuery
解决一个微信号同时支持多个环境网页授权问题
Aug 07 Javascript
JavaScript实现抖音罗盘时钟
Oct 11 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
Nov 04 Javascript
详解创建自定义的Angular Schematics
Jun 06 #Javascript
vue组件实现进度条效果
Jun 06 #Javascript
Express的HTTP重定向到HTTPS的方法
Jun 06 #Javascript
vue组件实现可搜索下拉框扩展
Oct 23 #Javascript
微信小程序实现美团菜单
Jun 06 #Javascript
详解express + mock让前后台并行开发
Jun 06 #Javascript
vue element项目引入icon图标的方法
Jun 06 #Javascript
You might like
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
ionic环境配置及问题详解
2017/06/27 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
Vue中&quot;This dependency was not found&quot;问题的解决方法
2018/06/19 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
python遍历序列enumerate函数浅析
2017/10/17 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
One.com挪威:北欧成长最快的网络托管公司
2016/11/19 全球购物
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
本科毕业生的求职信范文
2013/11/20 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
装修施工安全责任书
2014/07/24 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
司法局2014法制宣传日活动总结
2014/11/01 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
JS监听Esc 键触发事键
2021/04/14 Javascript
Python音乐爬虫完美绕过反爬
2021/08/30 Python