[Nuxt] Build a Vue.js Form then use Vuex Actions to Post to an API in Nuxt

Posted Answer1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Nuxt] Build a Vue.js Form then use Vuex Actions to Post to an API in Nuxt相关的知识,希望对你有一定的参考价值。

The default behavior of submitting an html form is to reload the page. You can use the Vue.js @submit.prevent syntax to avoid that behavior. Then wire together the @submitevent with an add Vuex action to handle an async post to an api. This lesson walks you through posting to an API using Vue.js, Vuex. and Nuxt.

 

<template>
     <form @submit="onSubmit(task)">
      <input v-model="task" type="text" />
    </form>
</template>

<script>
  import { mapState, mapActions } from vuex
  import {init} from ./shared

  export default {
    fetch: init,
    computed: {
      ...mapState({
        todos: (state) => state.todos
      })
    },
    data () {
      return {
        task: Some data
      }
    },
    methods: {
     onSubmit(task) {
       alert(task)
     }
    }
  }
</script>

Notice that after reload the page, when the form submit, the page reloads. 

 

To prevent page reloads every time we submit the form we can use:

<form @submit.prevent="onSubmit(task)">

 

To deal with the store, we can use ‘actions‘ in Vuex.Store and ‘mapActions‘ helpers:

<template>
  <div>
    <form @submit.prevent="add(task)">
      <input v-model="task" type="text" />
    </form>
    <article class="pa3 pa5-ns">
      <ul class="list pl0 ml0 center mw6 ba b--light-silver br2">
        <li v-for="todo of todos" class="ph3 pv3 bb b--light-silver">{{todo.task}}</li>
      </ul>
    </article>
  </div>
</template>

<script>
  import { mapState, mapActions } from vuex
  import {init} from ./shared

  export default {
    fetch: init,
    computed: {
      ...mapState({
        todos: (state) => state.todos
      })
    },
    data () {
      return {
        task: Some data
      }
    },
    methods: {
      ...mapActions([
        add
      ])
    }
  }
</script>

We change form submit to:

<form @submit.prevent="add(task)">

The ‘add‘ method map to action in store:

import Vuex from vuex
import axios from axios

const store = () => new Vuex.Store({
  state: {
    todos: [
    ]
  },
  mutations: {
    init (state, todos) {
      state.todos = todos
    },
    add (state, todo) {
      state.todos = [
        ...state.todos,
        todo
      ]
    }
  },
  actions: {
    async add (context, task) {
      const commit = context.commit
      const res = await axios.post(https://todos-cuvsmolowg.now.sh/todos, {
        task,
        complete: false
      })
      commit(add, res.data)
    }
  }
})

export default store

Inside, add function, we post the data to the backend, then we can use ‘commit‘ method to mutate the data in the store.

 

以上是关于[Nuxt] Build a Vue.js Form then use Vuex Actions to Post to an API in Nuxt的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nuxt.js (Vue.js) 中使用 vue-infinite-loading

基于 vue.js 的 SSR 技术 — Nuxt.js

如何在 Vue.js/Nuxt.js 中为 RepositoryFactory 编写测试

Nuxt学习笔记

[Nuxt] Setup a "Hello World" Server-Rendered Vue.js Application with the Vue-CLI and Nuxt(

Vue.js 和 Nuxt.js