【问题标题】:Vue 2 - vuex mapGetters and pass paramsVue 2 - vuex mapGetters 和传递参数
【发布时间】:2018-01-08 07:21:31
【问题描述】:

是否可以使用 ma​​pGetters 传递参数?

我在主 Vue 实例中有这个:

computed: {
    filterAuthors() {
        return this.$store.getters.filterAuthors(this.search.toLowerCase());
    }
}

this.search 通过 v-model="search= 绑定到输入字段,在我的 Vuex 实例中我有这个 getter:

getters: {
    filterAuthors: (state) => (search) => {
        return state.authors.filter((author) => {
            return author.name.toLowerCase().indexOf(search) >= 0;
        })
    }
},

这个工作正常,但我正在尝试找到一种方法(如果可能的话)来使用 mapGetters 并传递参数。这个可以吗?

【问题讨论】:

    标签: vue.js vuejs2 vuex


    【解决方案1】:

    如果您确实想将参数传递到商店,这是您可以做的最接近的事情。但是,更好的处理方法是将参数也作为存储的一部分,并将 input 字段设置为具有相应 getter 和 setter 的计算属性以更新状态。然后你可以使用mapGetter 来获取结果。

    const { mapGetters } = Vuex
    
    const authorsInput = [{ name: 'Stephen King'}, { name: 'Neal Stephenson'}, { name: 'Tina Fey'}, { name: 'Amy Poehler'}, { name: 'David Foster Wallace'}, { name: 'Dan Brown'}, { name: 'Mark Twain'}]
    
    const store = new Vuex.Store({
      state: {
        srchInput: '',
        authors: authorsInput
      },
      getters: {
        filteredAuthors: (state) => state.authors
          .filter((author) => author
            .name
            .toLowerCase()
            .indexOf(state.srchInput.toLowerCase()) >= 0)
          .map((author) => author.name)
      },
      mutations: {
        UPDATE_SRCH_INPUT: (state, input) => state.srchInput = input
      },
    })
    
    new Vue({
      el: '#app',
      store,
       computed: Object.assign({
        srchInput: {
          get () { return store.state.srchInput},
          set (val) { store.commit('UPDATE_SRCH_INPUT', val) } 
        }
      }, mapGetters([
        'filteredAuthors'
      ]))
    })
    filterAuthors: (state) => (search) => {
            return state.authors.filter((author) => {
                return author.name.toLowerCase().indexOf(search) >= 0;
            })
        }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/2.3.1/vuex.js"></script>
    <div id="app">
     <div>
        <input type="text" v-model="srchInput"/>
        <ul>
          <li v-for="author in filteredAuthors">{{author}}</li>
        </ul>
      </div>
    </div>

    【讨论】:

      【解决方案2】:

      这确实可以! mapGetters 只是将 this.yourGetterName 映射到 this.$store.getters.yourGetterName(参见docs

      所以要完成你想要的:

      import { mapGetters } from 'vuex'
      
      export default {
        // ... the rest of your Vue instance/component
        computed: {
          // Mix your getter(s) into computed with the object spread operator
          ...mapGetters([
            'filteredAuthors'
            // ...
          ]),
          // Create another computed property to call your mapped getter while passing the argument
          filteredAuthorsBySearch () {
            return this.filteredAuthors(this.search.toLowerCase())
          }
        }
      }
      

      【讨论】:

      • 它不是这样工作的 - "TypeError: getter is not a function"
      猜你喜欢
      • 1970-01-01
      • 2017-10-04
      • 2020-11-22
      • 1970-01-01
      • 2020-06-22
      • 2022-01-17
      • 2020-05-01
      • 2019-06-11
      • 2020-09-28
      相关资源
      最近更新 更多