【问题标题】:Vue pass data from child component to child componentVue将数据从子组件传递到子组件
【发布时间】:2017-12-20 15:21:20
【问题描述】:

所以我有这样的结构

<Root>
<HomeNav> router-view
<RouterLink>
<RouterLink>
<RouterLink>
<RouterLink>
<RouterLink>
<Home> router-view
<RouterLink> 

现在,每个 HomeNav 路由器链接都通过将数据传递给根来更改组件中的数据,但这意味着我需要绑定该数据:

      <router-view v-bind:title="title" v-bind:text="text" v-bind:youtube="youtube" v-bind:transition="transition"></router-view>

并在创建和更新时运行函数:

new Vue({
  el: '#app',
  router,
  data: Variables,
  created: function () {
    path = pathname.pathname();
    pathLenght = pathname.countPathLenght(path);
    this.homeText(this.data);
  },
  updated: function () {
    path = pathname.pathname();
    pathLenght = pathname.countPathLenght(path);
    Pace.restart()
    this.homeText(this.data);
  },
  methods: {
    homeText(data) {
      data = toogleData.checkText(data);
      this.title = data[0];
      this.text = data[1];
      this.youtube = data[2];
    }
  }
})

但是,问题是我不需要所有路由上的数据,也不需要触发 this.homeText 函数或绑定每个根上的特定数据。只有首页需要,所以是第一个路由。

所以问题是,是否可以直接将数据从 HomeNav 组件传递到 Home 组件,而无需将所有代码放在全局(根)组件中?

【问题讨论】:

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


    【解决方案1】:

    这是 VueJs 文档建议的 MessagePump 的好地方。它本质上是未绑定的 Vue 对象,充当对象之间的中介。这允许您定义和调用泵上的事件,这些事件会传递给相应的组件。

    window.MessagePump = new Vue({});
    
    Vue.Component(
        'HomeNav',
        {
            ...
            data: function () {
                return {
                    homeText: 'something'
                }
            },
            ...
            mounted: function () {
                var thisArg = this
                MessagePump.$on(
                    'homeTextChanged',
                    function(newText) {
                        thisArg.homeText = newText;
                    }
                );
            }
            ...
        }
    );
    
    Vue.Component(
        'Home',
        {
            ...
            mounted: function () {
                MessagePump.$emit('homeTextChanged', 'To This');
            }
            ...
        }
    );
    

    这将触发事件并将 homeText 从 'something' 更改为 'To This'。

    【讨论】:

    • 看起来很棒@Justin MacArthur,如果需要更改 2 个变量(即标题和文本)怎么办?
    • 据我所知,事件名称映射到函数后的每个参数。所以$on(name, arg1, arg2, ..., argN)$emit(name, 'arg1', 'arg2',..., argN) 调用
    • 如果我也想将 MessagePump 用于其他用途,它还能有不同的名称吗?即 MessagePump2?
    • 您可以随意命名。只需将 window.MessagePump 更改为 window.&lt;YourName&gt; 即可使其响应您选择的名称。您甚至可以拥有多个,尽管它的价值会降低,因为您可以将组织添加到事件名称中。
    • 太棒了。谢谢你
    猜你喜欢
    • 2020-09-25
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2020-03-18
    • 2019-07-12
    • 2021-08-27
    相关资源
    最近更新 更多