Vue中的计算属性与侦听器

一.v-for

1.更新监测

在一般情况下数据发生变化,就会导致v-for更新,但有些情况,比如数组方法filter,会返回一个新数组,或者字面量的方式直接改变数组的值,不会导致v-for更新,这样的情况下可以采用重赋值或this.$set()或Vue.set()方法

// v-for更新
// 改变原数组的方法会导致v-for更新,但生成新数组,或字面量直接改变数组不会导致v-for更新
import vue from "vue";
export default {
  data() {
    return {
      arr: [1, 12, 3, 4, 5, 6, 7, 8, 9, 0],
      newarr: [],
    };
  },
  methods: {
    btn() {
      //1.重新赋值的方法,v-for新数组
      this.newarr = this.arr.filter((item) => item < 10);
      //2.this.$set()
      this.$set(this.newarr, 0, 100);
      //3.Vue.$set()
      vue.set(this.newarr, 1, 200);
    },
  },
};

二.v-for就地更新与key

v-for在更新时,没有改变整个DOM,而是对比两段,复用标签,就地更新

这样的更新方式可以提高性能,但不是最完美的

使用一个唯一不重复的值作为key,一使用id值,v-for检测到目标结构变化,就会准备一套新的dom结构与原来的作比较,有差异的替换,没差异的复用,这样提升性能最佳.


三.动态class

<p :class="{ col: true }">我是class属性动态生成</p>
<!-- :class="{类名:布尔值}" 布尔值为true,则类名启用,为false,则禁用 -->

四.动态style

<p :style = "{ color: isred, backgroundColor: ispink, fontSize: num }">动态style</p>
<!-- :style = "{属性名:属性值}"  -->

五.vue计算属性 computed

作用:一个变量依赖另外的变量计算而来

注意点:1.计算属性和data属性都是变量,不可重名

            2.函数内变量变化,计算属性也会随之变化

            3.计算属性必须加return

语法:

/* 
computed:{
  也是变量名所以不能和data里的变量重名
  计算属性名(){
    必须return 值,给这个计算属性使用
  }
}
*/
export default {
  data() {
    return {
      a: 10,
      b: 20,
    };
  },
  computed: {
    num() {
      return this.a + this.b;
    },
  },
};

六.vue计算属性的缓存

计算属性是基于它们的依赖项的值结果进行缓存的,只要依赖的变量不变, 都直接从缓存取结果

export default {
  data() {
    return {
      message: "hello,vue",
    };
  },
  computed: {
    reverseMessage() {
      console.log("计算属性");
      return this.message.split("").reverse().join("");
    },
  },
  methods: {
    getMessage() {
      console.log("对比函数");
      return this.message.split("").reverse().join("");
    },
  },
};

如下调用多次对比:

 <div>
    <p>{{ reverseMessage }}</p>
    <p>{{ reverseMessage }}</p>
    <p>{{ reverseMessage }}</p>
    <p>{{ getMessage() }}</p>
    <p>{{ getMessage() }}</p>
    <p>{{ getMessage() }}</p>
  </div>

计算属性只会执行一次,后续从缓存中取值,而函数则会每次调用都执行,浪费内存


七.计算属性的完整写法

语法:

computed: {
    "属性名": {
        set(值){
            
        },
        get() {
            return "值"
        }
    }
}

计算属性一般配合v-model使用,使用set()函数接收值


八.vue侦听器 watch

侦听data/computed属性值的改变,当侦听到改变时即调用

watch: {
    "被侦听的属性名" (newVal, oldVal){ 
     //执行函数在此定义       
    }
}

可以传递两个参数:

newval:当前值

oldval:之前的值

这两个是形参,可以随意定义


九.vue侦听器之深度侦听

当需要侦听复杂类型的数据时,就要开启深度侦听模式deep:true

watch: {
    "要侦听的属性名": {
        deep: true, // 深度侦听复杂类型内变化
        handler (newVal, oldVal) {
          //需要执行的函数在此定义  
        }
    }
}

handler()固定方法触发函数


思考:(如果有答案可以写在评论区哦,写了也没奖励,哈哈哈)

1.为什么Vue中的key一般用id,用索引不是更加方便吗?

2.为何有时数组更新了,但v-for并没有渲染呢?

ps:有兴趣的小伙伴可以把评论区写在答案上,答案下期公布,未完待续......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值