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

目录

一、计算属性computed。

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

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

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

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

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

<3>代码示例。

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

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

<1>只读计算属性。

[<2>提供 getter 和 setter 创建可写计算属性。](#<2>提供 getter 和 setter 创建可写计算属性。)

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

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


一、计算属性computed。

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

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

使用计算属性computed重构------>简化描述响应式状态的复杂逻辑。
(1)计算属性computed小案例。
<1>需求说明。(筛选原数组------>得新数组)

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

<3>代码示例。
html 复制代码
<!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更新,计算属性会跟着动态更新。
  • 代码示例。
html 复制代码
<!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>只读计算属性。
  • 代码示例。
html 复制代码
<!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 创建可写计算属性。
  • 代码示例。(根据官方文档的语法格式书写)
  • 具体的过程计算可以看注释!
html 复制代码
<!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的调用对比)
html 复制代码
<!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的最佳实践。
  • 官方解答与个人小结。
相关推荐
真的想上岸啊8 分钟前
学习51单片机01(安装开发环境)
嵌入式硬件·学习·51单片机
一只码代码的章鱼27 分钟前
Spring的 @Validate注解详细分析
前端·spring boot·算法
每次的天空38 分钟前
Android学习总结之Glide自定义三级缓存(面试篇)
android·学习·glide
zimoyin1 小时前
Kotlin 协程实战:实现异步值加载委托,对值进行异步懒初始化
java·前端·kotlin
cdcdhj1 小时前
vue用通过npm的webpack打包编译,这样更适合灵活配置的项目
vue.js·webpack·npm
恋猫de小郭1 小时前
如何查看项目是否支持最新 Android 16K Page Size 一文汇总
android·开发语言·javascript·kotlin
名誉寒冰1 小时前
# KVstorageBaseRaft-cpp 项目 RPC 模块源码学习
qt·学习·rpc
赵大仁1 小时前
React Native 与 Expo
javascript·react native·react.js
开发游戏的老王2 小时前
[虚幻官方教程学习笔记]深入理解实时渲染(An In-Depth Look at Real-Time Rendering)
笔记·学习·虚幻
程序员与背包客_CoderZ2 小时前
Node.js异步编程——Callback回调函数实现
前端·javascript·node.js·web