vue3 中 的 computed 的使用,由于 vue3 兼容 vue2 的选项式API,所以可以直接使用 vue2的写法,这篇文章主要介绍 vue3 中 computed 的新用法,对比 vue2 中的写法,让您快速掌握 vue3 中 computed 的新用法。

组合式 API 中使用 computed 时,需要先引入:import { computed } from "vue"。引入之后 computed 可以传入的参数有两种:回调函数和 options 。具体看看它是如何使用的?

一、函数式写法

在vue2中,computed 写法:

  1. computed:{
  2. sum(){
  3. return this.num1+ this.num2
  4. }
  5. }

在vue3 如果使用选项式API也可以这样写,主要看下组合式API的使用。

示例1:求和

  1. import { ref, computed } from "vue"
  2. export default{
  3. setup(){
  4. const num1 = ref(1)
  5. const num2 = ref(1)
  6. let sum = computed(()=>{
  7. return num1.value + num2.value
  8. })
  9. }
  10. }

调用 computed 时, 传入了一个箭头函数,返回值作为 sum 。相比之前,使用更加简单了。如果需要计算多个属性值,直接调用就可以。如:

  1. let sum = computed(()=>{
  2. return num1.value + num2.value
  3. })
  4. let mul = computed(()=>{
  5. return num1.value * num2.value
  6. })

该示例过于简单,看不明白的可在文章后面阅读完整实例1。

二、options 写法

计算属性默认只有 getter ,在需要的时候也可以提供 setter 。在vue2中用法如下:

  1. computed:{
  2. mul:{
  3. get(){ // num1值改变时触发
  4. return this.num1 * 10
  5. },
  6. set(value){ // mul值被改变时触发
  7. this.num1 = value /10
  8. }
  9. }
  10. }

mul 属性是 给num1 放大10,如果修改 mul 的值,则 num1 也随之改变。

在 vue3 中 :

  1. let mul = computed({
  2. get:()=>{
  3. return num1.value *10
  4. },
  5. set:(value)=>{
  6. return num1.value = value/10
  7. }
  8. })

这两种写法不太一样,仔细观察区别不大,get 和 set 调用也是一样的。

在此示例中代码简单,如果没太理解,可查看文章后面的完整实例2。


完整实例1:

  1. <template>
  2. <div>
  3. {{num1}} + {{num2}} = {{sum}}
  4. <br>
  5. <button @click="num1++">num1自加</button>
  6. <button @click="num2++">num2自加</button>
  7. </div>
  8. </template>
  9. <script>
  10. import { ref, computed } from "vue"
  11. export default{
  12. setup(){
  13. const num1 = ref(1)
  14. const num2 = ref(1)
  15. let sum = computed(()=>{
  16. return num1.value + num2.value
  17. })
  18. return{
  19. num1,
  20. num2,
  21. sum
  22. }
  23. }
  24. }
  25. </script>

完整实例2:

  1. <template>
  2. <div>
  3. {{num1}} + {{num2}} = {{sum}}<br>
  4. <button @click="num1++">num1自加</button>
  5. <button @click="num2++">num2自加</button>
  6. <br>
  7. {{num1}} * 10 = {{mul}}
  8. <button @click="mul=100">改值</button>
  9. </div>
  10. </template>
  11. <script>
  12. import { ref, computed } from "vue"
  13. export default{
  14. setup(){
  15. const num1 = ref(1)
  16. const num2 = ref(1)
  17.  
  18. let sum = computed(()=>{
  19. return num1.value + num2.value
  20. })
  21. let mul = computed({
  22. get:()=>{
  23. return num1.value *10
  24. },
  25. set:(value)=>{
  26. return num1.value = value/10
  27. }
  28. })
  29. return{
  30. num1,
  31. num2,
  32. sum,
  33. mul
  34. }
  35. }
  36. }
  37. </script>

三、computed 传参

计算属性需要传入一个参数怎么写呢?

  1. <template>
  2. <div>
  3. <div v-for="(item,index) in arr" :key="index" @click="sltEle(index)">
  4. {{item}}
  5. </div>
  6. </div>
  7. </template>
  8. <script>
  9. import { ref, computed,reactive } from "vue"
  10. export default{
  11. setup(){
  12. const arr = reactive([
  13. '哈哈','嘿嘿'
  14. ])
  15. const sltEle = computed( (index)=>{
  16. console.log('index',index);
  17. })
  18. return{
  19. arr,sltEle
  20. }
  21. }
  22. }
  23. </script>

