Vue—侦听属性

目录

watch配置项

开启深度监视

后期添加监听

watch的写法

watch和computed选择

class与style绑定

绑定字符串

绑定数组

绑定对象

与style绑定


侦听属性的变化其实就是监视某个属性的变化。当被监视的属性一旦发生改变时,执行某段代码

watch配置项

监视属性变化时需要使用watch配置项,可以监视多个属性,监视哪个属性,就把哪个属性的名字拿过来即可

可以监视Vue的原有属性

可以监视计算属性

开启深度监视

(1) 监视多级结构中某个属性的变化,写法是:'a.b.c' : {}。无法直接监视对象深层次属性,如a.b,b属性压根不存在,如果监视的属性具有多级结构,一定要添加单引号:'a.b'

(2) 监视多级结构中所有属性的变化,可以通过添加深度监视来完成:deep : true,默认是不开启深度监视的。

后期添加监听

调用API:vm.$watch('number1', {})

watch的写法

javascript 复制代码
watch: {
//简写
        num(new1, old) {
          console.log(new1);
          console.log(old);
        }
      },
        watch: {
//完整写法
          a: {
            handler(n, o) {
              console.log("发生变化了");
            },
            deep: true,
// 初始化就执行handler函数
            immediate: true,
          },
        }

写法主要分两种,一种是函数的写法,一种是方法的写法

函数方式就直接定义处理函数,但在遇到需要配置deep和immediate(初次执行)时就需要写完整写法,写成方法格式(包含handler和配置选项)

watch和computed选择

computed和watch都能够完成的,优先选择computed。

如果要开启异步任务,只能选择watch。因为computed依靠return。watch不需要依赖return。


class与style绑定

绑定字符串
javascript 复制代码
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Class绑定之字符串形式</title>
    <script src="./js/vue.js"></script>
    <style>
      .static {
        border: 1px solid black;
        background-color: aquamarine;
      }

      .big {
        width: 200px;
        height: 200px;
      }

      .small {
        width: 100px;
        height: 100px;
      }
    </style>
  </head>

  <body>
    <!-- 需求:div有静态样式:static,大小是动态的 ,点击按钮,更换应用不同的样式-->
    <div id="app">
      <h1>{{msg}}</h1>
      <!-- 静态写法 有基本样式,有大小 -->
      <div class="small static">{{msg}}</div>
      <hr />
      <!-- 动态写法:动静都有  static是静态样式,大小是指定的-->
      <div class="static" :class="c1">{{msg}}</div>
      <button @click="c1='big'">变大</button>
      <button @click="c1='small'">变小</button>
      <!-- 适用场景:如果确定动态绑定的样式个数只有1个,但是名字不确定。 -->
    </div>
    <script>
      const vm = new Vue({
        el: "#app",
        data() {
          return {
            msg: "Class绑定之字符串形式",
            c1: "small",
          };
        },
      });
    </script>
  </body>
</html>
绑定数组
javascript 复制代码
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Class绑定之数组形式</title>
    <script src="./js/vue.js"></script>
    <style>
      .static {
        border: 1px solid black;
        width: 100px;
        height: 100px;
      }

      .active {
        background-color: green;
      }

      .text-danger {
        color: red;
      }
    </style>
  </head>

  <body>
    <div id="app">
      <h1>{{msg}}</h1>
      <!-- 静态写法 -->
      <div>{{msg}}</div>
      <br />
      <!-- 动态写法:动静结合 -->
      <!-- 写法一、直接类名,此时的类名必须要在css中被注册使用 -->
      <div class="static" :class="['active','text-danger']">{{msg}}</div>
      <br />
      <!-- 写法二、数组中放变量名 -->
      <div class="static" :class="[c1,c2]">{{msg}}</div>
      <br />
      <!-- 写法三、直接定义数组 -->
      <div class="static" :class="styles">{{msg}}</div>
      <!-- 适用场景:当样式的个数不确定,并且样式的名字也不确定的时候,可以采用数组形式。 -->
    </div>
    <script>
      const vm = new Vue({
        el: "#app",
        data() {
          return {
            msg: "Class绑定之数组形式",
            c1: "active",
            c2: "text-danger",
            styles: ["active", "text-danger"],
          };
        },
      });
    </script>
  </body>
