【问题标题】:How to get data in Main.js from App.vue in Vue js?如何从 Vue js 中的 App.vue 获取 Main.js 中的数据?
【发布时间】:2017-09-12 14:24:12
【问题描述】:

这是我在main.js中的代码

import Vue from 'vue'
import App from './App'
import VueRouter from 'vue-router'
import vueResource from 'vue-resource'
// import {bus } from './bus.js'
// import MainContent from './components/MainContent'

export const bus = new Vue();

Vue.config.productionTip = true

Vue.use(vueResource)
Vue.use(VueRouter)


const router = new VueRouter({
  mode: 'history',
  base: __dirname,
  routes: [
    // {path:'/',component: MainContent }
  ]

})


/* eslint-disable no-new */
new Vue({
  el: '#app',
  template: '<App/>',
  components: { App }
})


// const bus = require('./bus.js');



var newData = new Vue({

  el: '#graph-content',
  data: {
    graphD:'',
    title: 'test title'
  },

  methods: {
    fetchData: function (data) {
    this.graphD = data;
    console.log('Inside', this.graphD);
    }
  },
  created: function () {
    bus.$on('graphdata', this.fetchData);
  }


})
console.log('OutSide', newData._data.graphD)

这是从 app.vue 发出的总线数据

bus.$emit('graphdata', "test bus");

我正在尝试使用以下代码从 app.vue 获取数据。我在 fetchData 范围内获取数据,但我没有从 newData 范围之外获取数据。 谁能建议我将数据/对象从app.vue 传递到main.js 文件的问题或可能的解决方案在哪里。

****更新 ***** 应用程序.vue

<template>
<div>
  <app-header> </app-header>



        <app-maincontent></app-maincontent>


</div>
</template>

<script>
import Header from './components/Header.vue'
import SideNav from './components/SideNav.vue'
import MainContent from './components/MainContent.vue'
import GraphA from './components/GraphA.vue'
import {bus} from './main.js'

  var apiURL = 'http://localhost:3000/db';
export default {

  components: {
    'app-header': Header,
    'app-sidenav': SideNav,
    'app-maincontent': MainContent,
    'app-grapha': GraphA
  },
  data () {
    return {
      users:[]
    }
  },
  methods: {
    fetchData: function () {
    var self = this;
    $.get( apiURL, function( data ) {
        self.users = data;
        // console.log(data);
        bus.$emit('graphdata', "test bus");
    });

  }
  },
  created: function (){
    this.fetchData();
  }
}

</script>

<style>

</style>

【问题讨论】:

  • 添加完整的 app.vue 文件代码。您是否正在创建两个 vue 实例并保持一个总线实例单独的 vue 实例。你是如何实现bus的?
  • 我更新了文件。你能检查一下吗!谢谢

标签: javascript vuejs2 vue-component event-bus


【解决方案1】:

您正在创建 3 个 vue 实例,由于 js 的异步,三个实例无法确保您的事件完美运行。您可能会按照我的代码布局事件总线,而不是使用 created 使用 mounted hook

bus.js

import Vue from 'vue';
export const bus = new Vue();

ma​​in.js

import Vue from 'vue'
import App from './App'
import VueRouter from 'vue-router'
import vueResource from 'vue-resource'
import {bus } from './bus'
// import MainContent from './components/MainContent'

Vue.config.productionTip = true
Vue.use(vueResource)
Vue.use(VueRouter)


const router = new VueRouter({
  mode: 'history',
  base: __dirname,
  routes: [
    // {path:'/',component: MainContent }
  ]

})


/* eslint-disable no-new */
new Vue({
  el: '#app',
  template: '<App/>',
  components: { App }
})

var newData = new Vue({
  el: '#graph-content',
  data: {
    graphD:'',
    title: 'test title'
  },
  methods: {
    fetchData: function (data) {
      this.graphD = data;
      console.log('Inside', this.graphD);
    }
  },
  mounted: function () {
    bus.$on('graphdata', this.fetchData);
  }
})

console.log('OutSide', newData._data.graphD)

app.vue

<template>
  <div>
    <app-header></app-header>
    <app-maincontent></app-maincontent>
  </div>
</template>

<script>
  import Header from './components/Header.vue'
  import SideNav from './components/SideNav.vue'
  import MainContent from './components/MainContent.vue'
  import GraphA from './components/GraphA.vue'
  import {bus} from './bus'

  var apiURL = 'http://localhost:3000/db';
  export default {
    components: {
      'app-header': Header,
      'app-sidenav': SideNav,
      'app-maincontent': MainContent,
      'app-grapha': GraphA
    },
    data() {
      return {
        users: []
      }
    },
    methods: {
      fetchData: function () {
        var self = this;
        $.get(apiURL, function (data) {
          self.users = data;
          // console.log(data);
          bus.$emit('graphdata', "test bus");
        });

      }
    },
    mounted: function () {
      this.fetchData();
    }
  }

</script>

<style>

</style>

相反,创建许多根组件只保留一个组件并将每个组件称为子组件

【讨论】:

  • 你检查输出了吗?仍然 console.log('OutSide', newData._data.graphD) 没有得到任何数据。
  • 由于javascript的异步特性,它不会给出,console.log('OutSide', newData._data.graphD) 在vue实例创建过程完全执行之前被执行。
  • 你知道得到它的可能解决方案是什么吗?
猜你喜欢
  • 2021-09-02
  • 2020-03-17
  • 2017-12-27
  • 2019-03-08
  • 2021-07-15
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多