前提
「vuex state値をmounted内で使いたい」とタイトルをつけさせていただきましたが、
下記に紹介するソース・目的とするゴールが本当にvue.jsの規定に沿っているのか自体が不安と考えております、合わせてご意見をいただけましたら今後のわたくしの勉強にもなると思います、お手数ではございますがよろしくお願いいたします。
##ソース
####store/posts.js(vuexのソース)
js
1export const state = () => ({ 2 postsCategories: null 3}) 4 5export const getters = { 6 postsCategories: state => state.postsCategories 7} 8 9export const mutations = { 10 setPostsCategories(state, postsCategories) { 11 state.postsCategories = postsCategories 12 } 13 14} 15 16export const actions = { 17 async addPostsCategory({ commit }, payload) { 18 const newCat = {} 19 newCat[payload.slug] = payload 20 //console.log(newCat) 21 await this.$axios.$patch('/postscategory.json', newCat) 22 const postsCategories = await this.$axios.$get('/postscategory.json') 23 //const postsCategories = await this.$axios.$get('/postscategory/' + payload.id + '.json') 24 commit('setPostsCategories', postsCategories) 25 }, 26 async postsCategories({ commit }) { 27 const postsCategories = await this.$axios.$get('/postscategory.json') 28 commit('setPostsCategories', postsCategories) 29 }, 30 31}
####テンプレートファイルの記述
html
1<template> 2 <section class="container posts-page"> 3 <multiselect :selected="selected" :options="options" :multiple="true" @update="updateSelected" v-model="payload.categories" placeholder="カテゴリー選択"></multiselect > 4 5 <ul> 6 <li v-for="(cat,index) in postsCategories" :key="index">{{ cat.name }}</li> 7 </ul> 8 </section> 9</template> 10 11<script> 12import { mapGetters } from "vuex"; 13import Multiselect from "vue-multiselect"; 14export default { 15 components: { Multiselect }, 16 data() { 17 return { 18 selected: null, 19 options:[] 20 }; 21 }, 22 methods: { 23 updateSelected(newSelected) { 24 this.selected = newSelected; 25 } 26 }, 27 mounted() { 28 const cat = this.$store.state.posts.postsCategories; 29 console.log(cat); 30 for (var value in cat) { 31 this.options.push(value); 32 } 33 }, 34 created() { 35 this.$store.dispatch("posts/postsCategories"); 36 }, 37 computed: { 38 ...mapGetters("posts", ["postsCategories"]) 39 } 40}; 41</script>
出来ていること
- 目的とするページに遷移をするとcreatedが作動、store/post.jsのpostsCategoriesという名のstateに格納しております。値はオブジェクトとして格納しております。
- computedのmapGettersでpostsCategoriesを getter関数として取得し、htmlにレンダリング可能です。
#実現したいこと
- multiselectという子コンポーネントにprops要素としてoptionsを設けております。渡す値をpostsCategoriesの"name"を基にした配列を入れたい。
- postsCategoriesはオブジェクトであるので配列に変換しなければならない。
- postsCategoriesの中身はこんな感じである
{ "nuxt": { "name": "Nuxt.js", "slug": "nuxt" }, "laravel": { "name": "Laravel", "slug": "laravel" }, "wp": { "name": "wordPress", "slug": "wp" }}
- mapGettersでgetterとして、postsCategoriesは取得しております、このpostsCategoriesをsetter関数として使うことはできるのか。
##試したこと
mountedにセットしようとしてみましたが、値はセットされませんでした。
mounted() { const cat = this.$store.state.posts.postsCategories; console.log(cat); for (var value in cat) { this.options.push(value); } },
上記の経験から、store.state値をどのようにsetterとして使えばよいのか、悩みだしました。
そもそもの考え方が違うのではないのかとも悩み始めております。
vue.js,vuexに詳しい方がいらっしゃいましたら、是非とも教えていただきたいです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/14 04:50 編集
2018/11/14 05:42 編集
2018/11/14 10:43