vue之methods、computed、watcher

  1. computed 是基于响应性依赖来进行缓存的。只有在响应式依赖发生改变时它们才会重新求值, 也就是说, 当msg属性值没有发生改变时, 多次访问 reversedMsg 计算属性会立即返回之前缓存的计算结果, 而不会再次执行computed中的函数。但是methods方法中是每次调用, 都会执行函数的, methods它不是响应式的。
  2. computed中的成员可以只定义一个函数作为只读属性, 也可以定义成 get/set变成可读写属性, 但是methods中的成员没有这样的。
<div id="app">
    <div>第一次调用computed属性: {{ reversedMsg }}</div>
    <div>第二次调用computed属性: {{ reversedMsg }}</div>
    <div>第三次调用computed属性: {{ reversedMsg }}</div>
    <!-- 下面是methods调用 -->
    <div>第一次调用methods方法: {{ reversedMsg1() }}</div>
    <div>第二次调用methods方法: {{ reversedMsg1() }}</div>
    <div>第三次调用methods方法: {{ reversedMsg1() }}</div>
  </div>
  <script type="text/javascript">
    var vm = new Vue({
      el: '#app',
      data: {
        msg: 'hello'
      },
      computed: {
        reversedMsg() {
          console.log(1111);
          // this 指向 vm 实例
          return this.msg.split('').reverse().join('')
        }
      },
      methods: {
        reversedMsg1() {
          console.log(2222);
          // this 指向 vm 实例
          return this.msg.split('').reverse().join('')
        }
      }
    });
    console.log(vm);
  </script>

在这里插入图片描述
watch属性
watch初始化默认不执行,那么我们现在想要第一次初始化页面的时候也希望它能够执行 ‘某个属性’ 进行监听, 最后能把结果返回给 ‘basicMsg’ 值来。因此我们需要修改下我们的 watch的方法,需要引入handler方法和immediate属性,

<div id="app">
    <p>空智个人信息情况: {{ basicMsg }}</p>
    <p>空智今年的年龄: <input type="text" v-model="age" /></p>
  </div>
  <script type="text/javascript">
    var vm = new Vue({
      el: '#app',
      data: {
        basicMsg: '',
        age: 31,
        single: '单身'
      },
      watch: {
        age: {
          handler(newVal, oldVal) {
            this.basicMsg = '今年' + newVal + '岁' + ' ' + this.single;
          },
          immediate: true
        }
      }
    });
  </script>

设置了 immediate:true的话,第一次页面加载的时候也会执行该handler函数的。即第一次 basicMsg 有值

watch深层监听

<script type="text/javascript">
    var vm = new Vue({
      el: '#app',
      data: {
        obj: {
          basicMsg: '',
          age: 31,
          single: '单身'
        }
      },
      watch: {
        'obj': {
          handler(newVal, oldVal) {
            this.basicMsg = '今年' + newVal.age + '岁' + ' ' + this.obj.single;
          },
          immediate: true,
          deep: true // 需要添加deep为true 即可对obj进行深度监听
        }
      }
    });
  </script>

设置deep:true;vue就会为对象每层都添加监听器;这样做显然会消耗性能;我们可以直接监听obj.age;

1.JS的限制, Vue不能检测到对象属性的添加或删除的。它只能监听到obj这个对象的变化,比如说对obj赋值操作
  会被监听到。
mounted(){
	this.obj = {
		 basicMsg: '2',
         age: 3,
         single: '单'
	}
}

watch 和 computed的区别是

相同点:他们两者都是观察页面数据变化的。

不同点:computed只有当依赖的数据变化时才会计算, 当数据没有变化时, 它会读取缓存数据。
watch每次都需要执行函数。watch更适用于数据变化时的异步操作。

Vue.js 中,关于性能和效率,以下几个选项各有其适用场景: 1. **Data(数据)**:这是组件的基础,用于存储和初始化组件内部的状态。Vue会监听data的变化并触发视图更新。保持数据简单和最小化状态有助于提高性能。如果数据量大且频繁变化,可能会影响性能。 2. **Computed(计算属性)**:它们是基于数据的属性,当依赖的数据发生变化时,它们会被重新计算。Computed是懒加载的,只有在真正需要时才会计算,因此它们通常比直接操作数据更高效。 3. **Methods(方法)**:处理业务逻辑的函数。它们在执行时也会监听数据变化,但通常不会频繁调用,所以对性能的影响相对较小。 4. **Components(组件)**:可复用的代码模块,包含自己的数据、方法和模板。组件间的通信通常是通过props和事件进行,合理划分组件可以提高代码的维护性和性能。 5. **Watchers(观察者)**:虽然Vue 3不再推荐直接使用watcher,但它在旧版本中被用于复杂的依赖追踪。在新版中,如果直接使用watcher监控数据,可能会产生不必要的渲染。 从整体效率来看,Data和Computed在大多数情况下都是高效的,尤其是当数据结构复杂或需要基于数据做计算时。组件的复用也是关键,避免不必要的渲染和DOM操作。方法的性能取决于具体使用场景,应尽量减少副作用。 **相关问题:** 1. 在Vue中,如何优化数据监听以提高性能? 2. 如何在Vue组件中正确使用Computed属性? 3. 怎样划分组件以提高Vue应用的性能?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值