Vue3学习(组合式API——计算属性computed详解)

news2025/7/19 5:02:39

目录

一、计算属性computed。

Vue官方提供的案例。(普通写法与计算属性写法)

使用计算属性computed重构——>简化描述响应式状态的复杂逻辑。

(1)计算属性computed小案例。

<1>需求说明。(筛选原数组——>得新数组)

<2>计算属性基本语法。

<3>代码示例。

<4>响应式依赖更新,才会重新更新计算属性。

(2)计算属性可支持getter、settter创建。(默认只读)

<1>只读计算属性。

<2>提供 getter 和 setter 创建可写计算属性。

(3)"计算属性缓存" vs "方法(函数)"。

(4)计算属性computed的最佳实践。


一、计算属性computed。

  • 官方解释:使用计算属性来描述依赖响应式状态的复杂逻辑
  • Vue官方提供的案例。(普通写法与计算属性写法)


  • 向上面必须认真看好一会儿才能明白它的计算依赖于author.books。更重要的是,如果在模板中需要不止一次这样的计算,就需要将这样的代码在模板里重复好多遍。

  • 使用计算属性computed重构——>简化描述响应式状态的复杂逻辑

(1)计算属性computed小案例。
<1>需求说明。(筛选原数组——>得新数组)


<2>计算属性基本语法。
  • const 计算属性 = computed(()=>{..return计算返回的结果..})

<3>代码示例。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div>原始数据:{{list}}</div>
        <div>=================================</div>
        <div>计算属性数据:{{computedList}}</div>
    </div>

    <script type="module">
        import { createApp, ref, computed } from './vue.esm-browser.js'
        createApp({
            setup() {
                const list = ref([1, 2, 3, 4, 5, 6, 7, 8])

                //基于list派生一个计算属性,从list中过滤出>2
                const computedList = computed(() => {
                    return list.value.filter(item => item > 2)
                })
                return {
                    list,
                    computedList
                }
            }

        }).mount('#app')
    </script>

</body>

</html>

  • 效果如下。


<4>响应式依赖更新,才会重新更新计算属性。
  • 当响应式依赖原始数组对象list更新,计算属性会跟着动态更新
  • 代码示例。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div>原始数据:{{list}}</div><button @click="changeList">更新list</button>
        <div>=================================</div>
        <div>计算属性数据:{{computedList}}</div>
    </div>

    <script type="module">
        import { createApp, ref, computed } from './vue.esm-browser.js'
        createApp({
            setup() {
                const list = ref([1, 2, 3, 4, 5, 6, 7, 8])

                //基于list派生一个计算属性,从list中过滤出>2
                const computedList = computed(() => {
                    return list.value.filter(item => item > 2)
                })

                //修改数组list的方法
                const changeList = () => {
                    //点击一次按钮,添加一个666
                    list.value.push(666)
                }
                return {
                    list,
                    computedList,
                    changeList
                }
            }

        }).mount('#app')
    </script>

</body>

</html>

  • 效果如下。

(2)计算属性可支持getter、settter创建。(默认只读)
  • 官方解释。


<1>只读计算属性。
  • 代码示例。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div>原始数据:{{count}}</div>
        <div>=================================</div>
        <div>计算属性数据:{{countComputed}}</div>
    </div>

    <script type="module">
        import { createApp, ref, computed } from './vue.esm-browser.js'
        createApp({
            setup() {
                const count = ref(1)
                const countComputed = computed(() => {
                    return count.value + 1
                })
                return {
                    count,
                    countComputed
                }
            }

        }).mount('#app')
    </script>

</body>

</html>

  • 效果如下。


  • 尝试直接修改计算属性。(出现错误不生效)



