博客列表 >Vue条件渲染,计算属性Computed与侦听器Watch的共性与区别

Vue条件渲染,计算属性Computed与侦听器Watch的共性与区别

残破的蛋蛋
残破的蛋蛋原创
2021年01月19日 15:49:32737浏览

Vue条件渲染,计算属性Computed与侦听器Watch的共性与区别

一、Vue条件渲染:指令v-if和v-show

1.1 v-if指令

只需要给元素添加上v-if指令即可,与之配合使用的还有v-else-if,首先我们给出一个id=app的DOM结构,并挂载到Vue上,交给Vue接管。

  • 单分支:
  1. <div id="app">
  2. <p v-if="flag">{{msg}}</p>
  3. </div>
  4. <script>
  5. const vm = new Vue({
  6. el: document.querySelector("#app"),
  7. data() {
  8. return {
  9. msg: "明天我请大家吃饭"
  10. }
  11. }
  12. });
  13. </script>
  • 效果图:

v-if

  • 多分支:
  1. <div id="app">
  2. <p v-if="point > 0 && point <= 500">{{level[0]}}</p>
  3. <p v-else-if="point > 500 && point <= 1000">{{level[1]}}</p>
  4. <p v-else-if="point > 1000 && point <= 2000">{{level[2]}}</p>
  5. <p v-else-if="point > 2000 && point <= 3000">{{level[3]}}</p>
  6. <p v-else-if="point > 3000 && point <= 4000">{{level[4]}}</p>
  7. <p v-else-if="point > 400 && point <= 5000">{{level[5]}}</p>
  8. <p v-else="point > 5000 && point <= 6000">{{level[6]}}</p>
  9. </div>
  10. <script>
  11. const vm = new Vue({
  12. el: document.querySelector("#app"),
  13. data() {
  14. return {
  15. point: 6000,
  16. level: [
  17. "青铜",
  18. "白银",
  19. "黄金",
  20. "铂金",
  21. "钻石",
  22. "至尊星耀",
  23. "最强王者"
  24. ],
  25. }
  26. }
  27. });
  28. </script>

当上述案例中的point的值位6000时,页面上将显示最强王者

1.2 v-show指令

v-show也可以用于实现条件渲染,不过它仅仅是简单的切换CSS属性:display。当条件判定为false时,元素的display属性将被赋值为none,反之,元素的display属性将恢复原有值。

  1. <div id="app">
  2. <!-- v-show -->
  3. <p v-show="status">Hello World!</p>
  4. </div>
  5. <script>
  6. const vm = new Vue({
  7. el: document.querySelector("#app"),
  8. data() {
  9. return {
  10. status: true
  11. }
  12. }
  13. });
  14. </script>
  • 效果图:

v-show

总结:

  • v-if会在切换中将组件进行销毁和重建,当组件被销毁时,它将无法通过任何方式被获取,因为它已经不存在与DOM中。

  • v-show有更高的初始渲染开销,因为它在页面创建的时候元素已经被添加到页面中了。

二、计算属性Computed

模板表达式设计初衷用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。所以,对于任何复杂逻辑,我们都应当使用计算属性。

以下是一个计算总价的计算属性案例:

  1. <div id="app">
  2. <p>数量:<input type="number" min="0" v-model="num"></p>
  3. <p>单价:{{price}}元
  4. <p>总价:{{totalPrice}}元</p>
  5. </div>
  6. <script>
  7. const vm = new Vue({
  8. el: "#app",
  9. data () {
  10. return {
  11. num: 0,
  12. price: 50,
  13. res: 0
  14. }
  15. },
  16. computed: {
  17. totalPrice: {
  18. get () {
  19. return this.num * this.price;
  20. },
  21. set (value) {
  22. console.log(value);
  23. if (value > 1000) {
  24. this.price = 40;
  25. }
  26. }
  27. }
  28. }
  29. });
  30. </script>
  • 效果图:

computed

以上案例,我们声明了一个计算属性totalPrice,我们提供的函数将用作vm.totalPrice的getter函数:

  1. console.log(vm.totalPrice); // 0

如果此时在控制台修改了vm.num的值为100,那么totalPrice的值就会随之改变:

computed

总结:

  • 计算属性本质上就是原生JS的访问器属性。

  • 计算属性最终的函数属性名称会与data中的数据进行合并,所以不要跟data中的变量重名。

三、侦听属性Watch

Vue提供了一种更通用的方式来观察和响应Vue实例上的数据变动:侦听属性。

现在我们用侦听属性也一样可以完成上述案例功能:

  1. <div id="app">
  2. <p>数量:<input type="number" min="0" v-model="num" :max="max"></p>
  3. <p>单价:{{price}}元
  4. <p>总价:{{res}}元</p>
  5. </div>
  6. <script>
  7. const vm = new Vue({
  8. el: "#app",
  9. data () {
  10. return {
  11. num: 0,
  12. price: 50,
  13. res: 0,
  14. max: 100
  15. }
  16. },
  17. // 侦听器属性
  18. watch: {
  19. // 侦听是某一个属性的值的变化,它的属性名与data里面要监听的变量名一致。
  20. num (newValue, oldValue) {
  21. console.log(newValue, oldValue);
  22. this.res = newValue * this.price;
  23. if (newValue > 20) {
  24. this.max = newValue;
  25. alert("请补货!");
  26. }
  27. }
  28. }
  29. });
  30. </script>
  • 效果图:

computed

侦听属性侦听的是某一个属性的值的变化,它的属性名与data里面要监听的变量名一致。


计算属性Computed与侦听器Watch的区别:

Computed:

  1. 监控自己定义的变量,不用再data里面声明,函数名就是变量名;

  2. 适合多个变量或对象进行处理后返回一个值(结果)。若这多个变量发生只要有一个发生变化,结果都会变化;

  3. 计算的结果具有缓存,依赖响应式属性变化,响应式属性没有变化,直接从缓存中读取结果;

  4. 在内部函数调用的时候不用加();

  5. 必须用return返回;

  6. 不要在computed 中对data中的数据进行赋值操作,这会形成一个死循环;

Watch:

  1. watch 函数是不需要调用的;

  2. 重点在于监控,监控数据发生变化的时候,执行回调函数操作;

  3. 当我们需要在数据变化时执行异步或开销较大的操作时,应该使用watch

  4. 函数名就是要监听的数据名字。

总结:

  1. computed:当有一些数据随着另一些数据进行改变的时候,建议使用计算属性;

  2. watch:当有一些通用的数据进行变化的时候,并且可以是进行异步操作,建议使用侦听器。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议