【问题标题】:Vue.js: Get data from "parent" VueVue.js:从“父”Vue 获取数据
【发布时间】:2015-12-05 13:01:06
【问题描述】:

我有一个(不可更改的)DOM 结构,如下所示:

<div id="indexVue">
  ...
  <div id="childVue">
  ...
  </div>
  ...
</div>

还有两个js文件:

index.js:

var child = require('childVue');

module.exports = new Vue({
  el: '#indexVue',
  ...
});

childVue.js:

module.exports = new Vue({
  el: '#childVue',
  methods: {
    something: function(){
      // Parent data needed here ...
    },
    ...
  }
});

如图,我需要childVueindexVue的数据。有没有办法将它传递给它?我尝试将它传递给带有(v-on="click: childFunction($data)") 的函数,但这只(逻辑上)返回来自childVue 的数据属性,而不是来自indexVue 的数据属性。

Google 并没有真正提供帮助,因为 Vue 没有很好的文档记录。

真正的文件和 DOM 结构更大更复杂,但我的问题需要的只是这些文件。

我也不允许在这里使用 jQuery,这将使它成为几秒钟的任务。

【问题讨论】:

    标签: javascript dom vue.js


    【解决方案1】:

    你也可以通过 this.$parent.someData 访问它,以防你无法将它绑定到一个道具上:) 例如:

    data() {
     return {
      parentData: this.$parent.someData
     }
    }
    

    【讨论】:

    • 恕我直言,这是最干净的方法。
    • 永远不要在生产中使用它,因为您不知道该属性是从父链中的何处继承的,所以您只是降低了组件的可重用性。我仍然为此 +1 了,因为我正在制作一些东西的原型,而这个解决方法帮助了我。
    • @A1rPun,您所说的“只是使组件的可重用性降低”是什么意思?当我使用答案时,它对我有用。有什么我可以担心的吗?
    • @MONSTEEEER 如果您的组件依赖于要设置的父变量,则设计存在缺陷,因为当您将所述组件放在另一个父级甚至其他人的项目中时会发生什么?您不能假设要设置变量,并且还有多个父母的问题,那么您从哪个父母那里获取数据?这些问题引起了意图上的怀疑,因此需要避免这种解决方案。
    • 哦。很好,我明白你的意思了。在这种情况下,您有什么解决办法吗? @A1rPun
    【解决方案2】:

    Pantelis 的回答不再正确。 Vue.js 移除了继承属性。

    最好的方法是pass data through properties;

    <div id="indexVue">
      <child-vue :some-data="someData"></child-vue>
    </div>
    

    index.js:

    module.exports = new Vue({
      el: '#indexVue',
      data: {
        someData: "parent's data"
      },
      components: {
        childVue: require('childVue')
      }
    });
    

    childVue.js:

    module.exports = {
      template: '<div>{{someData}}</div>',
      methods: {
        something: function(){
          // you can access the parent's data
          console.log(this.someData)
        }
      },
      props: ['some-data'] // kebab case here available as camelcase in template
    };
    

    请注意childVue.js 中的props 属性以及用于属性名称的大小写(camelCase vs kebab-case)

    【讨论】:

    • 很好的答案。您也不需要将: 放在子组件的道具之前。 CamelCasing 诗句 kebab-casing 很重要,像你一样突出!
    • @creedjarrett 冒号取决于它是否是动态道具,所以它可能是必要的
    • @JaroslavKlimčík 实际上我刚刚遇到了这个问题,你是对的。对于动态道具,您需要:。谢谢!
    【解决方案3】:

    我建议使用child componentinherit 的父级范围。

    index.html

    <div id="indexVue">
      <child-vue></child-vue>
    </div>
    

    index.js:

    module.exports = new Vue({
      el: '#indexVue',
      data: {
        someData: "parent's data"
      },
      components: {
        childVue: require('childVue')
      }
    });
    

    childVue.js:

    module.exports = {
      inherit: true,
      template: '<div>...</div>',
      methods: {
        something: function(){
          // you can access the parent's data
          console.log(this.someData)
        }
      }
    };
    

    【讨论】:

    • 这正是我想要的。
    • 唯一的问题是,如果/当您升级到 Vue 1.0 时,它中断。*来自Vue.js Github Release Notes:“继承选项已被弃用。始终通过通过 props 将数据传递给子组件。”
    猜你喜欢
    • 2020-09-24
    • 2017-06-25
    • 1970-01-01
    • 2019-01-02
    • 2021-09-22
    • 2019-05-08
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多