首页 > 其他分享 >vue(vue.js) 监视属性与深度监视

vue(vue.js) 监视属性与深度监视

时间:2024-06-20 09:14:28浏览次数:23  
标签:vue js hot handler oldValue 监视 newValue 属性

原文链接:vue(vue.js) 监视属性与深度监视 – 每天进步一点点 (longkui.site)

 

1.监视属性

监视属性:监视某个属性的变化

小案例:

<!DOCTYPE html> <html lang="en"> <body>   <div id="root"> <h2>今天天气很{{hot?'热':'冷'}}</h2> <button @click="changeWeather">切换天气</button> </div> <script type="text/javascript"> new Vue({ el:'#root', data:{ hot:true, //布尔值 }, methods:{ changeWeather(){ this.hot=!this.hot } } }) </script> </body> </html>

如果我们把其中的一行代码改成

      <h2>今天天气很一般</h2>

这个时候我们去点击按钮,页面上的数据不会改变,但是data里面的hot已经改变了,这有什么问题呢,其实这是个小坑,因为vue觉得你这个值没有在页面上展示,所以没有必要体现出来,如果你后面要用到这个值就会出现问题。

(PS:最新版已经修复了这个问题,如果你还是用 旧版本需要注意这个问题)

监视属性的由来?

可以看出我们需要的就是某个值改变了然后通知我们即可,这个 时候就用到了 监视属性watch了

简单写法如下:

 //监视属性
            watch: {
                //需要监视的值
                hot: {
                    //handler什么时候调用?当hot发生改变时调用
                    handler() {
                        console.log("hot值被修改了")
                    }
                }

            }

其中handler里面有两个参数,一个是新的值newValue,一个是旧的值oldValue。整体代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue测试</title>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>今天天气很{{hot?'热':'冷'}}</h2>
        <button @click="changeWeather">切换天气</button>
    </div>

    <script type="text/javascript">
        new Vue({
            el: '#root',
            data: {
                hot: true,  //布尔值
            },

            methods: {
                changeWeather() {
                    this.hot = !this.hot
                }
            },
            //监视属性
            watch: {
                //需要监视的值
                hot: {
                    //handler什么时候调用?当hot发生改变时调用
                    handler(newValue,oldValue) {
                        console.log("hot值被修改了",newValue,oldValue)
                    }
                }

            }

        })
    </script>
</body>

</html>

监视属性除了可以监视data里面的值还可以监视计算属性里面的值。我们还可以有下面这种写法:

 const vm=  new Vue({
            el: '#root',
            data: {
                hot: true,  //布尔值
            },

            methods: {
                changeWeather() {
                    this.hot = !this.hot
                }
            },
            // //监视属性
            // watch: {
            //     //需要监视的值
            //     hot: {
            //         //handler什么时候调用?当hot发生改变时调用
            //         handler(newValue,oldValue) {
            //             console.log("hot值被修改了",newValue,oldValue)
            //         }
            //     }

            // }

        })
    
        //第二种写法
        vm.$watch('hot',{
              //handler什么时候调用?当hot发生改变时调用
              handler(newValue,oldValue) {
                        console.log("hot值被修改了",newValue,oldValue)
                    }
        })
2.深度监视

首先说一下 监视多个结构中某个属性的变化

student:{
   name:11,
   age:12
}

需求:检测student中的name的变化,而不是监视student的变化

那么我们上面是监视属性就应该参考下面这种写法:

 watch: {
                //需要监视的值
                hot: {
                    //handler什么时候调用?当hot发生改变时调用
                    handler(newValue,oldValue) {
                        console.log("hot值被修改了",newValue,oldValue)
                    }
                },
                'student.name':{
                    handler(){
                        console.log("name改变了")
                    }
                }

可以看到,我们的写法加上了单引号,这样就可以监视到student中的name的变化了。

假设student中,有很多个类似name的存在,我们如果要监视的这些属性,难道还要单独写很多个这样的监视属性的吗?vue早就给我们想好了,解决这个问题的办法就是深度监视

写法就是在监视属性中加入 deep:true,这样就开启深度监视了,这样就可以监视多级结构中所有属性的变化了。

写法如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue测试</title>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>今天天气很{{hot?'热':'冷'}}</h2>
        <button @click="changeWeather">切换天气</button>

        <h3>name的值是:{{student.name}}</h3>
        <button @click="student.name++"> 点我改变name</button>

        <h3>age{{student.age}}</h3>
        <button @click="student.age++"> 点我改变age</button>
    </div>

    <script type="text/javascript">
        new Vue({
            el: '#root',
            data: {
                hot: true,  //布尔值
                student:{
                    name:11,
                    age:12,
                }
            },

            methods: {
                changeWeather() {
                    this.hot = !this.hot
                }
            },
            //监视属性
            watch: {
                //需要监视的值
                hot: {
                    //handler什么时候调用?当hot发生改变时调用
                    handler(newValue,oldValue) {
                        console.log("hot值被修改了",newValue,oldValue)
                    }
                },
                student:{
                    deep:true,
                    handler(){
                        console.log("student改变了")
                        console.log(this.student)
                    }
                }
            }
        })
    </script>
</body>

</html>
3.监视属性的简写形式

简写的前提是你不需要 immediate和deep和其他的配置项,也就是你的配置项里面只有handler形式时就可以开启简写形式。

形式:

 watch: {
                hot(newValue,oldValue){
                    console.log("hot值被修改了",newValue,oldValue)
                }
            }

把监视属性写成函数形式即可。

标签:vue,js,hot,handler,oldValue,监视,newValue,属性
From: https://www.cnblogs.com/longkui-site/p/18257989

相关文章

  • Vue3 状态管理 - Pinia,超详细讲解!
    前言:哈喽,大家好,我是前端菜鸟的自我修养!今天给大家分享【Vue3状态管理-Pinia】,超详细讲解!并提供具体代码帮助大家深入理解,彻底掌握!原创不易,如果能帮助到带大家,欢迎收藏+关注哦......
  • Nodejs基本概念
     Node.js基本概念前言Node.js是一个基于ChromeV8引擎的JavaScript运行环境,主要用于构建服务器端应用。由于其高效的事件驱动和非阻塞I/O模型,Node.js在处理高并发和实时应用方面具有显著优势。本篇文章将介绍Node.js的基本概念,帮助初学者快速上手。1.什么是No......
  • 基于Java+Vue前后端分离在线考试系统(源码+LW+PPT+部署教程)
    博主介绍:✌全网粉丝10W+平台特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于毕业项目实战✌一、作品包含源码+数据库+设计文档LW+PPT+全套环境和工具资源+部署教程二、项目技术前端技术:Ht......
  • 7个简单棘手的JS问题
    文章目录7个简单但棘手的JavaScript面试问题1.意外全局变量QuestionAnswer2.数组的length属性QuestionAnswer3.鹰眼测试Question4.自动分号插入QuestionAnswer5.经典问题:棘手的闭包QuestionAnswer**Phase1****Phase2**6.浮点数计算QuestionAnswer7.变量提升Que......
  • js 在vscode中让自己的api获得类型提示,成员补全的能力
    我的项目不是正经的js项目,它经常需要单个文件打开,并且调用接口来自另一种语言实现创建API.d.ts文件为接口自动生成类型标记文件,格式如下这里的类型来自另一门语言自动生成,不是js的类型,但我觉得无所谓吧declarenamespaceAPI{ /** *成员的注释 */constAge:String......
  • SEETF-2023 express-javascript-security ejs相关漏洞
    今天做个ejs相关题目。进入页面只发现一个输入框,题目标签是ejs相关,去github看看源码,发现ejs版本为3.1.9,可以确定地是rce漏洞。接下来说说这个rce漏洞。3.1.9版本的rce漏洞主要是因为使用了这个模板来构建网页逻辑导致的。点击查看代码//index.jsconstexpress=require('e......
  • vue3的computed计算属性返回值注解
    //语法结构:computed<返回值的类型>()列子//定义数据constcuont=ref(0)typeItem={id:stringname:stringprice:number}constlist=ref<Item[]>([{id:'1001',name:'男鞋',price:888},{id:'1002',name:'女鞋......
  • vue3的defineProps接收类型注解
    //这是没有用ts语法接收的props参数defineProps({color:String,size:{type:String,required:false,default:'middle'},})//TS语法//格式:withDefaults(defineProps<类型>(),{默认值名:默认值})第一种写法:withDefa......
  • 基于SpringBoot+Vue+uniapp的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue+uniapp的校园二手交易平台的详细设计和实现(源码+lw+部署文档+讲
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......