【问题标题】:VueRouter does not receive meta property in router-link tagVueRouter 没有收到路由器链接标签中的元属性
【发布时间】:2021-12-19 05:35:45
【问题描述】:

我正在尝试通过 <router-link> 标签传递 meta 字段。像这样:

<router-link :to="{path: '/inlineMeta', meta: {title: 'Inline meta'}}">
    Inline meta
</router-link>

我想实现这一点,因为我可以从后端框架直接在标签本身上动态传递元数据。在 JS 文件中声明 routes 选项根本没有这种能力。

理论上,通过 to 属性传递的任何对象都应该被推送到router 堆栈,对吗?但在这种情况下,情况似乎并非如此。

如果我在routes 选项中声明meta,它肯定有效。毫无疑问。

我想知道是否可以这样做,我该怎么做?


一个小小提琴来说明问题。单击 URL 并注意控制台。我无法让 StackOverflow sn-p 正常工作。

JSFiddle

Vue.use(VueRouter);

const cComponent = {
  data() {
    return {
      fetchedData: null
    }
  },
  template: `<div>The meta is: {{$route.meta.title}}</div>`,
}
const routes = [{
    path: "/inlineMeta",
    component: cComponent,
  },
  {
    path: "/routeMeta",
    meta: {
      title: 'Meta declared in routes'
    },
    component: cComponent,
  }
]

const router = new VueRouter({
  mode: "history",
  routes,
})

router.beforeEach((to, from, next) => {
  console.log("The meta title is : " + to.meta.title);
})

const app = new Vue({
  el: "#app",
  router,
})
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script src="   https://unpkg.com/vue-router@3.5.1/dist/vue-router.js"></script>

<div id="app">
  <router-link :to="{path: '/inlineMeta', meta: {title: 'Inline meta'}}">Inline meta</router-link>
  <router-link :to="{path: '/routeMeta'}">Meta declared in routes</router-link>
  <router-view></router-view>
</div>

【问题讨论】:

    标签: vue.js vuejs2 vue-component vue-router


    【解决方案1】:

    如果要在两个组件之间传递参数,请使用props&lt;route-link&gt;中的v-bind:to只是用于路由匹配,所以不能用它来设置meta的值。 如果您想设置元而不在路由中声明它,我认为在 js 中使用“this.$route.meta.title="Inline meta"”。 比如使用点击事件:

    <li @click="setMeta">
      <router-link :to="{path: '/inlineMeta'}">
        Inline meta
      </router-link>
    </li>
    

    在js中:

    method:{
        setMeta(){
          this.$route.meta.title="Inline meta";
        }
    }
    

    你也可以在你刚刚路由到的新组件中使用mounted()

    mounted(){
      this.$route.meta.title="Inline meta"
    }
    

    并且meta会在重新加载后被修改 这可能会起作用,尽管它可能看起来不那么优雅。

    【讨论】:

    • 不确定您是否已阅读该问题。我不想在两个组件之间传递参数...
    • 现在我明白了,您是否试图通过 没有在路由中声明元? v-bind:to 仅用于路由匹配,因此您不能使用它来设置值。如果您想设置元而不在路由中声明它,我认为 js 中的 usintg"this.$route.meta.title="Inline meta" " 可能会起作用,尽管它可能看起来不那么优雅
    • 在 JS 文件中声明对我来说不是一个选项。我们能否以某种方式在&lt;router-link&gt; 之类的地方使用this.$route.meta.title="Inline meta"
    • 再想一想,我不认为你错了。但是它引发了另一个问题:该方法不会在页面重新加载时触发自身,而只会在点击事件时触发。有没有办法解决这个问题?
    • 我尝试了几种方法,但似乎在 html 标签中设置值的唯一方法是 v-model 。再三考虑,@click 只是一个例子,watch 是更好的方法,并在页面重新加载时使用mounted 触发
    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2017-12-15
    • 2021-10-28
    • 2018-01-18
    • 2015-02-08
    • 2021-12-15
    相关资源
    最近更新 更多