首页 > 其他分享 >前端学习-vue视频学习006-watch监视、watchEffect

前端学习-vue视频学习006-watch监视、watchEffect

时间:2024-03-05 20:46:11浏览次数:23  
标签:vue name watchEffect watch newVal oldVal person 监视

尚硅谷视频链接

watch监视的5种情况

情况1 监视【ref】定义的【基本类型】数据

<template>
    <div class="person">
        <h1>情况1:监视【ref】定义的【基本类型】数据</h1>
        <h2>求和:{{ sum }}</h2>
        <button @click="changeSum">sum+1</button>
    </div>
</template>

<script lang="ts" setup name="Person">
    import {ref,watch} from 'vue'
    
    let sum = ref(0)
    function changeSum() {
        sum.value += 1
    }
    // 增加监视
    // watch(sum,(newVal,oldVal)=>{
    //     console.log('sum changed',newVal,oldVal);
    // })
    // 停止监视
    const stopWatch = watch(sum,(newVal,oldVal)=>{
        console.log('sum changed',newVal,oldVal);
        if(newVal >= 10) {
            stopWatch()
        }
        return 0
    })
</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }
    
    button {
        margin : 0 5px;
    }

    li {
        font-size : 20px;
    }
</style>

情况2:监视【ref】定义的【对象类型】数据

<template>
    <div class="person">
        <h1>情况2:监视【ref】定义的【对象类型】数据</h1>
        <h2>姓名:{{person.name}}</h2>
        <h2>年龄:{{person.age}}</h2>
        <button @click="changeName">changeName</button>
        <button @click="changeAge">changeAge</button>
        <button @click="changePerson">changePerson</button>
    </div>
</template>

<script lang="ts" setup name="Person">
    import {ref,watch} from 'vue'
    
    let person = ref({
        name:'zhangsan',
        age:20
    })
    function changeName(){
        person.value.name = 'lisi'
    }
    function changeAge(){
        person.value.age++
    }
    function changePerson(){
        person.value = {name:'lalala',age:30}
    }
    // 仅监视对象的地址值,当整个对象发生变化时,监视生效
    // watch(person,(newVal,oldVal)=>{
    //     console.log(newVal,oldVal);
    // })

    // 监视对象内部值的变化(开启深度监视deep 问题:此时由于对象没有变化,因此取到的新、旧值均为新值
    watch(person,(newVal,oldVal)=>{
        console.log(newVal,oldVal);
    },{deep:true})


</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }
    
    button {
        margin : 0 5px;
    }

    li {
        font-size : 20px;
    }
</style>

情况3:监视【reactive】定义的【对象类型】数据

  • 默认开启深度监视,无法关闭
<template>
    <div class="person">
        <h1>情况3:监视【reactive】定义的【对象类型】数据</h1>
        <h2>姓名:{{person.name}}</h2>
        <h2>年龄:{{person.age}}</h2>
        <button @click="changeName">changeName</button>
        <button @click="changeAge">changeAge</button>
        <button @click="changePerson">changePerson</button>
    </div>
</template>

<script lang="ts" setup name="Person">
    import {reactive,watch} from 'vue'
    
    let person = reactive({
        name:'zhangsan',
        age:20
    })
    function changeName(){
        person.name = 'lisi'
    }
    function changeAge(){
        person.age++
    }
    function changePerson(){
        // person = {name:'lalala',age:30}
        // 仅修改对象内的值,对象地址不变
        Object.assign(person,{name:'lalala',age:30})
    }
    // 仅监视对象的地址值,当整个对象发生变化时,监视生效
    // watch(person,(newVal,oldVal)=>{
    //     console.log(newVal,oldVal);
    // })

    // 默认开启深度监视
    watch(person,(newVal,oldVal)=>{
        console.log(newVal,oldVal)
    })

</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }
    
    button {
        margin : 0 5px;
    }

    li {
        font-size : 20px;
    }
</style>

情况4:监视【reactive/ref】定义的【对象类型】数据中的某个属性

推荐使用:函数+深度

<template>
    <div class="person">
        <h1>情况4:监视【reactive/ref】定义的【对象类型】数据中的某个属性</h1>
        <h2>姓名:{{person.name}}</h2>
        <h2>年龄:{{person.age}}</h2>
        <h2>车:{{ person.car.c1 }}、{{ person.car.c2 }}</h2>
        <button @click="changeName">changeName</button>
        <button @click="changeAge">changeAge</button>
        <button @click="changeC1">changeC1</button>
        <button @click="changeC2">changeC2</button>
        <button @click="changeCar">changeCar</button>
    </div>
</template>

