Vue 计算属性和监听器

news/2024/11/8 23:12:36 标签: vue.js, 前端, javascript

文章目录

  • 一、计算属性
    • 1. 计算属性定义
    • 2. computed 比较 methods
    • 3. 计算属性完整写法
  • 二、监听器
    • 1. 普通监听
    • 2. 添加额外配置项

一、计算属性

1. 计算属性定义

概念:基于现有的数据,计算出来的新属性,依赖的数据变化,自动重新计算。

计算属性需在 computed 中进行声明,computed 与 data 同级,一个计算属性对应一个函数,我们将计算结果直接返回,外部使用计算属性的时候,把它当做普通属性使用就可以,直接写函数名来使用,不要写括号!

<div id = "app">
        <p>{{totalCount}}</p>
    </div>
    
    <script src="vue.js"></script>
    <script>javascript">
        //一旦引入VueJS核心包,在全局环境,就有了Vue构造函数
        const app = new Vue({
            el: '#app',
            data: {
                list: [
                    {id: 1, num: 1},
                    {id: 2, num: 7},
                    {id: 3, num: 3}
                ]
            },
            computed: {
                totalCount() {
                    let total = this.list.reduce((sum, item) => sum + item.num, 0)
                    return total
                }
            }
        })
    </script>

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值,此处的 0 代表起始的 sum 值为 0!

2. computed 比较 methods

① computed 计算属性

作用:封装了一段对于数据的处理,求得一个结果。
语法:作为属性直接使用,this.计算属性,{{ 计算属性 }}

② methods 方法

作用:给实例提供一个方法,调用以处理业务逻辑。
语法:作为方法需要调用,this.方法名(),{{ 方法名() }},@事件名=“方法名”。

methods 也可以用来处理数据,但是 computed 给我们提供了很好的缓存特性,计算属性会对计算出来的结果进行缓存,再次使用会直接读取缓存,依赖项变化了,会自动重新计算并再次缓存,所以如果要处理数据,我们还是优先选择 computed,可以提升性能。

3. 计算属性完整写法

计算属性默认的简写,只能读取访问,不能修改,如果要修改,就需要写计算属性完整的写法。

在这里插入图片描述

① 计算属性被查询时,执行 get 方法,有缓存,会将返回值作为求值的结果;
② 计算属性被修改时,执行 set 方法,需要修改的值会自动传递给 set 方法的形参。

二、监听器

作用:监视数据变化,执行一些业务逻辑或异步操作。
语法在这里插入图片描述

监听方法会在数据变化时,触发执行,我们一般只用新值 newValue 就可以了!

1. 普通监听

在这里插入图片描述

我们现在有一个问题就是,words 每输入一个字母,watch 都会监听一次并做出反应,其实一个完整的 words 并没有输入完,没必要时刻监听每一个字母的变化,这会导致服务器的压力很大。
解决办法是,增加防抖措施,先等一等,延迟一会再执行,如果一段时间内用户没有再输入,这时候再去执行。

<script>
        //一旦引入VueJS核心包,在全局环境,就有了Vue构造函数
        const app = new Vue({
            el: '#app',
            data: {
                timer: '',
                obj: {
                    words: ''
                }
            },
            watch: {
                //防抖,延迟执行
                'obj.words' (newValue) {
                    clearTimeout(this.timer)
                    this.timer = setTimeout(() => {
                        console.log('变化了', newValue)
                    }, 500)
                }
            }
        })
    </script>

在这里插入图片描述

定义 setTimeout,让打印操作延迟 500 ms 再执行,如果超出 500 ms 用户还没有操作,就直接执行 console.log('变化了', newValue),setTimeout 返回的结果是延时器的 id,我们这里用 timer 接收,如果用户在 500 ms 内再次输入了数据,那么就根据 timer 把前面的延时器清空掉,重新开始计时,只要用户在不停地输入,那么我们后台的代码就一直延时执行,减少不必要的中间数据,极大提高效率。

