【问题标题】:this.$router is undefined inside Vue.extend() methodthis.$router 在 Vue.extend() 方法中未定义
【发布时间】:2018-06-03 14:24:45
【问题描述】:

使用 vue v2.5.9 和 vue-router v.3.0.1。

最小复制链接:https://codepen.io/clarewhatever/pen/eyzMNo

我正在尝试使用Vue.extend() 方法将<router-link> 元素动态插入到组件中。

Vue.component('markdown', {
  name: 'markdown',
  props: {
    routeName: {
      type: String,
      required: true
    },
    routeLabel: {
      type: String,
      required: true
    }
  },
  template: `<span ref="content"></span>`,
  mounted () {
    let self = this;
    let routerLink = `<router-link :to="{ name: ${routeName} }">${routeLabel}</router-link>`;
    let MarkdownContent = Vue.extend({
      template: `<div>${routerLink}</div>`,
      // router: self.$router,
      mounted () {
        // this.$router is undefined unless router is explicitly defined
        console.log(this.$router);
      }
    });
    new MarkdownContent().$mount(this.$refs.content);
  }
});

我遇到的问题是this.$routerextend() 方法中未定义,因此传递给路由器链接的路由不存在。如果我从父组件 (router: self.$router) 传入路由器,则 router-link 元素按预期安装。

我尝试将Vue.extend() 换成Vue.component(),但遇到了同样的问题。我认为它一定与在构造函数上调用的 vm.$mount 方法有关,尽管我不确定它为什么会这样工作。所有的文档都显示它是这样使用的,但我找不到包含 vue-router 的示例。

【问题讨论】:

    标签: vue.js vuejs2 vue-router


    【解决方案1】:

    通过创建一个新的 Vue 实例并通过new MarkdownContent().$mount(...) 挂载它,你打破了父/子关系的正常范式。 VueRouter 插件会自动为模板中包含的子组件设置this.$router 的引用。但是,通过手动安装组件,您会丢失该引用。

    实例化和安装一个新组件只是为了渲染一个&lt;router-link&gt; 标签似乎很迂回。但是,如果你真的需要这样做,你只需要在组件定义对象中指定router 引用即可:

    let MarkdownContent = Vue.extend({
      router,
      template: `<div>${routerLink}</div>`,
      mounted () {
        console.log(this.$router);
      }
    });
    

    Here's a working codepen.

    【讨论】:

    • 我认为你的 CodePen 可能坏了,但我明白你在说什么。感谢您澄清为什么必须在新的 Vue 实例上重新定义路由器。我正在安装一个新组件,只是为了渲染一个 &lt;router-link&gt; 组件,因为数据来自异步调用。数据以降价形式返回,我正在使用降价来解析内容并呈现 HTML。我编写了一个扩展来检测内部链接,这些链接被渲染为路由器链接。因为它们是在组件安装后创建的,所以组件无法正确解析它们。
    • codepen 对我来说工作正常,什么不适合你?还有为什么不能直接在组件B的模板中渲染&lt;router-link&gt;
    • 我看到页面不断重新加载。我更新了我的上述评论,以包括以这种方式接近它的推理。
    • 更新:我在隐身窗口中打开了链接,它工作正常,必须是我安装的扩展程序。谢谢!
    猜你喜欢
    • 2018-04-09
    • 2020-02-15
    • 1970-01-01
    • 2011-04-30
    • 2017-07-03
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多