<script lang="ts" setup name="Person">
    import {reactive,watch} from 'vue'
    
    let person = reactive({
        name:'zhangsan',
        age:20,
        car:{
            c1:'第一',
            c2:'第二'
        }
    })
    function changeName(){
        person.name += '!'
    }
    function changeAge(){
        person.age++
    }
    function changeC1(){
        person.car.c1 = '333'
    }
    function changeC2(){
        person.car.c2 = '444'
    }
    function changeCar(){
        person.car = {
            c1:'555',
            c2:'666'
        }
    }
    
    // 要监视的值不是对象,需要写成函数
    watch(()=>person.name,(newVal,oldVal)=>{
        console.log('person.name changed',newVal,oldVal);
        
    })

    // 要监视是值仍然是对象,可以直接写,但建议写成函数
    // 直接写时,如果改变整个对象,则无法监视到
    watch(person.car,(newVal,oldVal)=>{
        console.log('person.car changed',newVal,oldVal)
    },{deep:true})
    // 写成函数+深度,可以监视到所有变化
    watch(()=>person.car,(newVal,oldVal)=>{
        console.log('person.car changed',newVal,oldVal)
    },{deep:true})

</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }
    
    button {
        margin : 0 5px;
    }

    li {
        font-size : 20px;
    }
</style>

情况5:监视上述的多个数据

使用数组

watch([()=>person.car.c1,()=>person.name],(newVal,oldVal)=>{
    console.log('person.car changed',newVal,oldVal)
},{deep:true})

watchEffect

    // 使用watch,需要监视这两个数据(如果有10个数据,要监视10个
    // watch([temp,height],()=>{
    //     if(temp.value > 50 || height.value > 70){
    //         console.log('hhhhhhhhhhhh')
    //     }
    // })

    // 使用watchEffect,自动监视所有变化的数据
    watchEffect(()=>{
        if(temp.value > 50 || height.value > 70){
            console.log('hhhhhhhhhhhh')
        }
    })

标签:vue,name,watchEffect,watch,newVal,oldVal,person,监视
From: https://www.cnblogs.com/ayubene/p/18052854

相关文章

  • Vite 2.0 + Vue3 + Ts + Vant3移动端项目
    highlight:androidstudioVite2.0搭建Vue3移动端项目一.涉及技术点vitevue3tsroutervuexaxiosvant3移动端适配请求代理二.步骤vite+ts+vue3只需要一行命令npminit@vitejs/appmy-vue-app--templatevue-ts初始化项目npminstallnpmrundev**......
  • vue中PDF文件转图片方式
    1、在vue中安装依赖 pdfjs-dist  2、在需要引用的文件中添加import*aspdfjsfrom'pdfjs-dist'import*aspdfjsWorkerfrom'pdfjs-dist/build/pdf.worker.entry'pdfjs.GlobalWorkerOptions.workerSrc=pdfjsWorker3、编写需要转换的方法<divv-for="(i......
  • 详细vite创建vue3项目(vue3+vue-router+ts+vite+element-plus+pinia)
    详细vite创建vue3项目(vue3+vue-router+ts+vite+element-plus+pinia):https://blog.csdn.net/qq_44423029/article/details/126378199?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170891147716800185818285%2522%252C%2522scm%2522%253A%252220140713.130102334..%2......
  • Vue学习笔记33-生命周期
    示例一: <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>引入生命周期</title>......
  • vue问题
    1.报错errorUnexpectedconsolestatementno-console百度得知是eslint校验问题处理方法:1)在代码中增加eslint忽略文件(貌似不生效)cat.eslintignorebuild/*.jssrc/assetspublicdistsrc/common2)在服务器中安装插件babel-plugin-transform-remove-consolenpmins......
  • Vue学习笔记32--自定义指令--对象式
    Vue学习笔记32--自定义指令--对象式总结:1.autofocus属性,用于input自动获取焦点2.directives指令中this是指window3.vm中使用directives进行自定义指令,为局部指令4.全局指令和全局过滤器类似,应在vm之外使用directive进行声明使用自定义指令总结: 定......
  • vue的mixin和extend
    使用场景:mixin:通用逻辑共享:当多个组件需要共享相同的方法,数据和属性时,可以通过mixin实现extend:如果想基于现有组件创建一个新组件,并且新组件还能继承现有组件的数据,方法和属性时,可以通过extend实现,extend类似于class使用实例:mixin部分代码使用mixin当组件使用混入对象时,......
  • 在vue项目中使用scss预处理器
    从Node.js12版本开始,`node-sass`被标记为不再维护,并且从npm上已经被移除。现在,推荐使用`sass`包替代`node-sass`。`sass`包是Sass的JavaScript实现,它比`node-sass`更快速、更现代化,并且与最新版本的DartSass兼容。在Vue项目中使用Sass,你应该安装sass包......
  • 使用Git拉取并运行vue项目
    从远程仓库中拉取vue项目。一、复制项目在远程仓库的代码地址,将它克隆到本地:gitclonehttp链接(项目代码地址)二、安装依赖1.进入项目所在的目录,将node_modules和package-lock.json2.选中当前路径,然后输入【cmd】,回车3.在命令提示符中依次输入一下代码:npmcacheclean-fo......
  • .net core 6.0后台 Vue2前台 导出Excel文件
    要导出这样一个Excel表格:1.后端API下载安装包:EPPlus2.后端代码点击查看代码///<summary>///接口///</summary>///<returns>结果</returns>[HttpGet]publicIActionResultExportTab(){varli......