Vuex
https://vuex.vuejs.org/ja/guide/actions.html
Storeフォルダにデータ管理機能を作る
state
mutation
action
module(別記事)
<template> <div> <p >{{$store.state.counter}}</p> <p @click="clicked_inc">increment: {{cnt}}</p> <p @click="clicked_inc_n(2)">increment_n: {{cnt}}</p> <p @click="clicked_inc_payload">increment_payload: {{cnt}}</p> <p @click="clicked_inc_obj">increment_obj: {{cnt}}</p> <p @click="inc_method">inc_method: {{cnt}}</p> <p @click="clicked_inc_action">increment action: {{cnt}}</p> <p @click="clicked_inc_action_async">increment action Async: {{cnt}}</p> <p @click="clicked_inc_action">action_inc_method: {{cnt}}</p> <p @click="clicked_inc_action_async">action_inc_async_method: {{cnt}}</p> <p @click="inc_action_async_method">action_inc_async_method: {{cnt}}</p> <p @click="action_inc_payload(5)">inc_action_payload: {{cnt}}</p> <p @click="clicked_actionA_async">clicked_actionA_async: {{cnt}}</p> <ul> <!-- <li v-for="t in $store.state.Book.books"> --> <li v-for="t in books"> <span>{{ t.title }}</span> </li> </ul> <button @click="add_book">ADD</button> <!-- <ul> <li v-for="todo in todos"> <input type="checkbox" :checked="todo.done" @change="toggle(todo)"> <span :class="{ done: todo.done }">{{ todo.text }}</span> </li> <li><input placeholder="What needs to be done?" @keyup.enter="addTodo"></li> </ul> --> </div> </template> <!-- JS VERSION <script> import { mapMutations } from 'vuex' export default { computed: { todos () { return this.$store.state.todos.list } }, methods: { addTodo (e) { this.$store.commit('todos/add', e.target.value) e.target.value = '' }, ...mapMutations({ toggle: 'todos/toggle' }) } } </script> --> <script lang="ts"> // TS VER. import { Component, Vue, namespace } from 'nuxt-property-decorator' // import { Vue, Component, namespace } from 'vue-property-decorator' import { mapMutations, mapActions } from 'vuex' const StoreBook = namespace('Book') @Component({ methods: { ...mapMutations({ toggle: 'toggle' }), ...mapMutations({ inc_method: 'increment' }), ...mapActions( {inc_action_async_method: 'action_inc_async'} ), // `this.add()` を `this.$store.dispatch('increment')` にマッピングする] ...mapActions( ['action_inc_payload', ]), // `this.add()` を `this.$store.dispatch('increment')` にマッピングする] } }) export default class extends Vue { @StoreBook.Mutation add @StoreBook.Mutation all //------------------------------------------ // getter //------------------------------------------ private get cnt(): number { return this.$store.state.counter } private get books():[] { return this.$store.state.Book.books } //------------------------------------------ // mutation //------------------------------------------ clicked_inc(): void{ this.$store.commit('increment') } clicked_inc_n(n): void{ this.$store.commit('increment_n', n) } clicked_inc_payload(): void{ this.$store.commit('increment_payload', {amount: 3} ) } clicked_inc_obj(): void{ this.$store.commit( {type:'increment_payload', amount: 4} ) } //------------------------------------------ // action //------------------------------------------ clicked_inc_action(): void{ this.$store.dispatch('action_inc') } clicked_inc_action_async(): void{ this.$store.dispatch('action_inc_async') } //非同期処理ー成功処理実装 //clicked_actionA_async(): void{ // this.$store.dispatch('actionA').then(()=>{ // console.log("finished") // }) //} // 非同期処理ー成功、失敗処理実装 // clicked_actionA_async(): void{ // this.$store.dispatch('actionA').then(()=>{ // console.log("success") // }, // ()=>{ // console.log("error") // }) // } // 非同期処理ーCallback分けた場合 successCallback(): void { console.log("It succeeded with " ) } failureCallback(): void { console.log("It failed with " ) } clicked_actionA_async(): void{ this.$store.dispatch('actionA').then( this.successCallback, this.failureCallback) } // private get todos(): Object { // return this.$store.state.todos.list // } get_books():Object[]{ console.log("get_books" ) return this.all(); } add_book(el): void{ var b = { title:"title1",text:"abc" } this.add(b) } addTodo(e): void { this.$store.commit('add', e.target.value) e.target.value = '' } } </script> <style> .done { text-decoration: line-through; } </style>
store/index.ts
export const state = () => ({ counter: 0 }) export const mutations = { increment (state) { state.counter++ }, increment_n (state, n) { state.counter += n }, increment_payload (state, payload) { state.counter += payload.amount } } export const actions = { // action_inc (context) { // context.commit('increment') // } // 上に同じ // action_inc ( {commit} ) { // commit('increment') // }, action_inc ( {commit} ) { commit('increment') }, action_inc_payload ( {commit} ,payload) { commit('increment_n',payload) }, async action_inc_async( {commit} ) { setTimeout(() => { commit('increment') }, 2000) }, actionA( {commit} ){ //Promiseを戻せる。 return new Promise((resolve,reject)=>{ setTimeout(() => { commit('increment') // 成功 resolve() // 失敗 // reject() }, 2000) }); }, }
store/Book/index.ts