【vue2】计算属性(computed)与侦听器(watch)详解

news2024/11/19 23:33:25

1d43f75f092a4050a8ce31e2d85f6868.gif

🥳博       主:初映CY的前说(前端领域)

🌞个人信条:想要变成得到,中间还有做到!

🤘本文核心:计算属性与侦听属性的用法

目录(文末有给大家准备好的Xmind思维导图

一、计算属性computed

①默认get()方法,仅是获取值

②不仅仅是获取值,还具有修改属性功能的写法

二、侦听器

①值类型

 ②引用类型 

总结:计算属性与侦听属性的区别


一、计算属性computed

概念:处理数据用来解决代码的冗余

用法:当数据需要通过计算才能得到比如我们求商品的总和与全选功能

计算属性语法:

①一定要在vue实例的对象computed中声明一个函数

②这个函数的返回值return就是计算属性的属性值

特殊的机制:缓存机制(提高性能)

(1)计算属性在第一次使用时,会执行一次函数体,之后就会将返回值缓存起来

(2)下一次使用计算属性的时候,不会执行这个函数,而是直接从缓存中读取

(3)只有当计算属性中的数据发生变化时,这个函数才会重新执行一次


写法:有两种

①默认get()方法,仅是获取值

语法格式:

computed:{
变量名(){
return this.//一大堆需要计算的数据比如翻转数组
}
}

看下面这个例子:(大家可以下直接cv到自己新的html中,我的vue引入是在线的)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 导包 -->
    <!-- <script src="./vue.js"></script> -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 

</head>

<body>
    <div id="app">
        <p></p>
        <!-- 翻转字符串 -->
        <p> {{ msg.split('').reverse().join('') }}</p>
        <p> {{revMsg}}</p>
        <p> {{revMsg}}</p>
    </div>
    `
    <script>
        let app = new Vue({
            el: '#app',
            data: {
                msg: '我爱敲代码',
            },
            computed:{
                revMsg(){
                    console.log(1);
                return this.msg.split('').reverse().join('') 
                }
            }
        
        })
    </script>
</body>
</html>

上述代码实现的效果见下图

 看这个例子,我们定义了一个 resMsg 属性计算方法,并通过将字符串分隔(split()方法)此时已经成为了数组 [ "我", "爱", "敲", "代", "码" ],再翻转下,用字符转拼接作return的返回值给resMsg属性,这样我们就可以配合我们的插值表达式进行解析变量了。

我们还发现了,这样写实现了我们想要的效果,减少了代码的冗余并且可以发现我们的resMsg调用不需要写()直接放进插值表达式就可被解析了。

我们也利用它的特殊机制了,只是调用了一次,之后的调用我们从缓存中获取到。


②不仅仅是获取值,还具有修改属性功能的写法

语法:

            computed: {
                变量名: {
                    get() {
                        return this.firstName + this.lastName
                    },
                    // set的形参是get的返回
                    set(val) {
                        console.log(val);
                    }
                }
            }

        1. 默认情况下,计算属性只有get方法。只能获取,不能修改。否则程序会报错

        2. 如果希望计算属性可以修改,则可以实现set方法

看下面这个例子:(大家可以下直接cv到自己新的html中,我的vue引入是在线的)

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 导包 -->
    <!-- <script src="./vue.js"></script> -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 

</head>
<body>
    <!-- HTML结构 -->
    <div id="app">
        全选<input type="checkbox" v-model="allCheck" >
        <ul>
            <li v-for="(item,index) in list">
                <!-- v-model双向绑定 当时单选框(表单元素无条件用v-model!)的时候这个就是选中状态-->
                <input type="checkbox"  v-model="item.select">{{item.name}} <label for=""></label>
            </li> 
        </ul>
    </div>

    <script>
        /* 
        1. 默认情况下,计算属性只有get方法。只能获取,不能修改。否则程序会报错
        2. 如果希望计算属性可以修改,则可以实现set方法
        */
        /* 创建vue实例 */
        var app = new Vue({
            //el:挂载点
            el: '#app',
            //data: 要渲染的数据
            data: {
                active:0,
                list: [
                    { name: '前端', select: false },
                    { name: 'UI', select: false },
                    { name: 'Java', select: false },
                    { name: 'php', select: false },
                    { name: 'python', select: false },
                    { name: 'c', select: false },
                    { name: '测试', select: false },
                    { name: '产品', select: false },
                ]
            },
            //计算属性
            computed: {
                allCheck:{
                    get(){
                    // every返回是布尔值,一假则假,全真为真
                    //some 返回的也是布尔值,当有一个元素符合条件的时候返回true
                    return this.list.every(item=>item.select)
                    },
                    set(val){
                        console.log(val);
                        this.list.forEach(element => {
                            element.select=val
                        });
                    }

                }
            }
        })
    </script>
</body>

</html>

下面是上述代码实现的效果图

核心代码:

实现上述例子的思路是:

 例子分析:这个例子难点在于怎么通过获取到各个单选框的数据与怎么与全选框进行绑定的。

  1. 看到表单项我们获取数据用v-model实现双向绑定。这样我们就可达到修改了之后就可以实时得到反馈
  2. 遍历我们的列表将list渲染出来
  3. 定义一个计算属性方法 allCheck(){} ,在get() 中开始用every()方法做判断(every方法用于遍历数组,当数组元素都是true的时候返回true,否则返回false)用于小选控制全选,当我全部选中的时候,return的值就是我们allCheck的属性值。
  4. 下面的set()用于全选控制小选(我们的allCheck是绑定在全选框上的),当我们做出改变修改的时候会触发allCheck的set()方法,当我选中全选框的时候,此时的allCheck是true,在set()中作为val的实参传进去了,因此列表每一项都是true选中状态了!!!


二、侦听器

概念:监听data中的某一个数据变化

写法:有两种

①值类型

            watch:{
                '要侦听的属性名'(newVal,oldVal){ }
            }

兄弟姐妹们,上个例子大家可以下直接cv到自己新的html中,我的vue引入是在线的)

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 导包 -->
    <script src="./vue.js"></script>

</head>

<body>

    <!-- HTML结构 -->
    <div id="app">
        用户: <input type="text" placeholder="请输入用户名" v-model="username"><span></span>
        <br>
        密码: <input type="text" placeholder="请输入密码" v-model="password">
    </div>

    <script>

        /* 创建vue实例 */
        let app = new Vue({
            //el:挂载点
            el: '#app',
            //data: 要渲染的数据
            data: {
                username: '',
                password: ''
            },
            methods: {
                fn() {
                    return setTimeout(() => { console.log("这是异步操作") }, 1000)
                }
            },
            //侦听器
            watch: {
                // 一个监听器检测检测一项东西,前面新的,后面之前数据
                username(newIfo, oldInfo) {
                    console.log('当前值为', `${newIfo}`, '之前值为', `${oldInfo}`);
                    if (newIfo === 'admin') {
                        console.log('当前用户名不可取,请输入其他用户名')
                        this.fn()
                    }
                }
            }
        })



    </script>
</body>

</html>

 核心代码:

我们运行下查看效果: 

可以看到,当我们username的时候,浏览器是检测到了我们输入的是admin就弹出了相应的提示('当前用户名不可取,请输入其他用户名),同时我们在值类型在写了一个fn()里面是个异步函数也可以被执行,因此侦听属性的值类型可以执行异步操作。

 ②引用类型 

watch:{
data属性(new,old){
deep:true//开启深度侦听
handler(){
//写需要处理的操作
}
}}
<!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>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="app">

        <input type="text" v-model="obj.name">
        <input type="text" v-model="obj.age">

    </div>
    <script>
        new Vue({
            el: "#app",
            data: {
                obj: {
                    name: "初映",
                    age: 22,
                    fn() {
                        return setTimeout(() => { console.log("这是异步操作") }, 1000)
                    }
                }
            },

            watch: {
                obj: {
                    deep: true,
                    immediate: false,//当页面加载完成马上调用一次,记录为新值,救值必须删除
                    handler(newVal, oldVal) {
                        console.log(`新的值为:` + newVal.name, `旧值为:` + oldVal.name);
                        this.obj.fn()
                    },
                }
            },
            methods: {}
        })
    </script>
</body>

</html>

核心代码:

 运行结果:

 可以看到我们的深度监听,侦听到了引用类型数值发生了改变,我们也是实时侦听到了数据,同时深度侦听也可以支持异步操作。


总结:计算属性与侦听属性的区别:

(1)功能不同,计算属性用于解决模板冗余问题。侦听器侦听data中某i一个数据变化

(2)计算属性具有缓存机制,侦听器没有缓存机制

(3)计算属性不支持异步操作,侦听器支持异步操作

(4)计算属性可以给vue新增属性,侦听器是 data中已有属性

(5)计算属性只要使用了就会执行一次,侦听器默认只有第一次改变才会执行


下面是给兄弟姐妹准备好的Xmind图总结:


各位,兄弟姐妹们,感谢你看到了这里!如对你有帮助请支持下博主,感谢!!!

下篇文章将讲解【组件基础】的用法,本专栏将持续更新~~~~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA单商户商城系统源码,前(vue)后(SpringBoot)端分离,支持多平台(h5,小程序,app)

前言 完整代码下载地址&#xff1a;JAVA单商户商城系统源码 linjiashop 是一个基于Spring Boot和Vue.js的web商城系统 linjiashop 包含了商城的后台管理系统,手机h5&#xff0c;小程序版本 linjiashop 采用web-flash作为底层基础框架搭建&#xff0c;开发过程遇到问题请多阅…

Js中闭包的概念和具体使用

前言闭包在js里面是一个比较抽象的概念,但在面试里,是一个必问的话题,往往面试官希望你列举一些使用闭包的例子或手写一个闭包闭包,简单一句话讲就是能够读取其他函数内部变量的函数,当需要函数内容部的变量被外部的代码所访问时那闭包就非常有用了的,如今,很多框架里面的高级特…

Spring整合Mybatis和Junit

文章目录1 Spring整合Mybatis环境搭建整合步骤使用的注解详解2 Spring整合Junit整合Junit步骤使用的注解详解1 Spring整合Mybatis 大体需要做两件事&#xff0c; 第一件事是:Spring要管理MyBatis中的SqlSessionFactory 第二件事是:Spring要管理Mapper接口的扫描 具体该如何实现…

6.Isaac教程--在 C++ 中开发 Codelet

在 C 中开发 Codelet 本教程的目标是用 C 开发两个小码&#xff1a;第一个实际上是一台“ping”的机器&#xff0c;而第二个侦听并摄取“ping”消息。 对于本教程&#xff0c;不需要外部依赖项或特殊硬件。 文章目录在 C 中开发 Codelet创建新应用程序为应用程序创建一个新目录…

【Linux】Linux的基本指令(一)

文章目录1、ls 指令2、pwd 命令3、cd 指令4、touch 指令5、mkdir 指令6、rmdir和rm 指令7、man 指令8、cp 指令9、mv 指令10、cat11、echo(输出&#xff0c;输入&#xff0c;追加重定向)12、wc13、more14、less1、ls 指令 语法&#xff1a; ls[选项][目录或文件] 功能&#xff…

2. 矩阵(matrix)、数组、列表(list)、数据框(data.frame.....)

课程视频链接&#xff1a;https://www.bilibili.com/video/BV19x411X7C6?p1 本笔记参照该视频&#xff0c;笔记顺序做了些调整【个人感觉逻辑顺畅】&#xff0c;并删掉一些不重要的内容 系列笔记目录【持续更新】&#xff1a;https://blog.csdn.net/weixin_42214698/category_…

电脑总是开机黑屏,开机两次才能成功的解决办法:更新BIOS(七彩虹H410M-T PRO)

参考&#xff1a;七彩虹主板更新BIOS的方法 前段时间电脑出问题了&#xff0c;每当我第一次开机都会黑屏&#xff0c;要强制关机第二次开能开机&#xff0c;导致每次都开机很久很久&#xff0c;心情也不好 有时候开机等他一会&#xff0c;大概两分钟&#xff0c;会报如下错误&a…

C++课程成绩管理与分析系统[2023-01-07]

C课程成绩管理与分析系统[2023-01-07] C实习指导书 编写&#xff1a;潘林 修订&#xff1a;邓吉秋 一、实习目的 学生通过此次实习&#xff0c; 应达到如下要求&#xff1a; 熟练使用一种 C开发环境&#xff0c;包括 IDE 与编译器&#xff1b;掌握 C程序的编写 过程与调试&…

Sentinel 是什么

Sentinel是什么 Sentinel 官网&#xff1a;introduction | Sentinel 随着微服务的流行&#xff0c;服务与服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征 丰富…

Rancher部署分布式任务调度系统XXL-JOB通过拉取Docker公共镜像方式

通过Rancher部署分布式任务调度系统XXL-JOB我了解到有两种方式&#xff0c;一种是拉取xxl-job的源代码打包通过Jenkins部署&#xff0c;另一种简单的是直接拉取官方镜像&#xff0c;本文主要讲后面这种。 1、打开Docker公共镜像仓库&#xff0c;搜索xxl-job&#xff0c;复制镜…

GNN笔记系列 3

GNN笔记系列 21.Graph1.1Directed Graphs1.2Symmetric Graphs1.3Unweighted Graphs2.Graph Shift Operators(GSO)2.1Degree Matrix2.2Laplacian Matrix2.3Graph Shift Operator SSS3.Graph Signals4.Graph Convolutional Filters5.Time convolutions and graph convolutions6.G…

itertools包介绍——可以不用 但不能不知道——python包推荐系列

背景1 今天在看一个开源包&#xff0c;发现他的requirements.txt里面放着more_itertools包。 这个包的名字还是挺有意思的&#xff0c;在itertools包前面加上了一个more。难道是python自带的包itertools的加强版&#xff1f; 后来查了一下&#xff0c;这个包&#xff0c;果然…

高并发系统设计的15个锦囊

记得很久之前&#xff0c;去面试过字节跳动。被三面的面试官问了一道场景设计题目&#xff1a;如何设计一个高并发系统。当时我回答得比较粗糙&#xff0c;最近回想起来&#xff0c;所以整理了设计高并发系统的15个锦囊&#xff0c;相信大家看完会有帮助的。 如何理解高并发系统…

【云原生 | 51】Docker三剑客之Docker Compose第二节

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

打卡第11天|力扣20. 有效的括号 、 1047. 删除字符串中的所有相邻重复项 、150. 逆波兰表达式求值 。

今天是打卡第十一天&#xff0c;题目主要是栈结构的运用20. 有效的括号题目链接如下&#xff1a;20. 有效的括号我们挨个遍历字符串&#xff0c;每有一个向左的字符串我们就往栈里面存一个向右的括号&#xff0c;遍历到向右的括号时&#xff0c;如果栈中类型相同就弹出&#xf…

在日本之后,中国也发布新型光刻机,ASML加快对中国出口光刻机

由于美国的影响&#xff0c;ASML对中国出售光刻机一直都在摇摆之中&#xff0c;不过2022年底至少有三家中国芯片企业获得ASML的光刻机&#xff0c;显示出ASML的态度再次发生变化&#xff0c;导致如此结果或许在于中国近期宣布的新型光刻机。一、开辟芯片制造新技术说到绕开ASML…

2022年9月CSP认证题解 如此编码(k进制),何以包邮?(背包问题),吉祥物投票(珂朵莉树、懒标记、并查集)

T1 如此编码 思路 由公式 和前缀乘积定义 得mb1a1b2⋅⋅⋅a1a2⋅⋅⋅an−1bnmb_1a_1\times b_2a_1\times a_2\times\times a_{n-1}\times b_nmb1​a1​b2​⋅⋅⋅a1​a2​⋅⋅⋅an−1​bn​&#xff0c; 上述公式可以提取公共乘项aia_iai​&#xff0c;写成m(bnbn−1⋅⋅⋅…

一文搞懂内存映射原理及使用方法

a. 内存映射原理内存映射即在进程的虚拟地址空间中创建一个映射&#xff0c;分为两种&#xff1a;文件映射&#xff1a;文件支持的内存映射&#xff0c;把文件的一个区间映射到进程的虚拟地址空间&#xff0c;数据源是存储设备上的文件。匿名映射&#xff1a;没有文件支持的内存…

2. 因子(factor)、缺失数据(na)、字符串、时间序列数据

课程视频链接&#xff1a;https://www.bilibili.com/video/BV19x411X7C6?p1 本笔记参照该视频&#xff0c;笔记顺序做了些调整【个人感觉逻辑顺畅】&#xff0c;并删掉一些不重要的内容 系列笔记目录【持续更新】&#xff1a;https://blog.csdn.net/weixin_42214698/category_…

字符的编码与乱码

目录 前言 1 计算机中字符的编码分类 1.1 常见非Unicode编码 1.1.1 ASCII 1.1.2 ISO 8859-1 1.1.3 Windows-1252 1.1.4 GB2312 1.1.5 GBK 1.1.6 GB18030 1.1.7 Big5 1.1.8 编码汇总 1.2、Unicode编码 1.2.1 UTF-32 1.2.2 UTF-16 1.2.3 UTF-8 1.2.4 Unicode编码…