vue3.0中使用watch

  • 声明属性
  • 通过vue按需引入watch
  • 对指定声明的属性实行监听
<template>
  <el-button type="primary" @click="handleChangeData">修改数据触发watch监听</el-button>
  <div class="count">{{sNum}}</div>
</template>

<script>
import { defineComponent, reactive, ref, toRefs, watchEffect, watch } from "vue";

export default defineComponent({
  name: "Box",
  setup() {
    let state = reactive({
      sNum: 1,
      sObj: {
        account: "zhangsan",
        password: 111111,
      },
      fontColor: "black",
    });

    let rNum = ref(2);
    let rObj = ref({account: "lisi", password: 222222});

    let handleChangeData = ()=>{
      // 修改reactive声明的属性
      state.sNum = 2;
      state.sObj = {
        account: "wangwu",
        password: 333333,
      };
      // 修改ref声明的属性
      rNum.value = 3;
      rObj.value = {
        account: "laoliu",
        password: 444444,
      };
    }
    
    /**
     * 1、通过reactive声明的属性
     */
    // 1.1、即刻监听 immediate
    watch(() => state.sNum, (value) => {
      console.log(value, "sNum即刻监听");
    }, {immediate: true});
    // 1.2、普通监听
    watch(() => state.sNum, (value) => {
      console.log(value, "sNum改变了");
    });
    // 1.3、监听多个数据
    watch([() => state.sNum, () => state.sObj], (value) => {
      console.log(value, "多个");  // [1, Proxy]  Proxy.的方式即可拿到改变后的数据 
    });
    // 1.4、深度监听
    watch(() => state.sObj, (value) => {
      console.log(value, "sObj改变了");
    }, {deep: true});
    
    /**
     * 2、通过ref声明的属性
     */
     // 2.1、即刻监听 immediate
    watch(rNum, (value) => {
      console.log(value, "rNum即刻监听");
    }, {immediate: true});
    // 2.2、普通监听
    watch(rNum, (value) => {
      console.log(value, "rNum改变了");
    });
    // 2.3、监听多个数据
    watch([rNum, rObj], (value) => {
      console.log(value, "多个");  // [3, Proxy]  "Proxy."的方式即可拿到改变后的数据
    });
    // 2.4、深度监听
    watch(rObj, (value) => {
      console.log(value, "rObj改变了");
    }, {deep: true});
    
    /**
     * 3、watchEffect 
     * 立即执行传入的一个函数,并响应式追踪其依赖,并在其依赖变更时重新运行该函数
     */
    watchEffect(() => {
      if (state.sNum % 2) {
        state.fontColor = "deeppink";
      } else {
        state.fontColor = "blue";
      }
    });
    return {
      ...toRefs(state),
      rNum,
      rObj,
      handleChangeData,
    };
  },
});
</script>

<style lang="scss" scope>
.count {
  color: v-bind(fontColor);
  font-weight: bold;
  font-size: 20px;
}
</style>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值