Vue2 第四节 计算属性,监视属性

1.计算属性

2.监视属性

3.计算属性与监视属性之间的关系

一.计算属性

  1. 定义:要用的属性不存在,要通过已有属性计算得来
  2. 原理:底层借助了Object.defineproperty方法提供的getter和setter
  3. get函数什么时候会执行:初次读取的时候会执行一次; 当依赖的数据发生改变时会被再次调用
  4. 优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便
  5. 计算属性最终会出现在vm上,直接读取使用即可
  6. 如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时所依赖的数据发生改变
  7. 使用computed配置来实现,在模板中可以直接使用
    <div id="root">
            姓:<input type="text" v-model="firstName"><br><br>
            名:<input type="text" v-model="lastName"><br><br>
            全名:<span>{{fullName}}</span>
        </div>
       <script type="text/javascript">
        const vm = new Vue({
            el:'#root',
            data: {
                firstName:'张',
                lastName:'三'
            },
            computed: {
                fullName:{
                    get() {
                        return this.firstName + '-' + this.lastName
                    },
                    // 当fullName被修改时调用
                    set(value) {
                        const arr = value.split('-')
                        this.firstName = arr[0]
                        this.lastName = arr[1]
                    }
                }
            }
        })
  8.  修改输入框中的内容时,下面的计算属性也会跟着变化

    9. 如果只考虑读取,不考虑修改的话,可以简写为以下形式 

   <script type="text/javascript">
    const vm = new Vue({
        el:'#root',
        data: {
            firstName:'张',
            lastName:'三'
        },
        computed: {
            // 完整写法
            // fullName:{
            //     get() {
            //         return this.firstName + '-' + this.lastName
            //     },
            //     set(value) {
            //         const arr = value.split('-')
            //         this.firstName = arr[0]
            //         this.lastName = arr[1]
            //     }
            // }
            // 简写形式:只考虑读取,不考虑修改的时候才能使用
            fullName() {
                return this.firstName + '-' + this.lastName
            }
        }
    })
   </script>

 二. 监视属性

(1)概念:监视属性是监视data的属性变化,也可以用于监视计算属性

(2)监视属性传的是一个配置对象,监视谁,在watch里面就写谁

 (3)监视的属性中必须包含一个handler函数,handler函数有两个参数,分别代表修改前和修改后的值,当监视的属性发生变化时,回调函数自动调用,进行相关操作

(4)也可以对commputed中的属性进行监视

        const vm = new Vue({
            el: '#root',
            data: {
                isHot: true
            },
            computed: {
                info () {
                    return this.isHot ? '炎热' : '凉爽'
                }
            },
            methods: {
                changeWeather () {
                    this.isHot = !this.isHot
                }
            },
            watch: {
                info: {
                    handler (newValue, oldValue) {
                        console.log('isHot被修改了')
                        console.log(newValue, oldValue)
                    }
                }
            }
        })

(5) immediate属性设置为true就是初始化的时候让handler调一下

 (6)监视属性的另外一种写法:通过调用vm.$watch函数实现监视,第一个参数是'isHot', 第二个参数传入的是一个对象,与在vm中声明watch配置项中的对象是一样的

        vm.$watch('isHot', {
            immediate: true,
            // 什么时候调用handler 当isHot被修改的时候
            handler (newValue, oldValue) {
                console.log('isHot被修改了')
                console.log(newValue, oldValue)
            }
        })

(7)深度监视

  • Vue中的watch默认不监视对象内部值得改变,只监视一层
  • 通过配置deep:true 可以检测对象内部值的改变,实现深度监视(多层监视)
  • Vue自身可以检测对象内部值得改变,但是Vue提供的watch默认不可以
  • 使用watch时,根据数据的具体结构,决定是否采用深度监视
  • 如果不加deep:true的话,handler里面的逻辑是不会执行的
    <div id="root">
        <h3>a的值是{{numbers.a}}</h3>
        <button @click="numbers.a++">点我让a+1</button>
        <hr>
        <h3>b的值是{{numbers.b}}</h3>
        <button @click="numbers.b++">点我让b+1</button>
    </div>
    <script type="text/javascript">
        const vm = new Vue({
            el: '#root',
            data: {
                isHot: true,
                numbers: {
                    a: 1,
                    b: 1
                }
            },
            watch: {
                // 监视多级结构中某个属性的变化
                numbers: {
                    // 开启深度监视
                    deep: true,
                    handler () {
                        console.log('number改变了')
                    }
                }
            }
        })
    </script>

