【问题标题】:How to retrieve data from axios and fill it into an edit Form (select options) in Vue.js?如何从 axios 中检索数据并将其填充到 Vue.js 中的编辑表单(选择选项)中?
【发布时间】:2021-03-11 14:20:33
【问题描述】:

我有一个表单,可以编辑用户。为此,用户对象的数据(按 id)由 axios 检索并显示在输入字段中。输入字段和日期选择器没有问题 - 因此显示信息。但数据不会显示在选择字段中。我想显示之前选择的选项(我得到了另一个表单,你可以在其中创建一个用户。用户的ID是通过props传递的。),但是我得到一个错误如下:

[Vue warn]: Property or method "bundeslaender" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property.

vorgesetzten 出现同样的错误。也应该可以更改选定的选项。

Vue组件实现如下:

<template>
  <div>
    <b-container>
      <h2>Benutzer bearbeiten</h2>
      <b-form @reset="onReset" @submit.prevent="saveBenutzer" id="form">
        <b-form-group
          id="input-group-2"
          label="Benutzername:"
          label-for="input-2"
        >
          <b-form-input
            type="text"
            id="input-2"
            v-model="Benutzer.Benutzername"
            required
          ></b-form-input>
        </b-form-group>

        <b-form-group id="input-group-3" label="Passwort:" label-for="input-3">
          <b-form-input
            type="password"
            id="input-3"
            v-model="Benutzer.Passwort"
            required
          ></b-form-input>
        </b-form-group>

        <b-form-group id="input-group-4" label="Vorname:" label-for="input-4">
          <b-form-input
            type="text"
            id="input-4"
            v-model="Benutzer.Vorname"
            required
          ></b-form-input>
        </b-form-group>

        <b-form-group id="input-group-5" label="Nachname:" label-for="input-5">
          <b-form-input
            type="text"
            id="input-5"
            v-model="Benutzer.Nachname"
            required
          ></b-form-input>
        </b-form-group>

        <b-form-group
          id="input-group-6"
          label="Geburtsdatum:"
          label-for="input-6"
        >
          <b-form-datepicker
            id="input-6"
            v-model="Benutzer.Geburtsdatum"
            placeholder="Geburtsdatum auswählen"
            required
          ></b-form-datepicker>
        </b-form-group>

        <b-form-group id="input-group-7" label="Email:" label-for="input-7">
          <b-form-input
            type="email"
            id="input-7"
            v-model="Benutzer.Email"
            required
          ></b-form-input>
        </b-form-group>

        <b-form-group
          id="input-group-8"
          label="Betriebszugehörigkeit seit:"
          label-for="input-8"
        >
          <b-form-datepicker
            id="input-8"
            v-model="Benutzer.Eintrittsdatum"
            placeholder="Datum auswählen"
            required
          ></b-form-datepicker>
        </b-form-group>

        <b-form-group
          id="input-group-9"
          label="Bundesland:"
          label-for="input-9"
        >
          <b-form-select id="input-9" v-model="Benutzer.bundesland" required>
            <b-form-select-option
              v-for="bundesland in bundeslaender"
              :key="bundesland.BundeslandID"
              v-bind:value="bundesland"
            >
              {{ bundesland.Name }}
            </b-form-select-option>
          </b-form-select>
        </b-form-group>

        <b-form-group label="Zusätzliche Rolle:">
        <b-form-checkbox id="input-10" v-model="Benutzer.istVorgesetzter"
          >Vorgesetzter</b-form-checkbox
        >
        <b-form-checkbox id="input-11" v-model="Benutzer.istAdmin"
          >Admin</b-form-checkbox
        >
        </b-form-group>

        <b-form-group
          id="input-group-11"
          label="Vorgesetzter:"
          label-for="input-11"
        >
          <b-form-select id="input-11" v-model="Benutzer.Vorgesetzter" required>
            <b-form-select-option
              v-for="vorgesetzter in vorgesetzten"
              :key="vorgesetzter.BenutzerID"
              v-bind:value="vorgesetzter"
            >
              {{ vorgesetzter.Vorname + " " + vorgesetzter.Nachname }}
            </b-form-select-option>
          </b-form-select>
        </b-form-group>

        <b-button type="submit" variant="primary">Speichern</b-button>
        <b-button type="reset" variant="secondary">Abbrechen</b-button>
      </b-form>
    </b-container>
  </div>
</template>

