zoukankan      html  css  js  c++  java
  • [Vuex] Perform Async Updates using Vuex Actions with TypeScript

    Mutations perform synchronous modifications to the state, but when it comes to make an asynchronous operation, they become useless.

    Actions are a higher layer on the Vuex pattern, which allow to call mutations asynchronously or even call multiple mutations. This lesson guides you through using Vuex actions and type-safe them with TypeScript.

    We want to add a todo by calling a API to get a todo from a server, then add into our todo app.

    The idea is using 'Actions' to make Async request, then calling 'Mutations' with response data.

    import {GetterTree, MutationTree} from 'vuex';
    import {State} from '../types';
    import {Todo} from '../types';
    
    const state: State = {
        todos: [
            {text: 'Buy milk', checked: false},
            {text: 'Learning', checked: true},
            {text: 'Algorithom', checked: false},
        ],
    };
    
    export const getters: GetterTree<State, any> = {
        todos: state => state.todos.filter(t => !t.checked),
        dones: state => state.todos.filter(t => t.checked)
    };
    
    export const mutations: MutationTree<State> = {
        addTodo(state, newTodo) {
            const copy = {
                ...newTodo
            };
            state.todos.push(copy);
        }
    };
    
    export const actions: ActionTree<tate, any> = {
        addTodoAsync(context, id) {
            fetch('https://jsonplaceholder.typicode.com/posts/'+id)
                .then(data => data.json())
                .then(item => {
                    const todo: Todo = {
                        checked: false,
                        text: item.title
                    }
    
                    context.commit('addTodo', todo);
                })
        }
    }
    
    export default state;

    Add into root Store:

    import Vue from 'vue';
    import Vuex from 'vuex';
    
    import todos, {getters, mutations, actions} from './todos';
    
    Vue.use(Vuex);
    
    export default new Vuex.Store({
      state: {
        ...todos,
      },
      getters,
      mutations,
      actions
    });

    Using '@Action' inside component:

    <template>
    <section>
        <h4>Todos</h4>
        <ul>
          <li v-for="todo in todos">{{ todo.text }}</li>
        </ul>
        <h4>Done</h4>
        <ul>
          <li v-for="todo in dones">{{ todo.text }}</li>
        </ul>
        <p>
          <label for="">
            Add todo:
            <input type="text" v-model="newTodo.text" @keyup.enter="addTodo(newTodo)">
          </label>
          <label for="">
            Add todo async:
    <input type="text" v-model="id" @keyup.enter="addTodoAsync(id)">
          </label>
    
        </p>
    </section>
    </template>
    
    <script lang="ts">
    import {Component, Vue} from 'vue-property-decorator';
    import {Action, State, Getter, Mutation} from 'vuex-class';
    import {Todo} from '../types';
    
    @Component({
    })
    export default class Todos extends Vue {
        @Getter todos: Todo[];
        @Getter dones: Todo[];
    
        @Mutation addTodo;
        @Action addTodoAsync;
    
        newTodo: Todo = {
          text: '',
          checked: false
        }
    
        id: string = '1';
    }
    </script>
  • 相关阅读:
    C语言中返回字符串函数的四种实现方法
    (转)大整数除法jva.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常的解决方法
    @Transactional使用try->catch捕获异常并回滚方法
    Golang1.13.x 解决go get 无法下载问题
    Zookeeper:Unable to read additional data from client sessionid 0x00, likely client has closed socket
    解决Linux系统下面javamelody图片中文乱码问题
    mybatis查询mysql的datetime类型数据时间差了14小时
    以太坊多重钱包离线签名
    Solidity智能合约如何判断地址为0或空
    Solidity开发注意
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10784316.html
Copyright © 2011-2022 走看看