(8)如果配置项中只需要handler的时候就可以简写

            watch: {
                // 简写: 配置项中只需要handler的时候就可以简写
                isHot (newValue, oldValue) {
                    console.log('isHot被修改了', newValue, oldValue)
                }
            }


           // vm的写法  简写:只有handler
            vm.$watch('isHot', function (newValue, oldValue) {
                console.log('isHot被修改了', newValue, oldValue)
            })

三.监视属性和计算属性之间的关系

(1)计算属性computed能完成的功能,watch也能实现

(2)watch能实现的,computed不一定能实现,watch可以进行异步操作, computed靠的是返回值,没有办法实现异步任务, watch里面是直接通过手动修改

(3)两个小原则

  • 所有Vue管理的函数,最好写成普通函数,这样this的指向才是vm或者组件实例对象
  • 所有不被Vue管理的函数(定时器的回调,ajax的回调函数, promise的回调函数),最好写成箭头函数,这样this的指向才是vm或者组件实例对象
    const vm = new Vue({
        el:'#root',
        data: {
            firstName:'张',
            lastName:'三',
            fullName:'张-三'
        },
        // 能开启异步任务
        watch: {
            firstName(val) {
                setTimeout(()=> {
                    this.fullName = val + '-' + this.lastName
                }, 1000)
            },
            lastName(val) {
                this.fullName = this.firstName + '-' + val
            }
        }
    })

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法训练营】Fibonacci数列+合法括号序列判断+两种排序方法

7.29 Fibonacci数列题目解析代码 合法括号序列判断题目题解代码 两种排序方法题目&#xff1a;题解代码 Fibonacci数列 题目 题目链接: 点击跳转 解析 【题目解析】&#xff1a; 本题是对于Fibonacci数列的一个考察&#xff0c;Fibonacci数列的性质是第一项和第二项都为1&am…

AR开发平台 | 探索AR技术在建筑设计中的创新应用与挑战

随着AR技术的不断发展和普及&#xff0c;越来越多的建筑师开始探索AR技术在建筑设计中的应用。AR(增强现实)技术可以通过将虚拟信息叠加到现实场景中&#xff0c;为设计师提供更加直观、真实的建筑可视化效果&#xff0c;同时也可以为用户带来更加沉浸式的体验。 AR开发平台广…

【计算机网络】传输层协议 -- UDP协议

文章目录 1. 传输层相关知识1.1 端口号1.2 端口号范围划分1.3 知名端口号1.4 一些相关命令 2. UDP协议2.1 UDP协议格式2.2 UDP协议的特点2.3 什么是面向数据报2.4 UDP的缓冲区2.5 UDP使用注意事项2.6 基于UDP的应用层协议 1. 传输层相关知识 传输层是计算机网络中的一个重要层…

【项目6 UI Demo】前端代码记录

前端代码记录 1.GridListItem中的布局 在这个Item中的布局采用的是VBox和HBox相结合的方式。相关的代码如下&#xff1a; <VBox class"sapUiTinyMargin"><HBox justifyContent"SpaceBetween"><Titletext"{ToolNumber}"wrapping…

三、Web安全相关知识

请勿用于非法用途 文章目录 一、Web源码框架二、目录结构1、静态资源2、WEB-INF&#xff08;1&#xff09;classes&#xff08;2&#xff09;lib&#xff08;3&#xff09;web.xml 二、web脚本语言1、脚本种类&#xff08;1&#xff09;ASP&#xff08;2&#xff09;ASP.NET&am…

【UniApp开发小程序】悬浮按钮+出售闲置商品+商品分类选择【基于若依管理系统开发】

文章目录 界面效果界面实现悬浮按钮实现商品分类选择界面使元素均匀分布 闲置商品描述信息填写界面价格校验 界面效果 【悬浮按钮】 【闲置商品描述信息填写界面】 【商品分类选择界面】 【分类选择完成】 界面实现 悬浮按钮实现 悬浮按钮漂浮于页面之上&#xff0c;等页面…

上门小程序开发|上门服务小程序|上门家政小程序开发

随着移动互联网的普及和发展&#xff0c;上门服务成为了许多人生活中的一部分。上门小程序是一种基于小程序平台的应用程序&#xff0c;它提供了上门服务的在线平台&#xff0c;为用户提供了便捷的上门服务体验。下面将介绍一些适合开发上门小程序的商家。   家政服务商家&am…

