Thay đổi trạng thái mô-đun khác từ một mô-đun trong Vuex


80

Tôi có hai mô-đun trong cửa hàng vuex của mình.

var store = new Vuex.Store({
    modules: {
        loading: loading 
        posts: posts
    }
});

Trong mô-đun loading, tôi có một thuộc tính savingcó thể được đặt truehoặc falsevà cũng có một hàm đột biến được đặt tên TOGGLE_SAVINGđể đặt thuộc tính này.

Trong mô-đun posts, trước và sau khi tìm nạp các bài đăng, tôi muốn thay đổi thuộc tính saving. Tôi đang làm điều đó bằng cách gọi commit('TOGGLE_SAVING')từ một trong các hành động trong postsmô-đun.

var getPosts = function (context) {
    contex.commit(TOGGLE_LOADING);
};

Khi nó cố gắng cam kết, tôi gặp lỗi sau trong bảng điều khiển

[vuex] unknown local mutation type: TOGGLE_LOADING, global type: posts/TOGGLE_LOADING 

Làm cách nào để thay đổi trạng thái trong mô-đun khác bằng cách sử dụng commit?

Câu trả lời:


140

Hãy thử nó với các thông số sau như được đề xuất ở đây ;

commit('TOGGLE_LOADING', null, { root: true })

Nếu bạn đã namespacedđặt thành true (trong Nuxt là mặc định khi ở chế độ mô-đun), điều này sẽ trở thành:

commit('loading/TOGGLE_LOADING', null, { root: true })

11
Nếu bạn đang sử dụng mô-đun và không gian tên, đừng quên thêm không gian tên vào commit, commit('namespace/TOGGLE_SAVING', null, { root: true })nếu không, nó sẽ không hoạt động.
brainbag

3
Điều này không hiệu quả với tôi. Tôi chỉ nhận được 'loại đột biến không xác định'.
geoidesic

Tôi có một nhu cầu tương tự và câu trả lời của bạn đã giải quyết vấn đề của tôi. Cảm ơn bạn.
jedi

Cảm ơn rất nhiều! nó đã giúp tôi
Valary o

Tại sao root: true lại cần thiết cho điều này, liệu Nuxt có chắc chắn có thể tìm ra các đột biến của mô-đun khác không?
trainoasis

2

bạn có thể sử dụng hành động để thực hiện đột biến được xác định trong mô-đun khác, sau đó bạn sẽ sửa đổi trạng thái trong mô-đun khác.

như thế này:

posts: {
  actions: {
    toggleSavingActions(context) {
      // some actions 
      context.commit("TOGGLE_SAVING"); // defined in loading module
    }
  }
}

1
Đây là cách chính xác mà tôi đã làm. Tôi cũng đặt "không gian tên: true" trong cả hai mô-đun. Nhưng tôi đang nhận được[vuex] unknown local mutation type: TOGGLE_LOADING, global type: posts/TOGGLE_LOADING
Fizer Khan

1
ồ vâng. theo mặc định, các hành động, đột biến và bộ chuyển đổi bên trong mô-đun vẫn được đăng ký trong không gian tên chung. Vì vậy, bạn có thể xóa thuộc tính không gian tên hoặc sử dụng cam kết ('someMutation', null, {root: true})
Julien

1
Trong trường hợp của tôi nếu tôi sử dụng namespace: true, tôi cần thực hiện bước tiếp theo:commit('my_module_name/someMutation', null, { root: true })
TitanFighter vào

Một cam kết là đồng bộ trong khi một hành động là không đồng bộ, vì vậy bạn không nên sử dụng một hành động để thực hiện một đột biến.
omarjebari

1

Bạn cũng có thể nhập cửa hàng, như bạn thường làm trong bất kỳ tệp js nào và sử dụng nó. Ví dụ:

// src/state/modules/posts.js

import store from '@/state/store'
...
store.commit('posts/TOGGLE_LOADING')
...

Điều này hoạt động khá tốt, điều duy nhất là có thể làm khó các bài kiểm tra cô lập hoặc mô phỏng.


Phiên bản : Gần đây tôi đã loại bỏ tất cả mã bằng cách sử dụng kỹ thuật mà tôi đề cập do các vấn đề thử nghiệm. Thật vậy, bạn luôn có thể thay đổi trạng thái của các mô-đun khác theo cách được khuyến nghị, như trong ví dụ này. Rất hữu ích nếu bạn quản lý xác thực và hồ sơ trong mô-đun bản năng.

logout: context => {
  return new Promise((resolve) => {
    // Clear token in all axios requests
    axios.defaults.headers.common['Authorization'] = ''
    // Logout from firebase
    firebase
      .auth()
      .signOut()
      .then(() => {
        // Update state in profile module
        context.commit('profile/SET_USER', null, {
          root: true
        })
        resolve()
      })
      .catch(error => reject(error))
  })
}

thêm null + thiết lập gốc true thực sự hoạt động. Đã tự hỏi tại sao điều này lại cần thiết? nuxt sẽ có thể tìm ra nơi cư trú của cam kết bên ngoài?
trainoasis
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.