Vue 官方文档2.x教程学习笔记 1 基础 1.5 计算属性和侦听器 1.5.1 计算属性

news2024/11/13 14:58:11

Vue 官方文档2.x教程学习笔记

文章目录

      • Vue 官方文档2.x教程学习笔记
      • 1 基础
        • 1.5 计算属性和侦听器
          • 1.5.1 计算属性

1 基础

1.5 计算属性和侦听器

1.5.1 计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。

在模板中放入太多的逻辑会让模板过重且难以维护。

例如:

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

在这个地方,模板不再是简单的声明式逻辑。

你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中的多处包含此翻转字符串时,就会更加难以处理。

所以,对于任何复杂逻辑,都应当使用计算属性

【基础栗子】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="example">
    <p>Original message: "{{ message }}"</p>
    <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>

<script src="../js/vue.js"></script>
<script>
    var vm = new Vue({

        el: '#example',
        data: {
            message: 'Hello'
        },
        computed: {
            //计算属性的getter
            reversedMessage: function (){
                return this.message.split('').reverse().join('')
            }
        }

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

浏览器效果

在这里插入图片描述

这里我们声明了一个计算属性 reversedMessage

我们提供的函数将用作 property vm.reversedMessage 的 getter 函数:

在这里插入图片描述

vm.reversedMessage 的值始终取决于 vm.message 的值。

你可以像绑定普通 property 一样在模板中绑定计算属性。Vue 知道 vm.reversedMessage 依赖于 vm.message,因此当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新。

而且最妙的是我们已经以声明的方式创建了这种依赖关系:计算属性的 getter 函数是没有副作用 (side effect) 的,这使它更易于测试和理解。

【计算属性缓存 vs 方法】

上面的栗子,可以在表达式中调用方法来达到同样的效果:

在这里插入图片描述

浏览器效果

这里必须将计算属性注掉或者删掉,不然会出现已经存在的同名错误。

在这里插入图片描述

将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。

然而,不同的是计算属性是基于它们的响应式依赖进行缓存的

只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。

这就意味着下面的计算属性不会进行更新,因为 Date.now() 不是响应式依赖

computed: {
  now: function () {
    return Date.now()
  }
}

相比之下,每当触发重新渲染时,调用方法将总会再次执行函数。

【为什么需要缓存】

假设我们有一个性能开销比较大的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。

然后我们可能有其他的计算属性依赖于 A

如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用方法来替代。

【计算属性 vs 侦听属性】

Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性

当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch——特别是如果你之前使用过 AngularJS。

然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。细想一下这个例子:

<div id="demo">
    {{fullName}}
</div>

<script src="../js/vue.js"></script>
<script>

    var vm = new Vue({
        el: '#demo',
        data: {
            fistName: 'Foo',
            lastName: 'Bar',
            fullName: 'Foo Bar'
        },
        watch: {
            fistName: function (val){
                this.fullName = val + ' ' + this.lastName
            },
            lastName: function (val){
                this.fullName = this.fistName + ' ' + val
            }
        }
    })

在这里插入图片描述

可以看到,侦听属性确实可以实现属性值变化时,进行跟随的变动。

但是和计算属性相比

<div id="demo">
    {{fullName}}
</div>

<script src="../js/vue.js"></script>
<script>

    var vm = new Vue({
        el: '#demo',
        data: {
            fistName: 'Foo',
            lastName: 'Bar',
            // fullName: 'Foo Bar'
        },
        computed:{
            fullName: function (){
                return this.fistName + ' ' + this.lastName 
            }
        }

在这里插入图片描述

很明显,计算属性“获胜”。

【计算属性的setter】

计算属性默认只有 getter,不过在需要时你也可以提供一个 setter:

var vm = new Vue({
    el: '#demo',
    data: {
        fistName: 'Foo',
        lastName: 'Bar',
        // fullName: 'Foo Bar'
    },
    computed:{
        fullName: {
            //getter
            get: function (){
                return this.fistName + ' ' + this.lastName
            },

            //setter
            set: function (newValue){
                var names = newValue.split(' ')
                this.fistName = names[0]
                this.lastName = names[names.length - 1]
            }
        }
    }

现在再运行 vm.fullName = 'John Doe' 时,setter 会被调用,vm.firstNamevm.lastName 也会相应地被更新。

在这里插入图片描述

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

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

相关文章

【Linux内核】Linux内核介绍

Linux学习内核思路 学习过程&#xff1a; Linux内核引导及如何初始化进程管理、内存管理 内核引导及过程&#xff1a;CPU通电后&#xff0c;首先执行引导程序&#xff0c;引导程序把内核加载到**内存&#xff0c;**然后执行内核&#xff0c;内核初始化完成后&#xff0c;启动…

[附源码]计算机毕业设计二次元信息分享平台的设计及实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

年产2万吨山楂酒工厂的设计-陈酿工段及车间的设计(lunwen+任务书+cad图纸)

目录 摘 要 I Abstract II 1前 言 1 1.1设计背景及目的 1 1.1.1山楂酒的介绍及功效 1 1.1.2目标人群 1 1.1.3发展前景 2 1.2设计依据 2 1.3设计内容 2 1.4原材料的选择 3 第二章 山楂酒生产工艺设计 5 2.1工艺流程 5 2.2 操作要点 5 2.2.1 原料选择 5 2.2.2清洗&#xff1a; 5 …

机器学习:详细推导高斯混合聚类(GMM)原理(附Python实现)

目录0 写在前面1 高斯概率密度2 混合高斯分布3 GMM算法3.1 定义3.2 参数估计4 Python实现4.1 算法流程4.2 E步4.3 M步4.4 可视化0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“…

用 NEON 实现高效的 FIR 滤波器

系列文章目录 数字信号处理中的 SIMDNeon intrinsics 简明教程 文章目录系列文章目录写在前面前言FIR 滤波器优化方案何时应该使用时域的滤波器&#xff1f;如何加快FIR滤波器的实现速度&#xff1f;初步假设有限长度信号反转的滤波器系数实际的卷积公式卷积过程可视化线性卷积…

第二期 微信云开发之位置信息获取(wx.getLocation)

很多小伙伴在开发微信小程序的时候&#xff0c;需要获取当前用户位置信息时&#xff0c;都会遇到该如何获取位置详细信息的问题&#xff0c;以下是我的处理方法。 首先&#xff0c;我在生活智打卡小程序使用的是微信小程序自带的获取用户的位置信息的接口&#xff08;wx.getLoc…

基于JSP技术的猎头公司管理软件的设计和实现——内部事务部分(源代码+论文)

分类号&#xff1a;TP315 U D C&#xff1a;D10621-408-(2007)5978-0 密 级&#xff1a;公 开 编 号&#xff1a;2003031227 成都信息工程学院 学位论文 基于JSP技术的猎头公司管理软件的设计和实现 ——内部事务部分 基于JSP技术的猎头公司管理软件的设计和实现 ——内…

世界杯太精彩了,带大家用Python做个足球游戏,边玩游戏边看比赛

文章目录 Python零基础快速制作足球游戏&#xff08;附源代码&#xff09; 前言 一、Python环境说明 二、游戏程序说明 1、游戏开始界面 2、人物移动规则说明&#xff0c;可支持两位玩家 3、足球规则 4、主方法调取 三、游戏运行效果与比赛结果 1、游戏开始界面 2、…

桥接设计模式

一、桥接模式 1、定义 桥接模式&#xff08;Bridge Pattern&#xff09;又称作桥梁模式&#xff0c;指将抽象部分与具体实现部分分离&#xff0c;使它们都可以独立地变化&#xff0c;属于结构型设计模式。 桥接模式的主要目的是通过组合的方式建立两个类之间的联系&#xff0c…

java计算机毕业设计ssm社区养老服务管理系统iq0w7(附源码、数据库)

java计算机毕业设计ssm社区养老服务管理系统iq0w7&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

海口市美兰区图书馆建筑结构设计(计算书+任务书+建筑结构施工组织设计cad图纸)

【目录】 1目录……………………………………………………………………………………………………….1 2前言……………………………………………………………………………………………………3 3 摘要……………………………………………………………….…………………………1 结…

Java项目:SSM出租车管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 超级管理员角色包含以下功能&#xff1a; 超级管理员管理,公告管理,系统管理员管理,司机管理,车辆管理,维修保养管理,运营里程记录等功能。 普通…

12.4泛型 map set

目录 一,泛型 1 什么是泛型 2 引出泛型 2.1语法 3 泛型类的使用 3.1 语法 3.2 示例 3.3 类型推导(Type Inference) 4.裸类型(Raw Type) 5 泛型如何编译的 5.2 为什么不能实例化泛型类型数组 6 泛型的上界 6.1 语法 6.3 复杂示例 7 泛型方法 7.1 定义语法 二.通…

【数据结构】二分搜索树

集合java.util包下的常用子类&#xff0c;集合无非就是各种数据结构的应用。集合存在的目的就是为了将数据高校进行读写&#xff0c;无论哪种具体的集合无外乎CURD。 Collection->单个元素保存的父接口。 List->可以保存重复的单个元素。 Set->保存单个不重复元素。…

python在centos7.x下建立虚拟环境

(327条消息) python在centos下安装以及配置_雨师的博客-CSDN博客 https://blog.csdn.net/wtt234/article/details/128172281 python离线环境下安装第三方模块的方法&#xff1a; https://blog.csdn.net/wtt234/article/details/128162292 上篇已经把python在centos下的安装以及…

红蓝对抗--sliver 搭建

使用sliver的优点: 1 支持macos、win、linux上线 2 支持丰富的插件加载扩展,功能选择多,CS已经很普遍了,可以尝试sliver做C2 sliver相关构成: Implant:生成植入的木马 sliver-client :C2的控制端 Sliver Server:C2的控制端,客户端通过gRPC接口与server交互 架构: […

【 java 集合】Collection 接口中的常用方法

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

LeetCode刷题复盘笔记—一文搞懂纯完全背包问题(动态规划系列第十一篇)

今日主要总结一下动态规划背包问题的基础——纯完全背包问题 在Leetcode题库中主要都是0-1背包和完全背包的应用问题&#xff0c;所以主要掌握这两个背包问题 题目&#xff1a;纯完全背包问题 题目描述&#xff1a; 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是w…

List——顺序表与链表(二)

文章目录前言一、链表概念及结构二、LinkedList与链表1.什么是LinkedList2.LinkedList的常用方法3.链表的遍历三.实现自己的LinkedList四.ArrayList和LinkedList的区别与优缺点总结前言 上一篇文章中&#xff0c;介绍了List接口以及ArrayList的使用&#xff0c;并且进行了简单…

ByteTrack多目标追踪论文阅读

paper:ByteTrack: Multi-Object Tracking by Associating Every Detection Box code:ByteTrack 一.摘要 多目标追踪的目的是识别视频中物体或对象的位置和身份&#xff0c;也就是说&#xff0c;不同于目标检测的是&#xff0c;追踪问题可以分为两个任务&#xff1a;1&#x…