深入浅析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的跨域调用文件
Nov 19 Javascript
jQuery的12招常用技巧分享
Aug 08 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
Oct 21 Javascript
javascript:void(0)使用探讨
Aug 27 Javascript
2则自己编写的jQuery特效分享
Feb 26 Javascript
纯javascript实现分页(两种方法)
Aug 26 Javascript
jQuery Ajax 加载数据时异步显示加载动画
Aug 01 Javascript
jquery表单提交带错误信息提示效果
Mar 09 Javascript
用JS实现一个简单的打砖块游戏
Dec 11 Javascript
JS造成内存泄漏的几种情况实例分析
Mar 02 Javascript
JavaScript中使用Spread运算符的八种方法总结
Jun 18 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
Jul 22 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
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
通过javascript进行UTF-8编码的实现方法
2016/06/27 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
python读写文件操作示例程序
2013/12/02 Python
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
python如何将两个txt文件内容合并
2019/10/18 Python
python取均匀不重复的随机数方式
2019/11/27 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
结构和类有什么异同
2012/07/16 面试题
优秀的毕业生的自我评价
2013/12/12 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
九华山导游词
2015/02/03 职场文书
简爱电影观后感
2015/06/10 职场文书
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技