2016-07-18 1 views
1

Предположим, у вас есть простой компонент приложения с кнопкой для добавления нескольких счетчиков из компонента счетчика с помощью хранилища vuex.Каков правильный способ использования компонентных реквизитов в приемнике Vuex?

Here is the whole thing on webpackbin.

Немного как базовый пример счетчика с vuex git repo .Но вы хотите использовать vuex поглотитель с идентификатором, который передан через свойство на компоненте, как бы вы сделали это?

Геттер должен быть чистой функцией, поэтому вы не можете использовать this.counterId. Официальные документы говорят, что вы должны использовать вычисленное свойство, но это тоже не работает. Этот код возвращает неопределенный для получателя:

import * as actions from './actions' 

export default { 
    props: ['counterId'], 
    vuex: { 
     getters: { 
      count: state => state.counters[getId] 
     }, 
     actions: actions 
    }, 
    computed: { 
     getId() { return this.counterId } 
    }, 
} 
+0

ваш код кажется правильным. Идея вычислительного свойства «getId» заключается в том, что вы используете свойства из своего компонента, а не из своего государства. В вашем случае вы делаете то и другое. Ничего плохого в этом, но обратите внимание на свою логику при вызове getId() и что вы получаете от него. –

+0

id - это только индекс массива. само вычисляемое свойство отлично работает. геттер по-прежнему возвращает undefined, поэтому должно быть что-то не так. Я использую вычислимое свойство, потому что вы не можете использовать 'this' в getter по определению. – Chris

ответ

4

геттеры должны быть чистыми функциями и не зависят от состояния компонента.

вы можете обрешеткой вычисляемый проп от добытчика, или непосредственно использовать магазин:

//option A 
export default { 
    props: ['counterId'], 
    vuex: { 
     getters: { 
      counters: state => state.counters 
     }, 
     actions: actions 
    }, 
    computed: { 
     currentCounter() { return this.counters[this.counterId] } 
    }, 
} 

//option B (better suited for this simple scenario) 
import store from '../store' 
computed: { 
    currentCounter() { 
    return store.state.counters[this.counterId] 
    } 
} 
+0

Добавлены обе версии на webpackbin [Версия A] (http://www.webpackbin.com/NkgzMe8Db) - [Версия B] (http://www.webpackbin.com/NyXxnxUPW) Как правило, это работает, но мутации Не обновляйте счетчик. Я могу увеличить счетчик несколько раз, и он обновляется только при использовании функции AddCounter для добавления нового. – Chris

+0

Это была проблема ваших мутаций. вы увеличили значения с помощью 'state.counter [counterId] ++', которые Vue не смог обнаружить (http://vuejs.org/guide/list.html#Caveats). Вместо этого я использовал .splice(), и он работает: http://www.webpackbin.com/Vy_BMMIwZ (также изменил Couter.vue, чтобы получить счетчик) –

+0

Хорошо, понял, вы были правы. Я забыл использовать state.counters. $ Set (counterId, state.counters [counterId] + 1) вместо ++ в мутациях объектов магазина ... – Chris

Смежные вопросы