2017-04-06 50 views
6

Trong đột biến cửa hàng Vuex, có thể truy cập bộ thu thập dữ liệu không? Hãy xem xét ví dụ bên dưới.Truy cập getters trong các đột biến Vuex

new Vuex.Store({ 
    state: { 
     question: 'Is it possible to access getters within a Vuex mutation?' 
    }, 
    mutations: { 
     askQuestion(state) { 
      // TODO: Get question from getter here 
      let question = ''; 

      if (question) { 
       // ... 
      } 
     } 
    }, 
    getters: { 
     getQuestion: (state) => { 
      return state.question; 
     } 
    } 
}); 

Tất nhiên ví dụ này không có ý nghĩa nhiều, bởi vì tôi chỉ có thể truy cập vào question sở hữu trực tiếp trên đối tượng state trong đột biến, nhưng tôi hy vọng bạn sẽ thấy những gì tôi đang cố gắng làm. Đó là trạng thái thao tác có điều kiện.

Trong đột biến, thisundefined và thông số state cho phép truy cập đối tượng state và không phải phần còn lại của cửa hàng.

The documentation on mutations không đề cập gì về việc này.

Tôi đoán là điều đó là không thể, trừ khi tôi bỏ lỡ điều gì đó? Tôi đoán thay thế sẽ là thực hiện logic này bên ngoài cửa hàng (dẫn đến sao chép mã) hoặc thực hiện một hành động thực hiện điều này, bởi vì các hành động có quyền truy cập vào toàn bộ bối cảnh cửa hàng. Tôi khá chắc chắn rằng đó là một cách tiếp cận tốt hơn, đó là để giữ cho đột biến tập trung vào những gì nó thực sự phải làm; biến đổi trạng thái. Đó có lẽ là những gì tôi sẽ làm, nhưng tôi chỉ tò mò nếu truy cập một getter trong một đột biến thậm chí có thể?

+0

thể bạn có thể xây dựng trên lý do tại sao bạn cần phải thu khí trong đột biến? Bạn nói đúng là ví dụ của bạn có thể dễ dàng tham chiếu đến 'state.question'. Và, vâng, bất kỳ logic nào sẽ thực hiện một hành động * khác dựa trên trạng thái hiện tại sẽ được xử lý trong một hành động. – thanksd

+1

Bạn có thể truy cập getters trong các hành động, bởi vì các hành động nhận ngữ cảnh làm đối số đầu tiên. như thế này: actions: {action1: (context, payload) => {console.log (context.getters.getSomething); }}. Bạn không chắc chắn bạn có thể làm điều đó trong đột biến, vì đột biến chỉ nhận được 'trạng thái' cục bộ. – wostex

+0

@thanksd Bởi vì mã thực sự của tôi phức tạp hơn điều này, và tôi cần kiểm tra điều gì đó. Ví dụ cụ thể là thêm sản phẩm vào giỏ hàng và tôi muốn kiểm tra xem sản phẩm đã có ở đó chưa. Tôi muốn giữ logic đó khỏi đột biến để giữ cho nó sạch sẽ. Tôi khá chắc chắn cách tiếp cận tốt nhất là sử dụng một hành động là tốt, nhưng chỉ tò mò nếu nó thậm chí có thể truy cập getters trong đột biến - vì lý do gì. – Andy0708

Trả lời

2

Phương pháp đột biến lưu trữ Vuex không cung cấp quyền truy cập trực tiếp vào getters.

Đây có lẽ là thói quen xấu, nhưng bạn có thể vượt qua một tham chiếu đến getters khi cam kết một đột biến như vậy:

actions: { 
    fooAction({commit, getters}, data) { 
    commit('FOO_MUTATION', {data, getters}) 
    } 
}, 
mutations: { 
    FOO_MUTATION(state, {data, getters}) { 
    console.log(getters); 
    } 
} 
+0

Cảm ơn! Tôi sẽ đi với một hành động như vậy có vẻ thích hợp hơn. Tôi đồng ý rằng đi dọc theo getters là một cách giải quyết, nhưng tôi đã không nghĩ về điều đó tuy nhiên. Cảm ơn bạn đã làm rõ! :-) – Andy0708

Các vấn đề liên quan