Mybatis初识(一)

一.Mybatis是什么 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义SQL、存储过程以及高级映射。MyBatis 去除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的XML或注解来配置,和映射原始类型、接口和Java POJO (Plain Old Java Objects…

动态线程池问题的解决

项目中需要将线程池也监控管理起来。 于是决定引入了hippo4j&#xff0c;这个引入很简单&#xff0c;官方的例子也很简单&#xff0c;拿过来直接跑。 出现问题了&#xff0c;用的和例子一模一样的&#xff0c;也没什么错&#xff0c;但是就是在服务器的管理控制台上没有找到动态…

Godot 4 插件 - Utility AI 研究

今天看到一个视频教学 Godot4 | 实现简单AI | Utility AI 插件_哔哩哔哩_bilibili 就看了一下。吸引我的不是插件&#xff0c;是AI这两个字母。这AI与Godot怎么结合&#xff1f;感觉还是离线使用&#xff0c;值得一看。 视频时间不长&#xff0c;15分钟左右&#xff0c;看得…

C#——多线程之Task

C#——多线程之Task 前言一、Task是什么&#xff1f;二、各应用场景以及实例分析1.异步执行代码2.等待异步操作完成3.并行执行多个任务4.处理异常5.取消异步操作 三、一些其他问题1.WhenAll与WhenAny的区别 总结 前言 在代码编写过程中&#xff0c;经常会用到多线程的知识&…

初步了解C++模板

一、函数模板 如果我们要写一个交换两个变量值的函数Swap&#xff0c;那么我们得对每一种类型都写一个&#xff0c;以便适用不同类型的参数&#xff0c;但是有了模板之后&#xff0c;可以简化操作 template<class T> void Swap(T& x, T& y) {T tmp x;x y;y …

第J2周:ResNet50V2算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营-第J2周&#xff1a;ResNet50V2算法实战与解析&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 目录 一、论文解读1. ResNetV2结构与…

Linux下查找python路径

本地目前装了几个版本的python&#xff0c;这里记录下查找python路径的方法。 1&#xff1a;whereis命令 whereis python2&#xff1a;which命令 which python与whereis相似&#xff0c;但which会返回第一个找到的执行文件的位置。 3&#xff1a;find命令 find命令可以搜索系…

CenOS设置启动级别

背景知识 init一共分为7个级别&#xff0c;这7个级别的所代表的含义如下 0&#xff1a;停机或者关机&#xff08;千万不能将initdefault设置为0&#xff09;1&#xff1a;单用户模式&#xff0c;只root用户进行维护2&#xff1a;多用户模式&#xff0c;不能使用NFS(Net File S…

【Docker】Docker相关基础命令

目录 一、Docker服务相关命令 1、启动docker服务 2、停止docker服务 3、重启docker服务 4、查看docker服务状态 5、开机自启动docker服务 二、Images镜像相关命令 1、查看镜像 2、拉取镜像 3、搜索镜像 4、删除镜像 三、Container容器相关命令 1、创建容器 2、查…

【C++】开源:Linux端ALSA音频处理库

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Linux端ALSA音频处理库。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c…

Windows数据类型LPSTR学习

Windows在C语言的基础之上又定义了一些Windows下的数据类型&#xff1b;下面学习一下LPSTR&#xff1b; LPSTR和LPWSTR是Win32和VC所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的32位ANSI字符数组指针&#xff0c;而LPWSTR是一个指向以NULL结尾的64…

代码版本管理工具 git

1. 去B站看视频学习&#xff0c;只看前39集&#xff1a; 01-Git概述&#xff08;Git历史&#xff09;_哔哩哔哩_bilibili 2.学习Linux系统文本编辑器的使用 vi编辑器操作指令分享 (baidu.com) (13条消息) nano编辑器的使用_SudekiMing的博客-CSDN博客 windows下载安装Git官…

电路原理分析1

d2的作用是提供一个1.25v的电平 r3、r4的作用都是限流 c1是滤波 运放的4、8脚是常规的外围 这个运放是一个运算放大电路 具体计算是这样的&#xff1a; 按照虚短原则&#xff0c;输入的信号Uinu1,输出的信号Uoutu3 按照虚断原则&#xff0c;i1i2i5i5 u1/r2i1i5&#xff…