其实这里的 timer 不需要在 data 里面定义,跟页面渲染无关的数据,直接使用 this.数据,即可绑定!

2. 添加额外配置项

deep:true,对复杂类型深度监视,可以同时监控多个数据,这些数据以对象的形式封装在 data 中,watch 中内置具体的处理方法,方法名必须为 handler,value 为发生变动后的对象。
immediate:true,初始化立刻执行一次 handler 方法,无需触发监听事件就可以执行一次。

在这里插入图片描述


http://www.niftyadmin.cn/n/5744537.html

相关文章

(十二)JavaWeb后端开发——MySQL数据库

目录 1.数据库概述 2.MyQSL 3.数据库设计 DDL 4.MySQL常见数据类型 5.DML 1.数据库概述 数据库&#xff1a;DataBase(DB)&#xff0c;是存储和管理数据的仓库 数据库管理系统&#xff1a;DataBase ManagementSystem(DBMS)&#xff0c;操纵和管理数据库的大型软件 SQL&a…

SSH实验5密钥登录Linuxroot用户(免密登录)

当用户尝试通过SSH连接到远程服务器时&#xff0c;客户端会生成一对密钥&#xff1a;公钥和私钥。公钥被发送到远程服务器&#xff0c;并存储在服务器的~/.ssh/authorized_keys文件中。而私钥则由客户端保管&#xff0c;不会传输给服务器。 在连接过程中&#xff0c;客户端使用…

案例解读 | 某大型家居企业综合运维监控平台建设实践

01.客户简介 案例客户是一家在A股上市的大型家居企业&#xff0c;专注于客餐厅、卧室及全屋定制家居产品的研究、开发、生产和销售&#xff0c;旗下拥有多个系列自有品牌&#xff0c;并与美国、意大利家居品牌开展战略合作&#xff0c;业务覆盖全球120余个国家和地区&#xff…

中肿团队提出的“免疫三明治”(放疗+化疗+免疫治疗),成功登上柳叶刀肿瘤|顶刊精析·24-11-08

小罗碎碎念 该研究首次发现在同期放化疗基础上增加特瑞普利单抗&#xff08;PD-1抗体&#xff09;新辅助和辅助治疗显著提高了高危局部晚期鼻咽癌患者生存率。 如果大家看完这篇推送以后&#xff0c;有什么好的医工交叉点子&#xff0c;欢迎和我一起探讨&#xff01;&#xff0…

【YOLO学习】YOLOv10配置

文章目录 1. 环境配置步骤2. 国内镜像源3. 安装pytorch 1. 环境配置步骤 1. YOLOv10官网&#xff1a;https://github.com/THU-MIG/yolov10 2. 创建环境&#xff1a; conda create -n yolov10 python3.9 conda activate yolov10 pip install -r requirements.txt pip install -…

java: 无法访问org.springframework.web.bind.annotation.RequestMapping

一、报错问题 java: 无法访问org.springframework.web.bind.annotation.RequestMapping 二、原因分析 SpringBoot使用了3.0或者3.0以上&#xff0c;因为Spring官方发布从Spring6以及SprinBoot3.0开始最低支持JDK17。所以仅需要将SpringBoot版本降低为3.0以下即可&#xff08;或…

【面试全纪实 | Linux 08 网络通讯命令类】请回答,你真的了解Linux吗?

&#x1f5fa;️博客地图 &#x1f4cd;1. ifconfig 命令 &#x1f4cd;2. iptables 命令 &#x1f4cd;3. netstat 命令 &#x1f4cd;4. ping 命令 &#x1f4cd;5. telnet 命令 1. ifconfig 命令 ifconfig 用于查看和配置 Linux 系统的网络接口。 查看所有网络接口…

php 如何将数组转成对象数组

1. 使用 (object) 操作符&#xff1a; “php $array [‘name’ > ‘John’, ‘age’ > 25]; $object (object) $array; // 访问对象属性 echo $object->name; // 输出: John echo $object->age; // 输出: 25 “ 2. 使用 (stdClass)&#xff1a; “php $array …