Vuex: Trạng thái truy cập từ mô-đun khác


100

Tôi muốn truy cập state.sessiontrong instance.jstừ records_view.js. Làm thế nào điều này được hoàn thành?

store / modules / instance.js

const state = {
  // This is what I want to access in records_view.js
  session: {}
};

const getters = {
  sessionGetter: state => state.session
};

store / modules / records_view.js

const actions = {
  getSettingsAction (context, props) {
    // This is how I'm trying to access session, which doesn't work
    let session = context.state.instance.session;

    Api(
      context,
      {
        noun: props.noun,
        verb: 'GetRecordsViewSettings',
        orgUnitKey: _.has(session, 'orgunit.key') ? session.orgunit.key : '',
        data: {}
      },
      props.callback
    );
  }
};

Đây là một chút ngữ cảnh được thêm vào.

store / index.js

import Vue from 'vue';
import Vuex from 'vuex';
import * as actions from './actions';
import * as getters from './getters';
import * as types from './mutation-types';

import instance from './modules/instance';
import recordsView from './modules/records_view';

Vue.use(Vuex);

export default new Vuex.Store({
  state,
  actions,
  getters,
  mutations,
  modules: {
    instance,
    recordsView
  }
});

Câu trả lời:


141

statetham chiếu trạng thái cục bộ và rootStatenên được sử dụng khi truy cập trạng thái của các mô-đun khác.

let session = context.rootState.instance.session;

Tài liệu: https://vuex.vuejs.org/en/modules.html


15
chỉ để thêm bạn cũng có thể thực hiện những việc như context.rootGetters nếu bạn muốn truy cập trực tiếp vào getter thay vì state.
Brad

Mặc dù chính xác nhưng câu trả lời trên là không đầy đủ. Bài đăng dưới đây minh họa cách chuyển ngữ cảnh được tham chiếu ở trên vào hành động.
Luke F.

43

từ một hành động:

'contacts:update' ({ commit, rootState }) {
    console.log('rootState', rootState.users.form)
    ......

  },

4
Mặc dù điều này có thể trả lời câu hỏi, nhưng luôn tốt nếu cung cấp giải thích tại sao mã hoạt động với các tham chiếu.
Tim Hutchison

Đối với người mới bắt đầu, cú pháp trên là khó hiểu. Tốt hơn là chuyển vào ngữ cảnh như một đối số và sau đó truy cập vào commit và rootstate thông qua nó. Tốc ký làm mất phương hướng. Điều này dễ hiểu hơn: 'Contacts: update' (context) {console.log ('rootState', context.rootState.users.form) ...... context.commit .......},
Luke F.

@LukeF. - Đây là cú pháp tiêu chuẩn được sử dụng trong tài liệu Vuex tất cả trừ một lần, và cũng là cách nó được sử dụng ở mọi nơi khác. Bất kỳ ai đã xem các tài liệu hành động sẽ thấy nó ở đó cùng với lời giải thích về sự phá hủy được đưa ra ở đó.
Dan

Thật. Đồng thời, nhiều người trong chúng ta sẽ không ở đây nếu tài liệu rõ ràng. :)
Luke F.

Đây cũng là tài liệu tham khảo / giải thích về cấu trúc hủy dễ truy cập hơn so với trích dẫn mà tài liệu Vue cung cấp: Course.bekwam.net/public_tutorials/… .
Luke F.

7

Đối với tôi, tôi đã có các mô-đun vuex, nhưng cần một đột biến để cập nhật STATE trong một tệp khác. Đã có thể thực hiện điều này bằng cách thêm NÀY

Ngay cả trong mô-đun, bạn có thể xem trạng thái toàn cầu mà bạn có quyền truy cập thông qua console.log (this.state)

const mutations = {
MuteChangeAmt(state, payload) {
//From user module; Need THIS keyword to access global state
this.state.user.payees.amount = payload.changedAmt;
 }
}

2

Trong trường hợp của tôi, đây là cách nó hoạt động đối với tôi.

Trong tệp ModuleA.js:

Module A:  
export const state = {
    parameterInA: 'A'
 }
export const action = {
    showParameterB() {
    console.log("Parameter B is: " + this.state.B. parameterInB)
}

Trong tệp ModuleB:

export const state = {
    parameterInB: 'B'
 }

export const action = {
    showParameterA() {
    console.log("Parameter A is: " + this.state.A.parameterInA)
}  

Bạn sẽ cần nhập ModuleA & B trong index.js cho thư mục gốc:

import * as A from 'ModuleA.js'  
import * as B from 'ModuleB.js'

Bằng cách này, tham số trạng thái có thể được tham chiếu chéo trong các mô-đun con.


-3

Bạn cần xác định sessiontrạng thái của mình như sau, để truy cập nó trong getters của bạn :

const state = {
  session: ''
}

Bạn phải viết một đột biến , đột biến sẽ được gọi từ các hành động của bạn để đặt giá trị trạng thái này.


Tôi có mọi thứ bạn đã đề cập ở đây. Tôi có thể truy cập phiên từ bên trong một thành phần, nhưng tôi không chắc làm thế nào để truy cập phiên từ bên trong một mô-đun Vuex khác (tức là records_view.js).
Donnie

3
@Donnie thửcontext.rootState.instance.session
Saurabh
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.