vue3 computed方法使用详细讲解

Computed方法用于创建计算属性,它的值由其他响应式数据计算得出,并且会在依赖数据发生改变时自动更新。因为vue3兼容vue2的选项式api,所以习惯用vue2的小伙伴可以直接用vue2的方法写是没有问题的。但我这里介绍的是computed在vue3中的新语法:

内容涵盖了computed在我们开发中所有能用到的方法,另外也会在每个使用方法上附上使用情景:

1.基础写法

使用场景:我们在做项目时经常会在模板中写表达式来获取自己想要的结果,比如这样:<span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span> 但这样的表达式写入太多会造成代码臃肿,所以官方不建议在模板中写入太多的表达式操作,我们就可以使用computed方法来实现相同的功能:

<script setup>
// 1.第一步先引入computed方法:
import { ref, computed } from 'vue'

const author = ref(['1','2','3'])

// 2.我们定义了一个计算属性publishedBooksMessage 来接收computed()方法返回的值
const publishedBooksMessage = computed(() => {
  return author.length > 0 ? 'Yes' : 'No'
})
</script>

<template>
// 3.将publishedBooksMessage 变量写到模板中
  <span>{{ publishedBooksMessage }}</span>
</template>

注意:基础写法中computed()方法默认接收的是一个getter函数,返回值(也就是例子中的publishedBooksMessage 的值)为一个可读计算属性ref,也就是我们拿到值之后通常在别的地方直接引用就行,是不能做更改操作的,比如publishedBooksMessage.value++这样的操作,但基础写法在日常生活中使用的更多。所以只是可读也够用了

2. 完整写法

使用场景:我在基础写法中介绍到,基础写法返回的值只可读不可更改,所以当我们的项目涉及到需要更改的操作时,可以使用computed()的完整写法,完整写法提供getter和setter两个函数,我们在getter函数中获取该计算属性的值,在setter函数中可以对该计算属性的值进行更改操作,默认的基础写法只提供getter函数哦

<script setup>

import {ref,computed } from 'vue'

let booksNum = computed({ 
    get:()=>{   return booksNum.value *10  }, 
    set:(value)=>{   return booksNum.value = value/10 } 
})

</script>

3.computed方法接收参数

使用场景:我们在computed的基础写法和完整方法中其实已经满足我们绝大部分需求了,但有些小伙伴在开发时会遇到这样类似这样的问题:在模板中使用v-for遍历循环时需要传参,computed()方法需要接收参数才能处理数据,这种情况下computed方法该如何接收参数呢?别慌,很简单,只需要在计算属性内部返回一个函数就可以了

<script setup>

import {ref,computed } from 'vue'

const arrList  = ref('你好','2','3')

const result =computed(()=>{
  return (text) =>{
    return text+'1'
  }
})

</script >

<template>
  <div   v-for="item in arr" >
     <span  v-html="result (item)">
     </span>
  </div>
</template>

Vue 3 中,`computed` 本身是**不直接支持传递参数的**,因为 `computed` 是基于响应式依赖的**属性(property)**,它的设计初衷是像一个“计算后的值”,而不是一个函数。 但是,如果你需要“带参数的计算属性”,可以通过以下方式实现: --- ### ✅ 解决方案:使用 **返回函数的 computed** 你可以让 `computed` 返回一个函数,这个函数可以接收参数。这样就能实现“传参”的效果。 #### 示例代码(使用 `<script setup>` 和组合式 API): ```vue <script setup> import { ref, computed } from &#39;vue&#39; const items = ref([1, 2, 3, 4, 5, 6]) // computed 返回一个函数,该函数可以接收参数 const filteredItems = computed(() => { return (threshold) => { return items.value.filter(item => item > threshold) } }) </script> <template> <div> <p>原始数据: {{ items }}</p> <p>大于 2 的项: {{ filteredItems(2) }}</p> <p>大于 4 的项: {{ filteredItems(4) }}</p> </div> </template> ``` --- ### 🔍 解释: - `filteredItems` 是一个 `computed`,它返回一个函数 `(threshold) => [...]`。 - 这个内部函数可以访问外部的 `items.value`(响应式依赖)。 - 每次调用 `filteredItems(2)` 时,会触发 getter,Vue 会追踪 `items` 的变化。 - 当 `items` 改变时,`filteredItems` 会重新计算其返回的函数(即缓存更新)。 > ⚠️ 注意:虽然你可以调用 `filteredItems(2)`,但 `computed` 本身的值是一个函数,所以你是在调用这个函数。 --- ### ❌ 错误做法(不要这样做): ```js // 错误!computed 不接受参数 const result = computed((arg) => { ... }) ``` `computed()` 接收的是一个无参的 getter 函数,不能传参。 --- ### ✅ 另一种替代方案:使用普通函数 + `watch` 手动控制 如果你不需要缓存或复杂逻辑,也可以直接用方法(methods): ```vue <script setup> import { ref } from &#39;vue&#39; const items = ref([1, 2, 3, 4, 5]) const filterItems = (threshold) => { return items.value.filter(item => item > threshold) } </script> <template> <p>大于 3 的项: {{ filterItems(3) }}</p> </template> ``` > 缺点:不会缓存结果,每次模板更新都会重新执行(除非你自己加缓存)。 --- ### 总结对比: | 方式 | 是否可传参 | 是否缓存 | 是否响应式 | |------|------------|----------|-------------| | `computed` 返回函数 | ✅ 是 | ✅ 是(外层 computed) | ✅ 是 | | 普通方法(method) | ✅ 是 | ❌ 否(每次都算) | ✅ 是(依赖变会重算) | 推荐优先使用 **`computed` 返回函数** 的方式,当你需要缓存和性能优化时。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值