Vue指令(3):v-bind、计算属性、watch(监控)与深度监控

v-bind(操作属性值)

在属性上使用vue的数据

通过插值的方式并不能实现属性的替换,所以使用v-bind

插值表达式不能用在标签的属性中。

于是使用新的指令来解决:v-bind

语法:

v-bind:属性名="Vue中的变量"

可以简写为:

:属性名='属性值'

例如:

<div v-bind:class="color"></div>
//与下面这个效果一样
<div :class="color"></div>
  • 测试代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
        <script src="node_modules/vue/dist/vue.js"></script>
        <style type="text/css">
            div {
                width: 100px;
                height: 100px;
                color: white;
            }
            .red {
                background-color: red;
            }
            .blue {
                background-color: blue;
            }
        </style>
    </head>
    <body>
        <div id="va">
            <button @click="color='red'">红色</button>
            <button @click="color='blue'">蓝色</button>
            <div :class="color">
                点击按钮改变背景颜色。
            </div>
        </div>
    <script>
        var va = new Vue({//创建一个vue实例
            el:"#va",
            data:{
                color:"red"
            }
        });
    </script>
    </body>
    </html>
    
  • 效果:通过点击实现背景的切换

    image-20211021115607861

class属性的特殊用法

Vue对class属性进行了特殊处理,可以接收数组或对象格式

例如:

<div :class="{ red: true,blue:false }"></div>
  • 对象中,key是已经定义的class样式的名称,如本例中的: red 和 blue
  • 对象中,**value是一个布尔值,**如果为true,则这个样式会生效,如果为false,则不生效。

v-bind的作用:可以对所有元素的属性设置vue实例的数据。

上面的案例可以简写为:

  • 测试代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
        <script src="node_modules/vue/dist/vue.js"></script>
        <style type="text/css">
            div {
                width: 100px;
                height: 100px;
                color: white;
            }
            .red {
                background-color: red;
            }
            .blue {
                background-color: blue;
            }
        </style>
    </head>
    <body>
        <div id="va">
            <button @click="bool=!bool">点我改变下面色块颜色</button>
            <div :class="{red:bool,blue:!bool}">
                点击按钮改变背景颜色。
            </div>
        </div>
    <script>
        var va = new Vue({//创建一个vue实例
            el:"#va",
            data:{
                bool:false
            }
        });
    </script>
    </body>
    </html>
    
  • 效果:通过点击按钮,实现属性的Boolean值一直切换

    image-20211021120500876

计算属性的使用

computed计算属性的应用场景:

可以应用在插值或者指令表示式复杂的时候。

因为可以将一些属性数据经过方法处理之后返回

  • 实现将一个日期时间值转换为yyyy-MM-dd格式字符串

    • 不使用计算属性

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>测试</title>
          <script src="node_modules/vue/dist/vue.js"></script>
          <style type="text/css">
      
          </style>
      </head>
      <body>
          <div id="va">
              <h2>
                  你的生日为:
                  {{new Date(birthday).getFullYear()}}
                  -{{new Date(birthday).getMonth()+1}}
                  -{{new Date(birthday).getDay()}}
              </h2>
          </div>
      <script>
          var va = new Vue({//创建一个vue实例
              el:"#va",//el即element,要渲染的页面元素
              data: {
                  birthday:292903285601
              }
          });
      </script>
      </body>
      </html>
      
    • 使用计算属性

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>测试</title>
          <script src="node_modules/vue/dist/vue.js"></script>
          <style type="text/css">
      
          </style>
      </head>
      <body>
          <div id="va">
              <h2>
                  你的生日为:{{birth}}
              </h2>
          </div>
      <script>
          var va = new Vue({//创建一个vue实例
              el:"#va",//el即element,要渲染的页面元素
              data: {
                  birthday:292903285601
              },
              computed:{
                  birth(){
                      const date = new Date(this.birthday);
                      return date.getFullYear() + "-" + (date.getMonth()+1) + "-" +
                          date.getDay();
                  }
              }
          });
      </script>
      </body>
      </html>
      

watch(监控)和深度监控

使用:

在vue实例中数据属性,因为在页面中修改而产生了变化,可以通过watch监控获取其改变前后的值。

如果是修改对象数据属性,可以开启深度监控获取修改后最新的对象数据

  1. 如:Student.name,当name属性发生了变化之后,深度监控会将修改之后的数据获取到进行更新

watch使用场景:

可以监控视图中数据的变化而做出响应;

  1. 如:下拉框列表中,当如果选择了对于的下拉框选项之后,要根据最新的值去加载一些其它数据的话。

以前定义监控时,person是一个函数,现在改成了对象,并且要指定两个属性:

  1. deep:代表深度监控,不仅监控person变化,也监控person中属性变化
  2. handler:就是以前的监控处理函数
  • 测试代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
        <script src="node_modules/vue/dist/vue.js"></script>
        <style type="text/css">
    
        </style>
    </head>
    <body>
        <div id="va">
            <input v-model="message"/>
            <hr><br>
            <input v-model="person.name"><br>
            <input v-model="person.age"> <button @click="person.age++">+</button>
            <h2>
                姓名为:{{person.name}};年龄为:{{person.age}}
            </h2>
        </div>
    <script>
        var va = new Vue({//创建一个vue实例
            el:"#va",//el即element,要渲染的页面元素
            data: {
                message:"hello vue",
                person:{"name":"张三", "age":12}
            },
            watch:{
                message(newValue, oldValue){
                    console.log("新值:" + newValue + ";旧值:" + oldValue);
                },
                person: {
                    //开启深度监控,可以监控到对象属性值的变化
                    deep: true,
                    //监控的处理方法
                    handler(obj){
                        console.log("name = " + obj.name + ", age=" + obj.age);
                    }
                }
            }
        });
    </script>
    </body>
    </html>
    
  • 效果:

    image-20211021124034649

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

?abc!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值