Làm cách nào để gọi một getter từ một getter khác trong Vuex?


105

Hãy xem xét một đơn giản Vue viết blog:
Tôi đang sử dụng Vuex như kho dữ liệu của tôi và tôi cần phải thiết lập hai thu khí : một getPostgetter để lấy một postbằng ID, cũng như một listFeaturedPostsrằng lợi nhuận vài ký tự đầu tiên của mỗi bài đặc trưng. Lược đồ kho dữ liệu cho danh sách bài đăng nổi bật tham chiếu đến các bài đăng theo ID của chúng. Các ID này cần được giải quyết thành các bài đăng thực tế nhằm mục đích hiển thị các đoạn trích.

store / state.js

export const state = {
  featuredPosts: [2, 0],
  posts: [
    'Lorem et ipsum dolor sit amet',
    'Lorem et ipsum dolor sit amet',
    'Lorem et ipsum dolor sit amet',
    'Lorem et ipsum dolor sit amet',
    'Lorem et ipsum dolor sit amet',
  ]
}

store / getters.js

export default getPost = (state) => (postID) => {
  return state.posts[postID]
}

export default listFeaturedPosts = (state, getters) => () => {
  console.log(getters) // {}

  return state.featuredPosts.map(postID => getters.getPost(postID).substring(0, EXCERPT_LENGTH);
}

store / index.js

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import * as getters from './getters'
import * as mutations from './mutations'

Vue.use(Vuex)

export default new Vuex.Store({
  state,
  getters,
  mutations
})

Theo tài liệu, getterstham số có thể được sử dụng để truy cập các getters khác. Tuy nhiên, khi tôi cố gắng truy cập getterstừ bên trong listFeaturedPosts, nó trống rỗng và tôi gặp lỗi trong bảng điều khiển do getters.getPostkhông được xác định trong ngữ cảnh đó.

Làm cách nào để gọi getPostdưới dạng một bộ thu Vuex từ bên trong listFeaturedPoststrong ví dụ trên?

Câu trả lời:



18

Chuyển getterslàm đối số thứ hai để truy cập các getters cục bộ và không có vùng chứa tên. Đối với các mô-đun không gian tên, bạn nên sử dụng rootGetters(làm đối số thứ 4 , để truy cập các getters được xác định trong một mô-đun khác):

export default foo = (state, getters, rootState, rootGetters) => {
    return getters.yourGetter === rootGetters['moduleName/getterName']
}

3
Điều này hữu ích cho những người yêu cầu getter từ một mô-đun vuex khác. Tôi chỉ muốn nhấn mạnh rằng các đối số phải theo thứ tự cụ thể được hiển thị trong câu trả lời và không có đối số nào được bỏ qua để nó hoạt động.
LJH

13

Tôi đã thử nghiệm mà không có statevà không hoạt động. Đó là lý do tại sao statelà cần thiết.

những công việc này:

export default foo = (state, getters) => {
    return getters.yourGetter
}

điều này không hoạt động

export default foo = (getters) => {
    return getters.yourGetter
}

1
Tôi muốn nói thêm rằng nó không hoạt động trong bất kỳ phiên bản Vue nào. Không nên nhầm lẫn cấu trúc đối tượng với các đối số được đặt tên (xem câu trả lời trong gợi ý ban đầu để bỏ qua 'trạng thái'). Nó thực sự là (nhà nước, thu khí)
Igor Zinken

2
Trong ví dụ thứ hai, bạn đang đặt tên cho stateđối tượng gettersvà bỏ qua đối số thứ hai sẽ là gettersđối tượng thực . Nếu bạn xem xét nội dung getterstrong ví dụ này, bạn sẽ thấy nó thực sự là đối tượng trạng thái của bạn.
mraaroncruz

10

Getters nhận các getters khác làm đối số thứ 2

getters: {
  doneTodos: state => {
    return state.todos.filter(todo => todo.done)
  },
  doneTodosCount: (state, getters) => {
    return getters.doneTodos.length
  }
}

Đây là liên kết đến tài liệu chính thức - https://vuex.vuejs.org/guide/getters.html#property-style-access


2
Thumbs up cho: a) một mã số rõ ràng ví dụ b) liên kết đến các vị trí thích hợp trong tài liệu
Katinka Hesselink

1
Viết như thế này có khác không? getters: {doneTodos: state => {return state.todos.filter (todo => todo.done)}, doneTodosCount: (state, getters) => {return this.getters.doneTodos.length}}
Rivo

@Rivo theo như tôi biết bạn không thể làm điều đó. Nếu bạn cố gắng bạn sẽ nhận được một lỗi như thế này: [Vue cảnh báo]: Lỗi trong render: "Lỗi Loại: Không thể đọc thuộc 'thu khí' không xác định"
OziOcb

-3

thay vì vượt qua trạng thái , hãy vượt qua getters và sau đó gọi bất kỳ getter nào khác mà bạn muốn. Hy vọng nó giúp.

Trong cửa hàng của bạn / getters.js

export default foo = (getters) => {
   return  getters.anyGetterYouWant
}

2
Tôi nghĩ rằng bạn đang nhầm lẫn cấu trúc đối tượng với các đối số. Đối số đầu tiên của hàm là trạng thái, đối số thứ hai là đối tượng getters. Bạn có thể đặt tên cho đối số đầu tiên là 'getters', nhưng nó vẫn sẽ là trạng thái! Bạn đang tìm kiếm: xuất khẩu mặc định foo = (nhà nước, thu khí) => ...
Igor Zinken

Hoặcexport default foo = ({ getters }) => { return getters.anyGetterYouWant }
GaryMcM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.