`getter` 和 `computed` 属性在 Vue.js 中有何异同?
时间: 2025-06-30 20:18:03 浏览: 12
### 三、Vue.js 中的 `getter` 和 `computed` 属性的异同
#### 相似之处
`getter` 和 `computed` 都是 Vue 生态中用于响应式处理数据的机制,它们都具备缓存特性,只有在依赖的数据发生变化时才会重新计算。这种机制提升了性能,避免了不必要的重复计算。
在使用方式上,`computed` 属性可以直接在组件内部定义,并作为属性访问;而 `getter` 则是在 Vuex 的 store 中定义,通过 `this.$store.getters` 在组件中调用。两者都可以返回一个函数或者直接的值,支持对原始数据进行加工处理[^2]。
#### 不同之处
1. **作用范围不同**
`computed` 是组件内部的状态派生机制,主要用于单个组件内的状态转换和逻辑处理。它通常与当前组件的 `data` 或 `props` 紧密相关。
`getter` 是 Vuex 提供的全局状态派生机制,适用于多个组件之间共享的状态处理。它基于整个 store 的 `state` 进行计算,适合跨组件共享和复用的业务逻辑[^3]。
2. **响应式依赖追踪不同**
`computed` 会自动追踪其依赖的数据变化并缓存结果。如果依赖未发生变化,则直接返回之前的结果,减少重复执行的开销。
`getter` 同样具备响应式依赖追踪能力,但它是基于 Vuex 的 state 管理系统实现的。当 `state` 发生变化时,`getter` 会重新计算并更新结果[^1]。
3. **是否接受参数**
`computed` 属性本质上是一个对象,每个属性对应一个函数(默认为 getter 函数),不能直接接收参数。如果需要动态传参,只能通过封装方法返回一个函数来实现。
`getter` 可以设计为返回一个函数,从而允许外部传递参数进行查询操作。例如,根据 ID 获取特定的 todo 项:
```javascript
getters: {
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id);
}
}
```
4. **是否可以修改状态**
`computed` 属性虽然可以通过 setter 修改依赖的响应式数据,但通常不推荐这样做。它的主要职责是派生状态,而不是修改状态。
`getter` 仅用于派生状态,不能直接修改 `state`。如果需要修改 Vuex 的 `state`,应该通过 `mutation` 或 `action` 来完成[^3]。
5. **使用场景差异**
`computed` 更适合处理组件内部的派生状态,如格式化文本、过滤列表等。它简化了模板中的逻辑表达式,提升可读性和维护性。
`getter` 更适合处理全局共享的状态派生逻辑,尤其是在多个组件都需要访问相同派生数据时。它可以集中管理这些派生逻辑,增强代码的可维护性和复用性[^2]。
---
###
阅读全文