《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>
相关推荐
科技D人生5 分钟前
Vue.js 学习总结(20)—— Vue-Office 实战:word、pdf、excel、ppt 多种文档的在线预览
vue.js·word·vue-pdf·stylesheet·docx-preview·vue-office
vx1_Biye_Design6 分钟前
基于Spring Boot+Vue的学生管理系统设计与实现-计算机毕业设计源码46223
java·vue.js·spring boot·spring·eclipse·tomcat·maven
vx_Biye_Design7 分钟前
基于Spring Boot+vue的湖北旅游景点门票预约平台的设计--毕设附源码29593
java·vue.js·spring boot·spring cloud·servlet·eclipse·课程设计
hedley(●'◡'●)7 分钟前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_8115175159 分钟前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育10 分钟前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
百锦再10 分钟前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
hdsoft_huge12 分钟前
1panel面板中部署SpringBoot和Vue前后端分离系统 【图文教程】
vue.js·spring boot·后端
CappuccinoRose36 分钟前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
这儿有一堆花42 分钟前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架