vue js中vue路由器的动态路由与strapi headless CMS - 路由器链接和href标签抛出错误

Posted

技术标签:

【中文标题】vue js中vue路由器的动态路由与strapi headless CMS - 路由器链接和href标签抛出错误【英文标题】:dynamic routing with vue router in vue js with strapi headless CMS - router link and a href tags throwing errors 【发布时间】:2021-06-01 10:16:13 【问题描述】:

我正在使用 vue js 构建一个 Strapi 网站。

在 Strapi 中,我有一个名为“网络研讨会”的自定义集合类型 - 要命中的端点如下所示:

const response = await axios.get('http://localhost:1337/webinars')

上面返回一个 JSON 对象。

要点击单个网络研讨会,每个网络研讨会都有一个唯一标识符,从 1 开始。点击单个网络研讨会 JSON 数据,如下所示:

const response = await axios.get('http://localhost:1337/webinars/1')

这将返回一个特定的网络研讨会。

我需要 2 个视图,一个是所有网络研讨会,一个是特定的。

所以要开始,请看下面我的路由器:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
import Webinars from '../views/Webinars.vue'

Vue.use(VueRouter)

const routes = [
  
    path: '/',
    name: 'Home',
    component: Home
  ,
  
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  ,
  
    path: '/webinars',
    name: 'Webinars',
    component: Webinars
  ,
  
    path: '/webinars/:id',
    name: 'Webinars',
    component: WebinarSingle
  
]

const router = new VueRouter(
  mode: 'history',
  base: process.env.BASE_URL,
  routes
)

export default router

现在,我返回所有网络研讨会的视图如下所示:

<template>
    <div>
      <h1> header </h1>
      <div v-if="error" class="webinar-error">
        <h1> error </h1>
      </div>
      <div v-else>
        <div class="webinar-card" v-for="webinar in webinars" :key="webinar.id">
            <h3> webinar.webinar_title </h3>
            <p> webinar.webinar_description </p>
        </div>
      </div>
    </div>
</template>

<script>
import axios from 'axios';

export default 
  name: 'Webinars',
  data () 
    return 
      webinars: [],
      error: null
    
  ,
  async mounted () 
    try 
      const response = await axios.get('http://localhost:1337/webinars')
      this.webinars = response.data
     catch (error) 
      this.error = error;
    
  ,
  props: 
    header: String
  

</script>

我需要做的是创建一个视图,当您点击网络研讨会特定 ID(“http://localhost:1337/webinars/1”、“http://localhost:1337/webinars/2”等)

我的理解是我需要使用dynamic routes。所以我修改了我的路由器并添加了拉入视图的导入语句,以及添加声明:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
import Webinars from '../views/Webinars.vue'
import WebinarSingle from '../views/WebinarSingle.vue'

Vue.use(VueRouter)

const routes = [
  
    path: '/',
    name: 'Home',
    component: Home
  ,
  
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  ,
  
    path: '/webinars',
    name: 'Webinars',
    component: Webinars
  ,
  
    path: '/webinars/:id',
    name: 'Webinars',
    component: WebinarSingle
  
]

const router = new VueRouter(
  mode: 'history',
  base: process.env.BASE_URL,
  routes
)

export default router

认为下一步是现在添加&lt;router-link&gt; 标签以根据 ID 访问该网络研讨会。 https://router.vuejs.org/api/

是启用用户导航的组件 启用路由器的应用程序。目标位置由 to 属性指定。 默认情况下,它呈现为具有正确 href 的标签,但可以 配置了标签道具。另外,链接自动获取 目标路由处于活动状态时的活动 CSS 类。

优于硬编码 原因如下:

它在 html5 历史模式和哈希模式下的工作方式相同,所以如果 您曾经决定切换模式,或者当路由器回退到散列时 IE9 中的模式,无需更改任何内容。在 HTML5 历史模式下, router-link 会拦截点击事件,这样浏览器就不会 尝试重新加载页面。当您在 HTML5 中使用 base 选项时 历史模式,你不需要将它包含在 prop 的 URL 中。

所以我继续尝试将它们添加到网络研讨会组件中:

<template>
    <div>
      <h1> header </h1>
      <div v-if="error" class="webinar-error">
        <h1> error </h1>
      </div>
      <div v-else>
        <div class="webinar-card" v-for="webinar in webinars" :key="webinar.id">
          <router-link to="/webinars/ webinar.id ">
            <h3> webinar.webinar_title </h3>
            <p> webinar.webinar_description </p>
          </router-link>
        </div>
      </div>
    </div>
</template>

这会返回:

模块错误(来自 ./node_modules/vue-loader/lib/loaders/templateLoader.js):(发出 值而不是错误的实例)

编译模板时出错:

to="/webinars/ webinar.id ":属性内的插值有 被移除。请改用 v-bind 或冒号简写。例如, 而不是,使用。

所以我把它改成:

<template>
    <div>
      <h1> header </h1>
      <div v-if="error" class="webinar-error">
        <h1> error </h1>
      </div>
      <div v-else>
        <div class="webinar-card" v-for="webinar in webinars" :key="webinar.id">
          <router-link :to="/webinars/ webinar.id ">
            <h3> webinar.webinar_title </h3>
            <p> webinar.webinar_description </p>
          </router-link>
        </div>
      </div>
    </div>
</template>

然后我得到:

错误 ./src/components/Webinars.vue?vue&type=template&id=44d01bf9&

语法错误:意外的令牌 (1:301)

什么是意外令牌?

如何将 vue js 中的动态路由映射到不同的端点?

【问题讨论】:

【参考方案1】:

作为第一个错误状态,interpolation 内部属性不再受支持。插值是您使用的 模板语法。文档解释how to bind values in attributes

当您v-bind 一个属性时,您为其分配的值不再被视为普通字符串。所以,当你写的时候:

<router-link :to="/webinars/ webinar.id ">

分配给:to 的值被视为javascript/webinars/webinar.id 是一个无效的 javascript 表达式。

有几种方法可以实现你想要的:

ES6 Template literals

<router-link :to="`/webinars/$webinar.id`">

字符串连接

<router-link :to="'/webinars/' + webinar.id">

【讨论】:

以上是关于vue js中vue路由器的动态路由与strapi headless CMS - 路由器链接和href标签抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

CSS 在动态路由上不能与 vue js 一起使用

vue中路由的动态keepAlive

Vue-cli4 对路由配置的一些理解

Vue-Router(五):动态路由(1)

vue项目实现动态路由和动态菜单搭建插件式开发框架免费源码

vue-动态路由的实现