直接这样写,运行的时候,出现错误:Uncaught TypeError: $setup.sltEle is not a function。

原因:

computed 计算属性并没有给定返回值,我们调用的是一个函数,而 computed 内部返回的并不是一个函数,所以就会报错:sltEle is not a function。

解决办法:

需要在计算属性 内部返回一个函数。修改代码如下:

  1. const sltEle = computed( ()=>{
  2. return function(index){
  3. console.log('index',index);
  4. }
  5. })

  1. 好了小编今天的文章就到此结束了,喜欢我的可以点个关注哦!

vue 3 学习笔记 (七)——vue3 中 computed 新用法的更多相关文章

  1. vue 3 学习笔记 (六)——watch 、watchEffect 新用法

    选项式API与之前写法相同,本篇文章主要通过 Options API 和 Composition API 对比 watch 的使用方法,让您快速掌握 vue3 中 watch 新用法.建议收藏! 一. ...

  2. STL学习笔记(七) 程序中使用STL

    条款43:算法调用优先于手写循环 class Widget { public: bool test(); }; vector<Widget> vec; 算法调用: for_each(vec ...

  3. 学习笔记3—matlab中load特殊用法

    1.在matlab中 ,infro.mat中存有很多子矩阵(比如:mean_FA.mat, mean_e1.mat和 mean_e2.mat),调出某一个矩阵时,命令行为:load([path,'\' ...

  4. spring in action学习笔记七:@Conditional注解的用法

    @Profile注解是@Conditional注解的一个例子.即@Profile也是用@Conditional注解来实现的. 必须让条件实现Condition这个接口. 下面的案例讲如果环境中有mag ...

  5. Vue.js学习笔记:在元素 和 template 中使用 v-if 指令

    f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...

  6. 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

  7. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用:

  8. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  9. vue.js 学习笔记3——TypeScript

    目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...

随机推荐

  1. Azure Bicep(三)变量控制

    一,引言 当我们在使用 Azure Bicep 的时候会出现以下几个问题: 1)文件中有很多地方会重用很多相同的值 2)输入参数可以在统一的地方进行修改 带着这些问题,我们开始今天的内容,学习如何在 ...

  2. Java(4)运算符及表达式

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201675.html 博客主页:https://www.cnblogs.com/testero ...

  3. 如何在印刷品中使用遵循SIL Open Font License协议的字体

    如何在印刷品中使用遵循SIL Open Font License协议的字体 昨天在知乎看到了一个问题,( 如何在设计中声明字体开源许可证? - 知乎 (zhihu.com),恰好最近在研究一些开源协议 ...

  4. 【UE4 C++】 UnrealPak 与 Pak 的制作、挂载、加载

    简介 通过 UnrealPak,可以将资源打包成 Pak 文件 Pak文件是UE4游戏生成的数据包文件. Pak 之前一般先有 Cooked 步骤,将资源烘焙为对应平台支持的资源 一般打包后的项目使用 ...

  5. Scrum Meeting 0529

    零.说明 日期:2021-5-29 任务:简要汇报七日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 七日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 完成后端管 ...

  6. 【技术博客】在Unity3d中实现烟花效果

    在游戏开发中,我们经常需要用到类似烟花的效果.在Unity3d中,实现烟花效果的方法不止一种,我选用了Unity3d中新添加的粒子特效工具--visual effect graph来进行实现. 实现过 ...

  7. docker multi-stage 多阶段构建

    多阶段构建 一.需求 二.普通构建 1.编写Dockerfile 2.构建镜像 三.多阶段(multi-stage)构建 1.编写Dockerfile 2.构建镜像 四.比较2个镜像的体积大小 我们在 ...

  8. CSP踩被记

    本来想起个清新脱俗的标题,但碍于语文功底不行,于是光明正大嫖了LiBoyi的高端创意,把这篇博客命名为踩被记. Day -6 用假暴力把真正解拍没了,伤心.Rp有点低 Day -4 信息学考,\(py ...

  9. Spring Security:如何在Postman中优雅地测试后端API(前后端分离)

    前言 在Postman中可以编写和执行自动化测试,使用 JavaScript 编写基本的 API 测试,自由编写任何用于自动化测试的测试方案. 在POSTMAN中读取Cookie值 1. 我们需要向& ...

  10. cat userlist(课上练习)

    问题描述 Linux文件系统的三层抽象是什么? 写出Cat userlist的过程,要详述目录文件,i-node.数据块,要画图示意. 假设块大小为4k, userlist的大小不小于10k,自己假设 ...