【问题标题】:How to get a callback from event listener in Nuxt/Vue如何从 Nuxt/Vue 中的事件监听器获取回调
【发布时间】:2022-01-06 07:55:34
【问题描述】:

我在 Nuxt 2.15.8 上,我想获得我发出的事件的结果。 我有一个发出事件的子组件。然后在父组件上接收它并做一些 api 调用。我想要一种双向通信,这样我就可以告诉孩子事件已发出,api 调用已发送并已收到结果,所以请采取一些措施! (目前通过将布尔道具传递给孩子并观察它)

我现在在做什么:

我的父组件:

<template>
    <childcomponent :result="result" @childEvent="handleEvent" /> 
</template>
<script>
export default {
    components:{ childcomponent },
    data(){
        return{
            result: false
        }
    }
    methods:{
        async handleEvent(val){
            let res = this.$axios.get(`/example/${val}`)
            if(res){
                this.result = true
            }else{
                this.result = false
            }
        }
    }
}
</script>

我的子组件:

<template>
    <div @click="doSomething"></div>
</template>
<script>
export default {
    props:['result'],
    watch:{
        result(e){
            if(e){
                // do something
            }
        }
    }
    methods:{
        doSomething(){
            // do something
            this.$emit('childEvent', 'val')
        }
    }
}
</script>

我知道我可以使用 $nuxt.$emit() 从 parent 发出另一个事件并在 child 上接收它,但我想要一些简单的东西,例如

//child
this.$emit('childEvent', 'val' , (result)=>{
    // result of event handler sent from parent
})

// Or

let res = await this.$emit('childEvent', 'val')
if(res){
    // do something
}

有可能吗??

【问题讨论】:

    标签: vue.js vuejs2 nuxt.js


    【解决方案1】:

    我不确定您为什么要通知孩子。如果您只想要“加载”状态,则可以使用道具(在 axios 启动时将加载设置为 true,然后在完成时设置为 false)。顺便说一句,axios api是异步的(基于promise的),所以你必须使用await:

    let res = await this.$axios.get(`/example/${val}`)
    

    但是进入正题,可以直接调用子组件的方法,直接使用ref访问实例即可:

    <template>
        <childcomponent ref="child" :result="result" @childEvent="handleEvent" /> 
    </template>
    <script>
    export default {
        components:{ childcomponent },
        data(){
            return{
                result: false
            }
        }
        methods:{
            async handleEvent(val){
                let res = await this.$axios.get(`/example/${val}`)
                this.$refs.child.getResult(res)
            }
        }
    }
    </script>
    

    还有孩子:

    <template>
        <div @click="doSomething"></div>
    </template>
    <script>
    export default {
        methods:{
            doSomething(){
                // do something
                this.$emit('childEvent', 'val')
            },
            getResult(res) {
                // do something
            }
        }
    }
    </script>
    

    【讨论】:

    • 我已经知道一些方法可以做到这一点,但这都是关于可重用组件的。该函数必须在父节点上,子节点必须发出并获得结果。如果我添加this.$refs.child.getResult(res),我必须对每个父母都这样做,这是不可取的,至少在这里是这样。仅供参考,这是我的问题,当我单击 child 时,我在 parent 中获取一个列表并将其传递给 child,但由于某种原因该列表不会显示,所以我将通过更改 @987654325 来刷新子组件中的该部分@ .我希望它在 child 内部发生,没有父母的代码。
    • 好的,我明白了。但是为什么不使用道具将列表传回给孩子呢?因此,孩子在获取后以当前状态呈现列表以获取更新。或者,为什么不让孩子在内部获取和保存数据?在我看来,它们是手动处理更新事件的更好模式。
    • 第二个问题,可重用性!并且为了您的第一次更容易的可重用性:D!要传递一个道具,在每个父母中,我必须定义它,在 fetch 之后填充它并将它传递给孩子,以便孩子可以刷新自己!在我看来它会变得很麻烦
    • 我不确定我是否理解您的问题。列表/数据通常应该只在一个地方,并且数据的持有者应该是唯一修改它的人。如果您希望该列表在您的应用程序的许多部分中使用,也许 vuex 就是您正在寻找的。​​span>
    猜你喜欢
    • 2020-10-07
    • 2021-06-12
    • 1970-01-01
    • 2021-06-18
    • 2020-06-25
    • 2019-04-13
    • 1970-01-01
    • 2019-09-06
    • 2018-05-15
    相关资源
    最近更新 更多