当我单击vue组件上的子组件时,如何更新父组件中的数据?

时间:2017-07-14 16:53:44

标签: vue.js vuejs2 vue-component vuex

我的第一个组件(子组件)是这样的:

<template>
    ...
</template>
<script>
    export default {
        ...
        methods: {
            addPhoto() {
                const data = { id_product: this.idProduct}
                const item = this.idImage
                this.$store.dispatch('addImage', data)
                    .then((response) => {
                         this.$parent.$options.methods.createImage(item, response)
                    });
            },
        } 
    }
</script>

如果调用方法addPhoto,它将调用ajax然后它将获得响应ajax

我想将响应ajax和另一个参数发送到方法createImage。方法createImage位于父组件(第二个组件)

我的第二个组件(父组件)是这样的:

<template>
    <div>
        <ul class="list-inline list-photo">
            <li v-for="item in items">
                <div v-if="clicked[item]">
                    <img :src="image[item]" alt="">
                    <a href="javascript:;" class="thumb-check"><span class="fa fa-check-circle"></span></a>
                </div>
                <a v-else href="javascript:;" class="thumb thumb-upload"
                   title="Add Photo">
                    <span class="fa fa-plus fa-2x"></span>
                </a>
            </li>
        </ul>
    </div>
</template>
<script>
    export default {
        ...
        data() {
            return {
                items: [1,2,3,4,5],
                clicked: [], // using an array because your items are numeric
                test: null
            }
        },
        methods: {
            createImage(item, response) {
                console.log(item)
                this.$set(this.clicked, item, true)
                this.test = item
            },
        }
    }
</script>

如果代码已执行,则成功调用父组件上的createImage方法。控制台日志显示项目

的值

但我的问题是父组件上的数据没有成功更新

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

你应该养成使用events的习惯,而不是直接从孩子那里访问父组件。

在您的情况下,在子异步请求的then处理程序中发出事件会很简单:

.then((response) => {
  this.$emit('imageAdded', item);
});

在父范围内听取它:

<child-component @itemAdded="createImage"></child-component>

这样,使用该子组件的任何组件都可以对其imageAdded事件做出反应。另外,您永远不需要花时间调试createImage方法在Vue实例中从未被调用时触发的原因。

您的代码无法正常工作,因为您调用createImage方法的方式意味着函数内的this在调用时不会引用父组件实例。因此,设置this.clickedthis.test不会影响父实例的数据。

要使用正确的上下文调用父组件的函数,您需要执行以下操作:

this.$parent.createImage(item, response)