मैं Vuex में एक अन्य गटर से एक गेट्टर कैसे कह सकता हूं?


104

एक सरल Vue ब्लॉग पर विचार करें:
मैं अपने डेटासंग्रह रूप Vuex उपयोग कर रहा हूँ और मैं दो सेट करने की आवश्यकता ही टिककर खेल : एक getPostएक पुन: प्राप्त करने के लिए गेटर postके रूप में अच्छी तरह से एक के रूप में, आईडी के आधार पर listFeaturedPostsहै कि रिटर्न प्रत्येक विशेषताओं पद के पहले कुछ वर्ण। विशेष रुप से प्रदर्शित पदों के लिए डेटास्टोर स्कीमा उनके आईडी द्वारा पोस्टों को संदर्भित करता है। अंश दिखाने के उद्देश्यों के लिए इन आईडी को वास्तविक पदों पर हल करने की आवश्यकता है।

दुकान / 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',
  ]
}

दुकान / 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);
}

दुकान / 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
})

प्रलेखन के अनुसार, gettersपैरामीटर का उपयोग अन्य गेटर्स तक पहुंचने के लिए किया जा सकता है। हालाँकि, जब मैं gettersअंदर से प्रवेश करने की कोशिश करता हूं, तो listFeaturedPostsयह खाली होता है, और मुझे getters.getPostउस संदर्भ में अपरिभाषित होने के कारण कंसोल में एक त्रुटि मिलती है।

ऊपर दिए गए उदाहरण में मैं getPostअंदर से Vuex गटर के रूप में कैसे कॉल करूं listFeaturedPosts?

जवाबों:


171

VueJS 2.0 में, आपको दोनों stateऔर पास करना होगा getters

2 वें तर्क के रूप में गेटर्स को अन्य प्राप्तकर्ताओं को दिया जाता है :

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

आधिकारिक दस्तावेज: https://vuex.vuejs.org/guide/getters.html#property-style-access


18

gettersस्थानीय और गैर-नामांकित गेटर्स तक पहुंचने के लिए दूसरे तर्क के रूप में पास करें । नामांकित मॉड्यूल के लिए, आपको दूसरे मॉड्यूल में परिभाषित गेटर्स तक पहुंचने के लिए rootGetters( 4 वें तर्क के रूप में) का उपयोग करना चाहिए :

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

3
यह दूसरे vuex मॉड्यूल से एक गेट्टर की आवश्यकता वाले लोगों के लिए उपयोगी है। मैं सिर्फ इस बात पर जोर देना चाहता था कि तर्कों को जवाब में दिखाए गए विशिष्ट क्रम में होना चाहिए, जिसमें कोई तर्क नहीं छोड़ा गया है, ताकि वह काम कर सके।
एलजेएच

13

मैंने बिना परीक्षण stateकिया और काम नहीं किया। इसलिए stateजरूरी है।

यह काम:

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

यह काम नहीं किया

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

1
मैं जोड़ना चाहूंगा कि यह किसी भी संस्करण में काम नहीं करता है। नाम के तर्कों के साथ ऑब्जेक्ट विनाशकारी को भ्रमित नहीं किया जाना चाहिए ('राज्य' को छोड़ने के लिए मूल सुझाव में उत्तर देखें)। यह वास्तव में है (राज्य,
गेटर्स

2
दूसरे उदाहरण में आप stateऑब्जेक्ट का नामकरण कर रहे हैं gettersऔर दूसरे तर्क की अनदेखी कर रहे हैं जो वास्तविक gettersऑब्जेक्ट होगा। यदि आप gettersइस उदाहरण में आत्मनिरीक्षण करने वाले थे , तो आप देखेंगे कि यह वास्तव में आपकी राज्य वस्तु थी।
mraaroncruz

10

दूसरे तर्क के रूप में गेटर्स को दूसरे गेटर्स मिलते हैं

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

यहाँ आधिकारिक डॉक्स के लिए एक लिंक है - https://vuex.vuejs.org/guide/getters.html#property-style-access


2
के लिए अंगूठे: ए) एक स्पष्ट कोड उदाहरण बी) डॉक्स में उचित स्थान के लिए लिंक
काटिंका हेसेलिंक

1
क्या इसके बजाय इस तरह लिखना भिन्न है? getters: {didTodos: state => {return State.todos.filter (todo => todo.done)}, कियाTTodosCount: (स्टेट, गेटर्स) => {{this.getters.dodTodos.length}}
Rivo

@Rivo जहाँ तक मुझे पता है आप ऐसा नहीं कर सकते। यदि आप कोशिश करते हैं तो आपको इस तरह की त्रुटि मिलेगी: [Vue चेतावनी]: रेंडर करने में त्रुटि: "TypeError: अपरिभाषित की संपत्ति 'प्राप्तकर्ताओं को नहीं पढ़ सकता है"
OziOcb

-3

राज्य को पारित करने के बजाय , गेटर्स पास करें और फिर किसी अन्य गेट्टर को कॉल करें जिसे आप चाहते हैं। आशा करता हूँ की ये काम करेगा।

अपने स्टोर / getters.js में

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

2
मुझे लगता है कि आप तर्क के साथ विनाशकारी वस्तु को भ्रमित कर रहे हैं। फ़ंक्शन का पहला तर्क राज्य है, दूसरा गेट्स ऑब्जेक्ट है। आप पहले तर्क 'गेटर्स' का नाम दे सकते हैं, लेकिन यह अभी भी राज्य होगा! आप के लिए देख रहे हैं: निर्यात डिफ़ॉल्ट फू = (राज्य,
गेटर्स

याexport default foo = ({ getters }) => { return getters.anyGetterYouWant }
गैरीएमसीएम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.