深入浅析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 相关文章推荐
JavaScript高级程序设计 阅读笔记(十七) js事件
Aug 14 Javascript
jquery+html5烂漫爱心表白动画代码分享
Aug 24 Javascript
javascript实现全角转半角的方法
Jan 23 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
Jul 07 Javascript
浅谈js中调用函数时加不加括号的问题
Jul 28 Javascript
不使用script导入js文件的几种方法
Oct 27 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
Jan 23 Javascript
js事件冒泡与事件捕获详解
Feb 20 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
Jun 26 Javascript
Vue的百度地图插件尝试使用
Sep 06 Javascript
JS实现的合并两个有序链表算法示例
Feb 25 Javascript
Vue中点击active并第一个默认选中功能的实现
Feb 24 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
javascript中节点的最近的相关节点访问方法
2013/03/20 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
用js动态添加html元素,以及属性的简单实例
2016/07/19 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
2016/08/01 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
在angular 6中使用 less 的实例代码
2018/05/13 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
Vue SPA 首屏优化方案
2021/02/26 Vue.js
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
python操作ssh实现服务器日志下载的方法
2015/06/03 Python
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
军训拉歌口号
2014/06/13 职场文书
中层干部培训方案
2014/06/16 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
入党现实表现材料
2014/12/23 职场文书
2015年煤矿工作总结
2015/04/28 职场文书
2015年度物流工作总结
2015/04/30 职场文书
2016年感恩教师节校园广播稿
2015/12/18 职场文书
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers