Vuex: Başka Bir Modülden Erişim Durumu


100

Ben erişmek istediğiniz state.sessioniçinde instance.jsgelen records_view.js. Bu nasıl başarılır?

store / modüller / instance.js

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

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

store / module / 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
    );
  }
};

Bu biraz daha fazla bağlam içindir.

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
  }
});

Yanıtlar:


141

stateyerel durumu referans alır ve rootStatediğer modüllerin durumuna erişilirken kullanılmalıdır.

let session = context.rootState.instance.session;

Belgeler: https://vuex.vuejs.org/en/modules.html


15
Doğrudan durum yerine bir alıcıya erişmek istiyorsanız, yalnızca eklemek için context.rootGetters gibi şeyler de yapabilirsiniz.
Brad

Doğru olsa da yukarıdaki cevap eksiktir. Aşağıdaki gönderi, yukarıda atıfta bulunulan bağlamın eyleme nasıl aktarılacağını göstermektedir.
Luke F.

43

bir eylemden:

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

  },

4
Bu, soruyu yanıtlasa da, kodun neden referanslarla çalıştığına dair bir açıklama sağlamak her zaman iyidir.
Tim Hutchison

Yeni başlayanlar için yukarıdaki sözdizimi kafa karıştırıcıdır. Bağlamı bir argüman olarak aktarmak ve ardından commit ve rootstate'e bunun üzerinden erişmek daha iyidir. Steno kafa karıştırıcı. Anlaşılması daha kolay: 'kişiler: güncelle' (bağlam) {console.log ('rootState', context.rootState.users.form) ...... context.commit .......},
Luke F.10

@LukeF. - Bu, Vuex belgelerinde bir kereden fazla kullanılan standart sözdizimidir ve ayrıca hemen hemen her yerde kullanılma şeklidir. Eylem belgelerine bakmış olan herkes, orada verilen yıkım açıklamasıyla birlikte orada görmüş olacaktır.
Dan

Aslında. Aynı zamanda, belgeler açık olsaydı çoğumuz burada olmazdık. :)
Luke F.

Burada ayrıca, Vue belgelerinin sağladığı alıntıdan daha erişilebilir bir referans / açıklama bulunmaktadır: Courses.bekwam.net/public_tutorials/… .
Luke F.

7

Benim için vuex modüllerim vardı, ancak STATE'i farklı bir dosyada güncellemek için bir mutasyona ihtiyacım vardı. Bunu ekleyerek başardı

Modülde bile, console.log (this.state) aracılığıyla hangi global duruma erişebildiğinizi görebilirsiniz.

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

2

Benim durumumda, benim için böyle çalıştı.

ModuleA.js dosyasında:

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

ModuleB dosyasında:

export const state = {
    parameterInB: 'B'
 }

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

Kök için index.js'de ModuleA & B'yi içe aktarmanız gerekir:

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

Bu şekilde, durum parametresi alt modüllerde çapraz referans alınabilir.


-3

Alıcılarınızdasession erişmek için durumunuzda aşağıdaki gibi tanımlamanız gerekir :

const state = {
  session: ''
}

Bu durum değerini ayarlamak için eylemlerinizden çağrılacak bir mutasyon yazmalısınız .


Burada bahsettiğiniz her şey bende var. Oturuma bir bileşenin içinden erişebiliyorum, ancak oturuma başka bir Vuex modülünden (yani, records_view.js) nasıl erişeceğimi bilmiyorum.
Donnie

3
@Donnie trycontext.rootState.instance.session
Saurabh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.