《Vue进阶教程》第六课:computed()函数详解(上)

往期内容:

《Vue零基础入门教程》合集(完结)

《Vue进阶教程》第一课:什么是组合式API

《Vue进阶教程》第二课:为什么提出组合式API

《Vue进阶教程》第三课:Vue响应式原理

《Vue进阶教程》第四课:reactive()函数详解

《Vue进阶教程》第五课:ref()函数详解(重点)

1) 基本使用

📝计算属性computed()函数

1参数: 函数/对象

2作用: 创建一个计算属性

3返回: 计算属性对象

示例1

接收函数作为参数

javascript 复制代码
const state = reactive({firstname: 'xiao', lastname: 'ming'})
// 接收一个副作用函数做为参数, 返回一个ref类型对象
const fullname = computed(() => {
  return state.firstname + state.lastname
})
// 通过.value操作
console.log(fullname.value)

示例2

接收一个对象作为参数, 但是这种方式用的不多.

接收对象作为参数

javascript 复制代码
const state = reactive({firstname: 'xiao', lastname: 'ming'})
// 接收一个副作用函数做为参数, 返回一个ref类型对象
const fullname = computed({
  get() {
    return state.firstname + ' ' + state.lastname
  },
  set(newValue) {
    [state.firstname, state.lastname] = newValue.split(' ')
  }
})
// 通过.value操作
console.log(fullname.value)

2) 计算属性的特点

懒执行

示例

javascript 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="../node_modules/vue/dist/vue.global.js"></script>
  </head>
  <body>
    <script>
      const { reactive, computed } = Vue
      const state = reactive({ firstname: 'xiao', lastname: 'ming' })

      const fullname = computed(() => {
        console.log('默认不执行, 只有当访问fullName.value时执行')
        return state.firstname + state.lastname
      })

      setTimeout(() => {
        fullname.value
      }, 1000)
    </script>
  </body>
</html>

缓存

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script src="../node_modules/vue/dist/vue.global.js"></script>

    <script>
      const { reactive, computed } = Vue
      const state = reactive({ firstname: 'xiao', lastname: 'ming' })

      const fullname = computed(() => {
        console.log('computed')
        return state.firstname + state.lastname
      })
      console.log(fullname.value) // 初次访问时, 执行1次, 保存到缓存
      console.log(fullname.value) // 再次访问, 直接返回缓存中的数据

    </script>
  </body>
</html>

3) effect的高级用法

effect函数的高级用法

1lazy: 懒执行

2scheduler: 自定义更新

lazy选项

示例

懒执行

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="../node_modules/vue/dist/vue.global.js"></script>
  </head>
  <body>
    <script>
      const { ref, effect } = Vue

      const count = ref(0)
      // effect 返回 run() 函数,
      //  1. 加入lazy:true选项后, 不会自动调用副作用函数
      //  2. 手动执行run()函数, 才会调用副作用函数, 建立依赖关系
      const run = effect(
        () => {
          console.log('一开始不执行, 调用run才会执行', count.value)
        },
        { lazy: true }
      )
      console.log(run)
    </script>
  </body>
</html>

scheduler选项

示例

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="../node_modules/vue/dist/vue.global.js"></script>
  </head>
  <body>
    <script>
      const { ref, effect } = Vue

      const count = ref(0)

      effect(
        () => {
          console.log('第一次执行这里', count.value)
        },
        {
          scheduler: () => {
            console.log('更新时, 执行这里...')
          },
        }
      )
    </script>
  </body>
</html>
相关推荐
阳光阴郁大boy44 分钟前
一个基于纯前端技术实现的五子棋游戏,无需后端服务,直接在浏览器中运行。
前端·游戏
石小石Orz1 小时前
效率提升一倍!谈谈我的高效开发工具链
前端·后端·trae
EndingCoder1 小时前
测试 Next.js 应用:工具与策略
开发语言·前端·javascript·log4j·测试·全栈·next.js
xw51 小时前
免费的个人网站托管-PinMe篇
服务器·前端
!win !1 小时前
免费的个人网站托管-PinMe篇
前端·前端工具
牧天白衣.1 小时前
CSS中linear-gradient 的用法
前端·css
索西1 小时前
Vue 响应式原理
vue.js
军军3601 小时前
Git大型仓库的局部开发:分步克隆 + 指定目录拉取
前端·git
焦小风Zephyr1 小时前
Vue3组件通信:父子相传
vue.js
前端李二牛1 小时前
Vue3 特性标志
前端·javascript