vue多使用computed替代v-if,v-show

需求:根据性别,年龄展示,这个人是男是女,在上什么学。 用v-if和computed 对比 一下

先来一个 v-if或者v-if的 展示办法

<template>
  <div v-if="testData">
    <!-- v-if 或者 v-show的展示方法 -->
    <template v-if="testData.gender && 6 <= testData.age <= 12">
      这位{{testData.gender}}同学 在上 小学
    </template>

    <template v-else-if="testData.gender && 12 < testData.age <= 18">
      这位{{testData.gender}}同学 在上 中学
    </template>

    <template v-else-if="testData.gender && 18 < testData.age ">
      这位{{testData.gender}}同学 在上 大学
    </template>
  </div>
</template>
<style lang="scss" scope>

</style>

<script>
export default {
  name: "test",
  data() {
    return {
      testData:{
        gender:"男", //女
        age:6, // 6-12 小学;12-18 中学;18大学
      }
    };
  },
};
</script>

再来一个 computed 的 办法

<template>
  <div v-if="testData">
    <!-- computed 的 方法 -->
    {{testDataTextComputed}}    
  </div>
</template>
<style lang="scss" scope>

</style>

<script>
export default {
  name: "test",
  data() {
    return {
      testData:{
        gender:"男", //女
        age:6, // 6-12 小学;12-18 中学;18大学
      }
    };
  },
  computed: {
    testDataTextComputed(){
      let testData = this.testData;
      if(testData && testData.gender && testData.age){
      	//错误处理
        if(6 <= testData.age <= 12){
          return `这位${testData.gender}同学 在上 小学`
        }else if(12 < testData.age <= 18){
          return `这位${testData.gender}同学 在上 中学`
        }else if(18 < testData.age){
          return `这位${testData.gender}同学 在上 大学`
        }
      }
    }
  },
};
</script>

上述的例子 不复杂,所以体现的 并不很明显,你可以想象一下,如果判断条件在多2个呢

  1. view 视图层 尽量写和页面展示有关的东西,逻辑尽量写在 javascript里
  2. 上面例子,如果修改代码,我想computed里的方法 更容易 让人去更改,而且可以 做 js 逻辑优化
  3. 当然也不是 不用v-if,v-show,有时候v-if,v-show配合 computed 效果更好,有时候只是简单的 非正即错 的要展示内容,v-if,v-show肯定更好
Vue 中,`v-for` 和 `v-if` 同时使用时,可能会导致性能问题。因为每次更新组件时,Vue 都需要重新计算并渲染组件的每个元素,这会增加组件的渲染时间和开销。为了优化这种情况,可以采用以下几种做法: 1. 避免在同一个元素上同时使用 `v-for` 和 `v-if`。如果必须使用,可以将 `v-if` 放在外层元素上,这样可以减少每个元素的计算量和渲染时间。 2. 将需要过滤的数据在计算属性中进行处理,将处理后的数据传递给 `v-for`,从而减少每次更新组件时的计算量。 ```javascript // 在计算属性中处理数据 computed: { filteredList() { return this.list.filter(item => item.isShow) } } // 在模板中使用处理后的数据 <ul> <li v-for="item in filteredList" :key="item.id">{{ item.name }}</li> </ul> ``` 3. 使用 `v-show` 替代 `v-if`。`v-show` 可以根据条件来显示或隐藏元素,而不是直接销毁或创建元素,从而减少每次更新组件时的计算量。 ```html <!-- 使用 v-show 替代 v-if --> <ul> <li v-for="item in list" :key="item.id" v-show="item.isShow">{{ item.name }}</li> </ul> ``` 4. 使用 `Object.freeze()` 来冻结数据,防止对数据的无意修改导致组件的重新渲染。 ```javascript // 冻结数据 data() { return { list: Object.freeze([ { id: 1, name: 'Apple', isShow: true }, { id: 2, name: 'Banana', isShow: false }, { id: 3, name: 'Orange', isShow: true } ]) } } ``` 上述做法可以有效地优化 `v-for` 和 `v-if` 同时使用时的性能问题,减少组件的计算量和渲染时间,提高应用的性能和用户体验。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值