【问题标题】:Vue computed property in router template路由器模板中的 Vue 计算属性
【发布时间】:2020-08-02 12:05:34
【问题描述】:

我无法理解如何通过路由器一直到我的模板获取计算属性。这是我在做什么的基本想法:

const Home = {
  template: '<router-link to="/level/1">Level 1</router-link>'
}

const Level = {
  template: '<template>|{{ id }}|{{ message }}|</template>',
  props: ['id','message']
}

const router = new VueRouter({
  routes: [
    { path: '/', component: Home, props: true },
    { path: '/level/:id', component: Level, props: true }
  ]
})

const vm = new Vue({
    el: '#app',
    router,
    template: '<router-view></router-view>',
    computed: {
        message() {
            return 'HELLO';
    }
  }
})

当我点击“Level 1”链接时,我期望看到的结果是:

|1|你好|

我实际看到的结果是:

|1||

最终的用法会比这更实用一些,但希望这足以暴露我对 props、路由或计算属性不了解的任何内容。

【问题讨论】:

    标签: javascript vue.js vue-router computed-properties


    【解决方案1】:

    有两个问题:

    1) 出现错误:

    不能使用&lt;template&gt; 作为组件根元素,因为它可能包含多个节点。

    所以把它改成div。使用 Vue CLI 时,模板被包裹在 &lt;template&gt; 中,但其中仍需要有不同的根元素。

    2) Level 组件有一个名为 message 的道具,但它没有通过。 Home 路由通过 id 但不通过 messageHome 目前无法通过message,因为它在根组件中,而Home 没有收到。

    你可以:

    • 使用 Vuex 最干净地解决这个问题
    • Home 中定义message 而不是根并将其传递给Level
    • message 从根传递到Home,然后再从Home 传递到Level

    【讨论】:

    • 在 #1 - 虽然我不怀疑你是正确的,我需要 &lt;div&gt; 而不是 &lt;template&gt;,但我怀疑这是否会导致 message 不出现,因为 id 正在显示。在#2 - 我知道变量没有正确传递。我只是不知道如何纠正这个问题。可能我误解了 props - 文档使 props 看起来像是让变量去地方的神奇词。显然不是这样的!
    • 你看到Level 路径有一个dynamic segment 对应/:id 吗?这就是让您传递id 的路由参数的原因。参数通过该位置的 url 传递。由于 Level 路由在路由定义中没有 /:message 段,并且没有尝试在该 url 插槽中传递任何内容,因此不会传递参数。 props: true 设置另外将这些参数注册为道具,就好像它们是作为道具从父组件传递过来的一样。
    • 如果这是将变量传递到模板的唯一方法,那么我将遇到一个真正的问题,因为“Hello”只是一个示例。我真的不希望我的变量出现在 URL 中。我想我会研究 Vuex。
    • 实际上,您可以通过参数传递整个对象,甚至无需为它们声明段。 (这是通过router-linkparams 属性完成的,并且不进入url。)所以从技术上讲,这里的问题实际上只是没有尝试传递message 参数。我不确定是否鼓励以这种方式传递对象,这可能是一种反模式。 Vuex 让一切变得微不足道:从任何地方设置一些变量,然后从任何地方检查它。
    • 非常感谢您的帮助丹!我设法通过直接引用我已经创建的全局对象来解决我原来的、更复杂的问题,完全围绕道具进行结束运行。我敢肯定,风格纯粹主义者会在他们的嘴里吐出一点来阅读它!在我上面发布的示例中,我尝试在我的路由器链接中使用参数,但具有讽刺意味的是,我从未修复过我的“简化”代码。如果有人想编写一个代码示例来解决我上面的损坏代码,那么对于未来的 Google 员工来说这将是一件很酷的事情,但我已经解决了我眼前的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多