<script>
import axios from "axios";
import { server } from "../helper.js";
export default {
  name: "editBenutzer",
  data() {
    return {
      BenutzerID: null,  
      Benutzer: {
        Benutzername: "",
        Passwort: "",
        Vorname: "",
        Nachname: "",
        Geburtsdatum: "",
        Email: "",
        Eintrittsdatum: "",
        bundesland: "",
        istAdmin: false,
        istVorgesetzter: false,
        Vorgesetzter: ""
      }
    };
  },
  created() {
    this.BenutzerID = this.$route.params.id;
    this.getBenutzer();
    /*this.getBundeslaender();
    this.getVorgesetzten();*/
  },
  methods: {
    onReset(evt) {
      evt.preventDefault();
        this.Benutzer.Benutzername = "";
        this.Benutzer.Passwort = "";
        this.Benutzer.Vorname = "";
        this.Benutzer.Nachname = "";
        this.Benutzer.Geburtsdatum = "";
        this.Benutzer.Email = "";
        this.Benutzer.Eintrittsdatum = "";
        this.Benutzer.bundesland = "";
        this.Benutzer.istAdmin = false;
        this.Benutzer.istVorgesetzter = false;
        this.Benutzer.Vorgesetzter = "";
      this.$router.push({ name: "benutzerverwaltung" });
    },
    getBenutzer(){
        axios.get(server.baseURL + '/benutzer/' + this.BenutzerID).then(response => 
        { this.Benutzer = response.data });
    },
    saveBenutzer() {
      let benutzerdaten = {
        Benutzername: this.Benutzer.Benutzername,
        Passwort: this.Benutzer.Passwort,
        Vorname: this.Benutzer.Vorname,
        Nachname: this.Benutzer.Nachname,
        Geburtsdatum: this.Benutzer.Geburtsdatum,
        Email: this.Benutzer.Email,
        Eintrittsdatum: this.Benutzer.Eintrittsdatum,
        bundesland: this.Benutzer.bundesland.BundeslandID,
        istAdmin: this.Benutzer.istAdmin,
        istVorgesetzter: this.Benutzer.istVorgesetzter,
        Vorgesetzter:
          this.Benutzer.Vorgesetzter.Vorname + " " + this.Benutzer.Vorgesetzter.Nachname,
      };
      this.updateBenutzer(benutzerdaten);
    },
    /*updateBenutzer(data) {
      axios.put(server.baseURL/customer/update?customerID=${this.id}`,
          customerData
        )
        .then(data => {
          router.push({ name: "home" });
        });
    },*/
    getBundeslaender() {
      axios
        .get(server.baseURL + "/bundesland")
        .then((response) => { this.bundeslaender = response.data });
    },
    getVorgesetzten() {
      axios
        .get(server.baseURL + "/benutzer/vorgesetzter?istVorgesetzter=true")
        .then((response) => { this.vorgesetzten = response.data });
    },
  },
};
</script>

【问题讨论】:

  • 显示组件代码以及如何从axios 获取数据并将其存储到组件数据中
  • 我添加了组件的代码。
  • 不,不要将 getBundeslaendergetVorgesetzten 添加为计算值,因为它们是异步的。你应该用createdmounted hook 来称呼他们
  • 对不起,我的意思是创建而不是计算。

标签: javascript vue.js axios nestjs


【解决方案1】:

您没有在数据部分定义bundeslaendervorgesetzten

应该是这样的:

data() {
    return {
      BenutzerID: null,  
      bundeslaender: [],
      vorgesetzten: [],
      Benutzer: {
        Benutzername: "",
        Passwort: "",
        Vorname: "",
        Nachname: "",
        Geburtsdatum: "",
        Email: "",
        Eintrittsdatum: "",
        bundesland: "",
        istAdmin: false,
        istVorgesetzter: false,
        Vorgesetzter: ""
      }
    };

【讨论】:

  • 谢谢!我添加了 bundeslaender: [] 和 vorgesetzten: [] 以及 this.getBundeslaender();和 this.getVorgesetzten();在计算部分,错误不再显示,但之前选择的选项仍然不显示。
  • bundesland 字段应该是字符串还是对象?
  • bundeslaender 是一个对象数组,所以bundesland 是一个对象,是的。 vorgesetzten 也是 Benutzer 对象的数组,但在 Vorgesetzter 中,只有该对象的 Vorname 和 Nachname 保存为字符串并传递给 axios(您可以在这一行看到它:Vorgesetzter: this.Benutzer.Vorgesetzter.Vorname + " " + this.Benutzer.Vorgesetzter.Nachname。这个(编辑)形式看起来和创建表单一模一样,只是保存功能不同,因为 axios url。
  • 我明白了。 v-bind:value="bundesland"表示你想保存Benutzer.bundesland中选中的整个对象,对吧?
  • 是的,没错。
猜你喜欢
  • 2021-05-24
  • 2019-10-07
  • 2013-12-11
  • 2020-08-11
  • 2021-05-20
  • 2014-06-13
  • 2012-08-14
  • 2015-10-06
  • 2016-04-23
相关资源
最近更新 更多