【问题标题】:Vue.js - Using parent data in componentVue.js - 在组件中使用父数据
【发布时间】:2016-08-11 20:31:15
【问题描述】:

如何在我的子组件 Post 中访问父级的数据变量 (limitByNumber)?

我尝试使用 prop 但它不起作用。

家长:

import Post from './components/Post.vue';

new Vue ({
    el: 'body',

    components: { Post },

    data: {
        limitByNumber: 4
    }
});

组件帖子:

<template>
    <div class="Post" v-for="post in list | limitBy limitByNumber">
    <!-- Blog Post -->
    ....
    </div>
</template>

<!-- script -->    
<script>
export default {
    props: ['list', 'limitByNumber'],
    
    created() {
        this.list = JSON.parse(this.list);
    }
}
</script>

【问题讨论】:

    标签: javascript vue.js vue-component


    【解决方案1】:

    如果你想访问某个特定的父级,你可以这样命名所有组件:

    export default {
        name: 'LayoutDefault'
    

    然后添加一些函数(如果您在所有组件中都需要它,可能会像 vue.prototype 或 Mixin)。应该这样做:

    getParent(name) {
        let p = this.$parent;
        while(typeof p !== 'undefined') {
            if (p.$options.name == name) {
                return p;
            } else {
                p = p.$parent;
            }
        }
        return false;
    }
    

    用法可能是这样的:

    this.getParent('LayoutDefault').myVariableOrMethod
    

    【讨论】:

    • 这是假设树上的所有父组件都有唯一的名称(无论如何它都应该有),但这是我现在需要做的一个非常酷的选择,所以谢谢
    【解决方案2】:

    选项 1

    使用来自子组件的this.$parent.limitByNumber。所以你的组件模板会是这样的

    <template>
        <div class="Post" v-for="post in list | limitBy this.$parent.limitByNumber" />                
    </template>
    

    选项 2

    如果你想使用道具,你也可以实现你想要的。像这样。

    家长

    <template>
        <post :limit="limitByNumber" />
    </template>
    <script>
    export default {
        data () {
            return {
                limitByNumber: 4
            }
        }
    }
    </script>
    

    儿童锅

    <template>
        <div class="Post" v-for="post in list | limitBy limit">
            <!-- Blog Post -->
            ....
        </div>
    </template>
    
    <script>
    export default {
        props: ['list', 'limit'],
    
        created() {
            this.list = JSON.parse(this.list);
        }
    }
    </script>
    

    【讨论】:

    • $parent 之前不需要this.
    • 有没有办法像 $(this).closest('#parent_element_id') 在 jQuery 中那样做?虽然,this.$parent 相当不错,但我最终在我的一个组件中得到了类似的东西:this.$parent.$parent.$parent.$parent.xxxx……需要一种快速的方法来重构这种怪异=)
    • @pilat 你找到解决方案了吗?
    • 或为你,@pilat?
    • @pilat 在这种情况下对我有帮助的事情: - 通常使用 $emit() 将更改转移给父母(及其父母,以及他们的父母......)。 - 可以使用ref 属性(google vue ref 属性)与 DOM 进行交互。这主要是用于与其 DOM 交互的组件,通常不与其父级交互。 - 如果您确实需要更改 DOM 层次结构中的某些内容,请考虑使用 Vue 门户:linusborg.github.io/portal-vue
    猜你喜欢
    • 2017-02-20
    • 2017-05-28
    • 2019-02-19
    • 2017-01-14
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多