首页 > 其他分享 >Vue3中 watch、watchEffect 详解

Vue3中 watch、watchEffect 详解

时间:2024-09-29 11:34:11浏览次数:6  
标签:count obj name reactive watch watchEffect Vue3 const

1. watch 的使用

语法

import { watch } from "vue"
watch( name , ( curVal , preVal )=>{ //业务处理 }, options ) ;

共有三个参数,分别为:
name:需要帧听的属性;
(curVal,preVal)=>{ //业务处理 } 箭头函数,是监听到的最新值和本次修改之前的值,此处进行逻辑处理。
options :配置项,对监听器的配置,如:是否深度监听。

1.1 监听 ref 定义的响应式数据

<template>
  <div>
    <div>值:{{ count }}</div>
    <button @click="add">改变值</button>
  </div>
</template>

<script lang="ts" setup>
import { ref, watch } from 'vue';

const count = ref(0);

const add = () => {
  count.value++
};

watch(count, (newVal, oldVal) => {
  console.log('值改变了', newVal, oldVal)
})

</script>

1.2监听 reactive 定义的响应式数据

<template>
  <div>
    <div>{{ obj.name }}</div>
    <div>{{ obj.age }}</div>
    <button @click="changeName">改变值</button>
  </div>
</template>

<script lang="ts" setup>
import { reactive, watch } from 'vue';
import _ from 'lodash-es';

const obj = reactive({
  name: 'zs',
  age: 14
});

const changeName = () => {
  obj.name = 'ls';
};

watch(obj, (newVal, oldVal) =>
  {
    if( _.isEqual(newVal, oldVal))
      return;
    console.log('值改变了', newVal, oldVal)
  },
  {immediate:true }
)

</script>

1.3 监听多个响应式数据数据

<template>
  <div>
    <div>{{obj.name}}</div>
    <div>{{obj.age}}</div>
    <div>{{count}}</div>
    <button @click="changeName">改变值</button>
  </div>
</template>

<script>
import { reactive, ref, watch } from 'vue';
export default {
  setup(){
    const count = ref(0);
    const obj = reactive({
      name:'zs',
      age:14
    });
    const changeName = () => {
      obj.name = 'ls';
    };

    watch([count,obj],() => {
      console.log('监听的多个数据改变了')
    })

    return {
      obj,
      count,
      changeName,
    }
  }
}
</script>

1.4 监听对象中某个属性的变化

<template>
  <div>
    <div>{{obj.name}}</div>
    <div>{{obj.age}}</div>
    <button @click="changeName">改变值</button>
  </div>
</template>

<script>
import { reactive, watch } from 'vue';
export default {
  setup(){
    const obj = reactive({
      name:'zs',
      age:14
    });
    const changeName = () => {
      obj.name = 'ls';
    };
    watch(() => obj.name,() => {
      console.log('监听的obj.name改变了')
    })
    return {
      obj,
      changeName,
    }
  }
}
</script>

1.5 深度监听(deep)、默认执行(immediate)

<template>
  <div>
    <div>{{obj.brand.name}}</div>
    <button @click="changeBrandName">改变值</button>
  </div>
</template>

<script>
import { reactive, ref, watch } from 'vue';
export default {
  setup(){
    const obj = reactive({
      name:'zs',
      age:14,
      brand:{
        id:1,
        name:'宝马'
      }
    });
    const changeBrandName = () => {
      obj.brand.name = '奔驰';
    };
    watch(() => obj.brand,() => {
      console.log('监听的obj.brand.name改变了')
    },{
      deep:true,
      immediate:true,
    })
    return {
      obj,
      changeBrandName,
    }
  }
}
</script>

2. watchEffect 的使用

<template>
  <div>
    <input type="text" v-model="obj.name"> 
  </div>
</template>

<script>
import { reactive, watchEffect } from 'vue';
export default {
  setup(){
    let obj = reactive({
      name:'zs'
    });
    watchEffect(() => {
      console.log('name:',obj.name)
    })

    return {
      obj
    }
  }
}
</script>

停止侦听

<template>
  <div>
    <input type="text" v-model="obj.name"> 
    <button @click="stopWatchEffect">停止监听</button>
  </div>
</template>

<script>
import { reactive, watchEffect } from 'vue';
export default {
  setup(){
    let obj = reactive({
      name:'zs'
    });
    const stop = watchEffect(() => {
      console.log('name:',obj.name)
    })
    const stopWatchEffect = () => {
      console.log('停止监听')
      stop();
    }

    return {
      obj,
      stopWatchEffect,
    }
  }
}
</script>

刷新时机

<template>
  <div>
    <div id="value">{{count}}</div> 
    <button @click="countAdd">增加</button>
  </div>
</template>

<script>
import { ref,watch,nextTick,watchEffect} from 'vue';

export default {
  setup(){
    let count = ref(0);
    const countAdd = () => {
      count.value++;
    }
    watch(count,() =>  {
      console.log('watch',count.value)
      nextTick(() =>{
        console.log('watch',document.querySelector('#value') && document.querySelector('#value').innerText)
      });
    },
    {immediate:true })

    watchEffect(() => {
      console.log('watchEffect',count.value)
      console.log('watchEffect',document.querySelector('#value') && document.querySelector('#value').innerText)
    },
    {flush: 'post'})
 
 

    return{
      count,
      countAdd
    }
  }
}
</script>

标签:count,obj,name,reactive,watch,watchEffect,Vue3,const
From: https://www.cnblogs.com/springsnow/p/18439312

相关文章

  • 【vue3】svg组件
    一、Svg组件化支持插件vite.config.tsimport{createSvgIconsPlugin}from"vite-plugin-svg-icons";//svgIconplugins:[//svg组件化支持createSvgIconsPlugin({iconDirs:[pathResolve("../src/assets/svg")],//指定symbolId格式symbolI......
  • 第四章 Vue3视图渲染技术
    第四章Vue3视图渲染技术4.1模版语法Vue使用一种基于HTML的模板语法,使我们能够声明式地将其组件实例的数据绑定到呈现的DOM上。所有的Vue模板都是语法层面合法的HTML,可以被符合规范的浏览器和HTML解析器解析。在底层机制中,Vue会将模板编译成高度优化的JavaSc......
  • Vue3 + Pinia 仿抖音项目:移动端最佳实践,体验原生App般流畅
    嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法摘要:在移动端开发领域,Vue.js一直以其轻量级和易用性著称。今天,我们要介绍的是一个将Vue3和Pinia结合使用的开源项目——Douyin-Vue,这是一个模仿抖音(TikTok)的移动端短视频应用,展现了......
  • Tauri2.0+Vite5聊天室|vue3+tauri2+element-plus仿微信|tauri聊天应用
    原创tauri2.0+vue3+pinai2仿QQ/微信客户端聊天Exe程序TauriWinChat。tauri2-vue3-winchat自研vite5+tauri2.0+vue3setup+element-plus跨平台仿QQ|微信桌面端聊天软件。全新封装tauri2多开窗口管理、自定义圆角阴影窗体。实现聊天、通讯录、收藏、我的、朋友圈/小视频等模块。......
  • vue3 vxe-grid 通过数据库返回的列信息,生成columns,并且其中有一列是img类型,进行slots
    1、一般我们写死的列信息的时候,会这样定义:2、然后我们在template里面,这样这样写slots格式化部分:这样表格中就会展示出一张图片,并且,我们点击了可以查看大图。3、那么我们从数据库中返回的列,应该如何去写:letfields={field:item.fieldname,......
  • vue3+ts+axios封装
    需要安装axios,qsyarnaddaxiosnpmiaxioscnpmiaxiosyarnaddqsnpmiqscnpmiqs在src/API/axios.tsimportaxiosfrom'axios';importqsfrom"qs";axios.defaults.baseURL="/api";//请求地址统一配置到vite.config.ts中代理......
  • vue3对接-捷宇SDK高拍仪
    vue3对接捷宇的sdk高拍仪。一般来说拿到捷宇对接资料,拿到控件,安装到需要的机器上不同的设备型号,插件会不一样,捷宇只适合windos系统。对接资料大概这些在对应的机器上安装控件(如果控件版本较老,则只支持IE浏览器)控件无脑安装就行,控件安装完成后需要去注册表搜索......
  • 18 vue3之自动引入ref插件&深入使用v-model
    自动引入插件后无需再引入ref等使用自动引入插入无需在import{ref,reactive}from"vue"做这样的操作npmi unplugin-auto-import-D vite配置importAutoImportfrom'unplugin-auto-import/vite'//使用vite版本exportdefaultdefineConfig({ plugins:[vu......
  • Vue3中如何响应式解构 props
    1、父组件<template><Children:count="count":info="info"/></template><scriptsetuplang="ts">import{ref,reactive}from"vue";importChildrenfrom"./Comp.vue";constcou......
  • vue3中使用百度地图
    1、在入口的index.html中添加以下代码,更换成自己的key<scriptsrc="//api.map.baidu.com/api?type=webgl&v=1.0&ak=yourkey"></script>2、新增一个.d.ts文件,全局声明BMapGL变量declareconstBMapGL:any不然的话会报这种错误找不到名称“BMapGL”。3、增加地图......