【问题标题】:How to access a property of the inital app instance, in a .vue component template?如何在 .vue 组件模板中访问初始应用程序实例的属性?
【发布时间】:2019-06-20 19:08:22
【问题描述】:

我已经使用 vue-cli 设置了一个新的 Vue 应用程序。我有 vue-loader 和 vue-route 也在这个项目中运行。

在以下实例中如何访问属性events

目前,以下代码导致以下错误:Property or method "events" is not defined on the instance but referenced during render

ma​​in.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: function(y) {
    return y(App)
  },
    // Data
    data: {
        events: [
            {
                name : 'this',
                price : 2000
            },
            {
                name : 'that',
                price : 3000
            },
            {
                name : 'the-other',
                price : 4000
            },
        ]
    }
}).$mount('#app')

./App.vue

<template>
  <div id="app">
    <div id="nav">

      <router-link to="/">Home</router-link> |
      <router-link to="/about">About</router-link>

    </div>


      <ul>
          <li v-for="event in events">
              <h2>{{ event.name }}</h2>
              <p>{{ event.price }}</p>
          </li>
      </ul>



      <router-view/>
  </div>
</template>

【问题讨论】:

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


    【解决方案1】:

    您的events 数据仅存在于main.js 中,但您在无权访问它的App.vue 中使用它。

    要渲染events 数据,您可以将events 作为props 传递给您的App 组件。

    render: function(y) {
      return y(App, {
        props: {
          events: this.events
        }
      });
    }
    

    在你的App.vue

    <template>
      <div id="app">
        <div id="nav">
          <router-link to="/">Home</router-link> |
          <router-link to="/about">About</router-link>
    
        </div>
          <ul>
              <li v-for="event in events">
                  <h2>{{ event.name }}</h2>
                  <p>{{ event.price }}</p>
              </li>
          </ul>
    
          <router-view/>
      </div>
    </template>
    
    <script>
      export default {
        name: 'App',
        props: ['events']
      }
    </script>
    

    【讨论】:

    • 是的!也工作了。当初始属性需要全局访问时,是否有首选方法?因此,如果我在其他任何地方更新它,所有其他视图也会更新。
    • @DevLime 引用官方文档,您可以将其用于演示或具有少量组件的非常小的应用程序。但是,使用this.$root 访问根实例并不能很好地扩展到中型或大型应用程序。
    • 是的,不建议使用 this.$root 访问父数据,就像我解释的那样 here
    • 谢谢。这仅用于技术演示,但它将跨多个组件传输数据并相应地更新所有视图,这种方法在这种情况下是否成立?
    • 快速更新 - 是的。现在完全点击了。非常正确的方法:)
    【解决方案2】:

    this.$root.events 怎么样,或者在您的应用组件中创建一个计算属性并在那里分配该根事件。

    【讨论】:

    【解决方案3】:

    您可以将它作为 prop 传递并使用模板属性 template:"&lt;App :events='events'/&gt;", 来呈现 App 组件,如下所示:

    new Vue({
      router,
      store,
     template:"<App :events='events'/>",
        // Data
        data: {
            events: [
                {
                    name : 'this',
                    price : 2000
                },
                {
                    name : 'that',
                    price : 3000
                },
                {
                    name : 'the-other',
                    price : 4000
                },
            ]
        }
    }).$mount('#app')
    

    在 App.vue 中:

     <template>
     ....
    </template>
     <script>
      export default {
        props: ['events']
      }
     </script>
    

    【讨论】:

      猜你喜欢
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 2019-07-29
      • 2016-12-20
      • 2018-09-23
      相关资源
      最近更新 更多