【问题标题】:How Do I Use Axios to Post Form Data?如何使用 axios 发布表单数据?
【发布时间】:2018-12-25 17:14:39
【问题描述】:

我正在开发一个带有 springboot 后端和 Vue 前端的项目。现在我可以从我的数据库中获取产品列表。我可以获取列表并将其显示在页面上,但我正在尝试使用表单来发布新产品。我能够成功设置 POST 方法,但只能发送硬编码信息。

使用 Vuex,我应该更新状态然后发布还是只使用操作将表单数据直接发布到我的后端?最佳做法是什么?我该怎么做?

请注意,我遇到的区域是组件中的“data: function()”和“submitProduct”操作。

这是我的 Vue 组件

<template>
  <div>
    <h1>Products</h1>
    <br/>
    <ul>
      <li v-for="product in products">{{product.name}} - {{product.description}}</li>
    </ul>
    <br/>
    <form id="newproductform" @submit="submitProduct">
      <h4>New Product</h4>
      <p>
        <label for="name">Name: {{name}}</label>
        <input type="text" name="name" id="name" v-model="name">
      </p>

      <p>
        <label for="description">Description: {{description}}</label>
        <input type="text" name="description" id="description" v-model="description">
      </p>

      <p>
        <input type="submit" value="Submit">
      </p>
    </form>
  </div>
</template>

<script>
import {mapState, mapGetters, mapActions} from 'vuex'

export default {
  name: 'Products',
  data: function () {
    return {
      name: '',
      description: ''
    }
  },

  computed: {
    ...mapState({
      products: state => state.products
    }),

    ...mapGetters({
    })
  },

  methods: {
    ...mapActions({
      loadProducts: 'loadProducts',
      submitProduct: 'submitProduct'
    })
  },

  created () {
    this.loadProducts()
  }
}

</script>

<style scoped>

</style>

这是我的 store.js

import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(Vuex)
Vue.use(VueAxios, axios)

export default new Vuex.Store({
  modules: {},

  state: { // data
    products: []
  },

  getters: { // computed properties
    // getter (state, getters)
    allProducts: state => state.products
  },

  actions: { // actions store methods
    // action (context)
    loadProducts: function ({commit}) {
      axios
        .get('http://localhost:8081/product')
        .then(request => request.data._embedded.product)
        .then(product => {
          commit('setProductToState', product)
        })
    },

    addNewProductToState: function ({commit}) {
      commit('setNewProductToState')
    },

    submitProduct: function () {
      axios
        .post('http://localhost:8081/product', {
          name: '' + this.data.name,
          description: '' + this.data.description
        })
    }
  },

  mutations: {
    // mutation (state, payload)
    setProductToState (state, product) {
      state.products = product
    }
  }
})

【问题讨论】:

    标签: api vue.js axios vuex


    【解决方案1】:

    您的代码中存在多个问题:

    1. 您正在使用组件的 data 对象作为表单的模型,但您永远不会使用更改后的值来改变您的状态
    2. 您应该利用传递给 Vuex 存储 (https://vuex.vuejs.org/guide/actions.html) 中每个操作的上下文:

    改变这个:

    submitProduct: function () {   
        axios.post('http://localhost:8081/product', {
          name: '' + this.data.name,
          description: '' + this.data.description
        }) 
    }
    

    到这里:

    submitProduct: function (context) {
      axios
        .post('http://localhost:8081/product', {
          name: '' + context.store.name,
          description: '' + context.store.description
        })
    }
    

    我可能还建议不要在商店内定义特定于组件的操作。这些操作应该用于与商店相关的操作。

    【讨论】:

    • 感谢您的回复!我已经尝试过几次更新状态,但在概念化它时遇到了麻烦。最佳做法是使用新产品更新我的产品状态还是为新产品创建新状态?
    • 问题是:你真的需要商店吗?您是否需要从应用的其他部分访问产品?
    • 我不确定。我仍在学习和尝试使用 vue。我可能会决定以后在商店里需要它,或者我以后可能在商店里需要别的东西。我一直无法使用表单数据将新产品发布到我的数据库。
    • 好吧,让我换个方式问:为什么不从组件本身发布,然后仅通过提交突变将新产品提交/添加到商店?我现在不在电脑旁,但我可以在明天的答案中添加更多信息
    • 我可以尝试从组件本身发布,但无需向商店提交突变,因为我是在创建时从我的数据库中获取产品。问题是,我需要弄清楚如何发布表单数据,无论它在哪里。
    【解决方案2】:

    想通了。

    只是不得不这样做

    submitProduct: function () {
      const name = document.getElementById('name').value
      const description = document.getElementById('description').value
      axios
        .post('http://localhost:8081/product', {
          name: name,
          description: description
        })
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 2020-02-05
      • 2018-12-24
      • 2017-09-01
      相关资源
      最近更新 更多