Vuejs 道具未定义

Vuejs Prop is undefined

我正在尝试创建一个应用程序,我们可以在其中创建一个具有名称、描述、发布日期等的 Book 实例。对于前端,我使用的是 Vuejs,后端是 Django。

为了创建新的 Book 实例,我创建了一个名为 BookEditor.vue 的视图。我正在尝试使用相同的视图来编辑 Book 实例。

为了编辑本书,路由器 link 被放置在另一个名为 BookActions.vue 的组件中。

<template>
  <div>
    <router-link
      :to="{ name: 'book-editor', params: { slug: slug } }"
      >Edit
    </router-link>
  </div>
</template>

<script>
import { apiService } from "@/common/api.service";

export default {
  name: "BookActions",
  props: {
    slug: {
      type: String,
      required: true,
    },
  }
};
</script>

单击路由器 link 后,用户将导航至 BookEditor.vue。以下是路由器代码。

const routes = [
  {
    path: "/book-editor/:slug?",
    name: "book-editor",
    component: BookEditor
  }
];

以下是 BookEditor.vue 代码。

export default {
  name: "BookEditor",
  props: {
    slug: {
      type: String,
      required: false,
    },
  },
  data() {
    return {
      tag_id_list: [],
      published_on: null,
      book_name: null,
      book_description: null,
      error: null,
      isUpdateEditor: false,
    };
  },
  methods: {
    onSubmit() {
       if {.....}
       else {
        let endpoint = "/api/books/";
        let method = "POST";
        if (this.slug !== undefined) {
          endpoint += `${this.slug}/`;
          method = "PUT";
        }
        apiService(endpoint, method, {
          name: this.book_name,
          published_on: this.published_on,
          description: this.book_description,
          tag_id_list: this.tag_id_list,
        }).then((book_data) => {
          this.$router.push({
            name: "book",
            params: { slug: book_data.slug },
          });
        });
      }
    },
  },
  async beforeRouteEnter(to, from, next) {
    if (to.params.slug !== undefined) {
      let endpoint = `/api/books/${to.params.slug}/`;
      let data = await apiService(endpoint);
      return next((vm) => {
        (vm.book_name = data.name),
          (vm.started_on = data.started_on),
          (vm.published_on= data.published_on),
          (vm.isUpdateEditor = true);
      });
    } else {
      return next();
    }
  },
  created() {
    document.title = "Book Editor";
  },
};
</script>

当用户导航到 Book Editor 时,slug 属性是未定义的,如果我们尝试更新任何一本书,总是会创建一本新书。

我已经探索了各种问题,但无济于事。

你的 beforeRouteEnter 守卫应该在工作所以我假设你的问题是关于 onSubmit 访问 this.slug 道具。您必须在路由定义中设置 props: true 才能将路由参数分配给道具:

const routes = [
  {
    path: "/book-editor/:slug?",
    name: "book-editor",
    component: BookEditor,
    props: true       // <-- Add this
  }
];

来自 Vue 路由器 docs:

When props is set to true, the route.params will be set as the component props.