</html>
绑定对象
javascript 复制代码
​
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Class绑定之对象形式</title>
    <script src="./js/vue.js"></script>
    <style>
      .static {
        border: 1px solid black;
        width: 100px;
        height: 100px;
      }

      .active {
        background-color: green;
      }

      .text-danger {
        color: red;
      }
    </style>
  </head>

  <body>
    <div id="app">
      <h1>{{msg}}</h1>
      <!-- 动态写法:动静结合 -->
      <!-- 写法一、可以直接跟对象变量名 -->
      <div class="static" :class="{active:true,'text-danger':false}">
        {{msg}}
      </div>
      <br />
      <!-- 写法二、可以跟对象的完整写法 -->
      <div class="static" :class="classObj">{{msg}}</div>

      <!-- 对象形式的适用场景:样式的个数是固定的,样式的名字也是固定的,但是需要动态的决定样式用还是不用。 -->
    </div>
    <script>
      const vm = new Vue({
        el: "#app",
        data() {
          return {
            msg: "Class绑定之对象形式",
            classObj: {
              // 该对象中属性的名字必须和css中样式名一致。
              active: false,
              "text-danger": true,
            },
          };
        },
      });
    </script>
  </body>
</html>

​
与style绑定
javascript 复制代码
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Style绑定</title>
    <script src="./js/vue.js"></script>
    <style>
      .static {
        border: 1px solid black;
        width: 100px;
        height: 100px;
      }
    </style>
  </head>

  <body>
    <!--需求: 动态添加背景色 -->
    <div id="app">
      <h1>{{msg}}</h1>
      <!-- 静态写法  -->
      <div class="static" style="background-color: green">静态写法</div>
      <br />
      <!-- 动态写法:字符串形式 -->
      <div class="static" :style="c1">动态写法:字符串形式</div>
      <br />
      <!-- 动态写法:对象形式 -->
      <div class="static" :style="{backgroundColor:'green',color:'#fff'}">
        动态写法1:对象形式
      </div>
      <br />
      <div class="static" :style="styleObj">动态写法2:对象形式</div>
      <br />
      <!-- 动态写法:数组形式 -->
      <div class="static" :style='[{ backgroundColor: "green"},{color: "#fff" },{fontSize:"30px"}]'>动态写法:数组形式</div>
    </div>
    <script>
      const vm = new Vue({
        el: "#app",
        data() {
          return {
            msg: "Style绑定",
            c1: "background-color: green",
            styleObj: { backgroundColor: "green", color: "#fff" },
          };
        },
      });
    </script>
  </body>
</html>
相关推荐
酉鬼女又兒2 小时前
零基础入门前端弹性布局(Flexbox)实战:结合 Class 与 ID 选择器(可用于备赛蓝桥杯Web开发应用)
前端·css·蓝桥杯·html·html5
小J听不清2 小时前
CSS display 属性全解析:块级 / 行内 / 行内块 / 隐藏
前端·javascript·css·html·css3
早點睡3902 小时前
ReactNative项目Openharmony三方库集成实战:react-native-safe-area-context
javascript·react native·react.js
ONLYOFFICE2 小时前
ONLYOFFICE 全新 PDF 编辑器 API 上线,自动化处理 PDF 内容
前端·人工智能·pdf·编辑器·onlyoffice
James man2 小时前
前端节点连接库选型指南:React-Flow、AntV X6 与 Power-Link 深度对比
前端·react.js·前端框架
于慨2 小时前
java Web
java·开发语言·前端
徐小夕@趣谈前端2 小时前
借助AI,1周,0后端成本,我们开源了一款Office预览SDK
前端·人工智能·开源·node.js·编辑器·github·格式工厂
Dxy12393102162 小时前
HTML中图表学习:从基础到实战指南
前端·学习·html
We་ct2 小时前
LeetCode 53. 最大子数组和:两种高效解法(动态规划+分治)
前端·算法·leetcode·typescript·动态规划·分治