<2>提供 getter 和 setter 创建可写计算属性。
  • 代码示例。(根据官方文档的语法格式书写
  • 具体的过程计算可以看注释!
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div>原始数据:{{count}}</div> <!-- count的计算过程:1-2=-1 -->
        <div>=================================</div>
        <div>计算属性数据:{{countComputed}}</div> <!-- countComputed的计算过程:1-2+1=0 -->
    </div>

    <script type="module">
        import { createApp, ref, computed } from './vue.esm-browser.js'
        createApp({
            setup() {
                const count = ref(1)
                const countComputed = computed({
                    get() { return count.value + 1 },
                    set(newValue) { return count.value = newValue - 2 }
                })
                countComputed.value = 1
                console.log('set调用:' + count.value)
                return {
                    count,
                    countComputed
                }
            }

        }).mount('#app')
    </script>

</body>

</html>

  • 效果如下。

(3)"计算属性缓存" vs "方法(函数)"。
  • 官方解释:计算属性值会基于其响应式依赖被缓存。
  • 为什么需要缓存呢?想象一下我们有一个非常耗性能的计算属性 list,需要循环一个巨大的数组并做许多计算逻辑,并且可能也有其他计算属性依赖于 list。没有缓存的话,我们会重复执行非常多次 list 的 getter,然而这实际上没有必要!如果你确定不需要缓存,那么也可以使用方法(函数)调用

  • 代码示例。(函数aaa与计算属性bbb的调用对比)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div>
            调用1次方法(函数)aaa{{aaa()}}<br>
            调用2次方法(函数)aaa{{aaa()}}<br>
            调用3次方法(函数)aaa{{aaa()}}
            <div>=========================</div>
            调用1次计算属性{{bbb}}<br>
            调用2次计算属性{{bbb}}<br>
            调用3次计算属性{{bbb}}
        </div>
    </div>
    <script type="module">
        import { createApp, computed } from '/vue.esm-browser.js'
        createApp({
            setup() {
                const aaa = () => {
                    console.log('aaaa函数')
                }
                const bbb = computed(() => {
                    console.log('bbb计算属性')
                })

                return {
                    aaa,
                    bbb
                }
            }
        }).mount('#app')
    </script>
</body>

</html>

  • 效果如下。

(4)计算属性computed的最佳实践。
  • 官方解答与个人小结。

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

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

相关文章

Android Studio 模拟器配置方案

Android Studio 模拟器配置方案 1.引言2.使用Android Studio中的模拟器3.使用国产模拟器1.引言 前面介绍【React Native基础环境配置】的时候需要配置模拟器,当时直接使用了USB调试方案,但是有些时候可能不太方便连接手机调试,比如没有iPhone调不了ios。接下来说明另外两种可…

k8s中ingress-nginx介绍

1. 介绍 Ingress是一种Kubernetes资源&#xff0c;用于将外部流量路由到Kubernetes集群内的服务。与NodePort相比&#xff0c;它提供了更高级别的路由功能和负载平衡&#xff0c;可以根据HTTP请求的路径、主机名、HTTP方法等来路由流量。可以说Ingress是为了弥补NodePort在流量…

字节DeerFlow开源框架:多智能体深度研究框架,实现端到端自动化研究流程

&#x1f98c; DeerFlow DeerFlow&#xff08;Deep Exploration and Efficient Research Flow&#xff09;是一个社区驱动的深度研究框架&#xff0c;它建立在开源社区的杰出工作基础之上。目标是将语言模型与专业工具&#xff08;如网络搜索、爬虫和Python代码执行&#xff0…

算法第十八天|530. 二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

530. 二叉搜索树的最小绝对差 题目 思路与解法 第一想法&#xff1a; 一个二叉搜索树的最小绝对差&#xff0c;从根结点看&#xff0c;它的结点与它的最小差值一定出现在 左子树的最右结点&#xff08;左子树最大值&#xff09;和右子树的最左结点&#xff08;右子树的最小值…

微服务调试问题总结

本地环境调试。 启动本地微服务&#xff0c;使用公共nacos配置。利用如apifox进行本地代码调试解决调试问题。除必要的业务微服务依赖包需要下载到本地。使用mvn clean install -DskipTests进行安装启动前选择好profile环境进行启动&#xff0c;启动前记得mvn clean清理项目。…

美SEC主席:探索比特币上市证券交易所

作者/演讲者&#xff1a;美SEC主席Paul S. Atkins 编译&#xff1a;Liam 5月12日&#xff0c;由美国SEC加密货币特别工作组发起的主题为《资产上链&#xff1a;TradFi与DeFi的交汇点》系列圆桌会议如期举行。 会议期间&#xff0c;现任美SEC主席Paul S. Atkins发表了主旨演讲。…

MySQL Join连接算法深入解析

引言 在关系型数据库中&#xff0c;Join操作是实现多表数据关联查询的关键手段&#xff0c;直接影响查询性能和资源消耗。MySQL支持多种Join算法&#xff0c;包括经典的索引嵌套循环连接&#xff08;Index Nested-Loop Join&#xff09;、块嵌套循环连接&#xff08;Block Nes…

http请求卡顿

接口有时出现卡顿&#xff0c;而且抓包显示有时tcp目标机器没有响应&#xff0c; 但nginx和java应用又没有错误日志&#xff0c;让人抓耳挠腮&#xff0c;最终还是请运维大哥帮忙&#xff0c;一顿操作后系统暂时无卡顿了&#xff0c;佩服的同时感觉疑惑到底调整了啥东…

vite+vue建立前端工程

​ 参考 开始 | Vite 官方中文文档 VUE教程地址 https://cn.vuejs.org/tutorial/#step-1 第一个工程 https://blog.csdn.net/qq_35221977/article/details/137171497 脚本 chcp 65001 echo 建立vite工程 set PRO_NAMEmy-vue-appif not exist %PRO_NAME% (call npm i…

vue使用路由技术实现登录成功后跳转到首页

文章目录 一、概述二、使用步骤安装vue-router在src/router/index.js中创建路由器&#xff0c;并导出在vue应用实例中使用router声明router-view标签&#xff0c;展示组件内容 三、配置登录成功后跳转首页四、参考资料 一、概述 路由&#xff0c;决定从起点到终点的路径的进程…

day20-线性表(链表II)

一、调试器 1.1 gdb&#xff08;调试器&#xff09; 在程序指定位置停顿 1.1.1 一般调试 gcc直接编译生成的是发布版&#xff08;Release&#xff09; gcc -g //-g调式版本&#xff0c;&#xff08;体积大&#xff0c;内部有源码&#xff09;&#xff08;DeBug&#…

HTTP 连接复用机制详解

文章目录 HTTP 连接复用机制详解为什么需要连接复用&#xff1f;连接复用的实现方式HTTP/1.1 的 Keep-AliveHTTP/2 多路复用 HTTP/1.1 的队头阻塞问题 HTTP 连接复用机制详解 HTTP 连接复用是 HTTP/1.1 及更高版本中的核心优化机制&#xff0c;旨在减少 TCP 连接建立和关闭的开…

网络协议分析 实验六 TCP和端口扫描

文章目录 实验6.1 TCP(Transfer Control Protocol)练习二 利用仿真编辑器编辑并发送TCP数据包实验6.2 UDP端口扫描实验6.3 TCP端口扫描练习一 TCP SYN扫描练习二 TCP FIN扫描 实验6.1 TCP(Transfer Control Protocol) 建立&#xff1a;syn,syn ack,ack 数据传送&#xff1a;tcp…

Spring Web MVC————入门(2)

1&#xff0c;请求 我们接下来继续讲请求的部分&#xff0c;上期将过很多了&#xff0c;我们来给请求收个尾。 还记得Cookie和Seesion吗&#xff0c;我们在HTTP讲请求和响应报文的时候讲过&#xff0c;现在再给大家讲一遍&#xff0c;我们HTTP是无状态的协议&#xff0c;这次的…

每日算法-250514

每日算法学习记录 (2024-05-14) 今天记录三道 LeetCode 算法题的解题思路和代码。 1. 两数之和 题目截图: 解题思路 这道题要求我们从一个整数数组中找出两个数&#xff0c;使它们的和等于一个给定的目标值 target&#xff0c;并返回这两个数的下标。 核心思路是使用 哈希…

嵌入式培训之数据结构学习(三)gdb调试、单向链表练习、顺序表与链表对比

目录 一、gdb调试 &#xff08;一&#xff09;一般调试步骤与命令 &#xff08;二&#xff09;找段错误&#xff08;无下断点的地方&#xff09; &#xff08;三&#xff09;调试命令 二、单向链表练习 1、查找链表的中间结点&#xff08;用快慢指针&#xff09; 2、找出…

虚拟机安装CentOS7网络问题

虚拟机安装CentOS7网络问题 1. 存在的问题1.1 CentOS7详细信息 2. 解决问题3.Windows下配置桥接模式 1. 存在的问题 虽然已经成功在虚拟机上安装了CentOS7&#xff0c;但是依旧不能上网。 1.1 CentOS7详细信息 [fanzhencentos01 ~]$ hostnamectlStatic hostname: centos01Ic…

迅为RK3588开发板安卓GPIO调用APP运行测试

将网盘上的安卓工程文件复制到 Windows 电脑上。确保工程路径中使用英文字符&#xff0c;不包含中文。接着&#xff0c;启动 Android Studio&#xff0c;点击“Open”按钮选择应用工程文件夹&#xff0c;然后点击“OK”。由于下载 Gradle 和各种 Jar 包可能需要一段时间&#x…

Unity 红点系统

首先明确一个&#xff0c;即红点系统的数据结构是一颗树&#xff0c;并且红点的数据结构的初始化需要放在游戏的初始化中&#xff0c;之后再是对应的红点UI侧的注册&#xff0c;对应的红点UI在销毁时需要注销对红点UI的显示回调注册&#xff0c;但是不销毁数据侧的红点注册 - …

尼康VR镜头防抖模式NORMAL和ACTIVE的区别(私人笔记)

1. NORMAL 模式&#xff08;常规模式&#xff09; 适用场景&#xff1a;一般手持拍摄&#xff0c;比如人像、静物、风景或缓慢平移镜头&#xff08;如水平追拍&#xff09;等。工作特性&#xff1a; 补偿手抖引起的小幅度震动&#xff08;比如手持时自然的不稳&#xff09;&am…