Vuetify 小吃吧超时时更新父状态

Posted

技术标签:

【中文标题】Vuetify 小吃吧超时时更新父状态【英文标题】:Update parent state when Vuetify snackbar timeouts 【发布时间】:2019-09-01 04:58:07 【问题描述】:

目前我有一个Parent 和一个Child 组件。在Parent 组件中,我在成功调用API 后将snackbar 状态设置为true,这样它就会显示snackbar。当我单击小吃栏中的close button 时,父级的状态会更新,并且小吃栏会消失。但是,当小吃店超时时,我收到以下错误:

避免直接改变prop,因为值会被覆盖 每当父组件重新渲染时。相反,使用数据或 基于道具值的计算属性。道具被变异: “小吃店”

当快餐栏超时时如何更新父状态?有没有干净的方法来做到这一点?

这是我的父组件:

<Snackbar :snackbar="snackbar" :y="bottom" :text="text" @update-snackbar="updateSnackbar"></Snackbar>

<script>
    import Snackbar from "../components/Snackbar";

    export default 
        name: "AddFriend",
        components: Snackbar,
        methods: 
            updateSnackbar(e) 
                this.snackbar = e;
            ,
            add() 
                const username = "test";
                axios
                    .post('/api/friend/add',
                        
                            username: username
                        )
                    .then(response => 
                        if (response.data.success) 
                            this.snackbar = true;
                            this.text = 'Request successfully send!';
                         else 
                            this.snackbar = true;
                            this.text = response.data.error;
                        
                    )
                    .catch(err => 
                        console.log('Something went wrong: ' + err);
                        this.snackbar = true;
                        this.text = 'test';
                    )
            
        ,
        data() 
            return 
                error: null,
                valid: false,
                text: null,
                snackbar: false,
                bottom: 'bottom',
            
        
    
</script>

这是我的 Child (snackbar) 组件:

<template>
    <v-snackbar
            v-model="snackbar"
            :bottom="y === 'bottom'"
            :timeout="1500"
            :vertical="mode === 'vertical'"
    >
         text 
        <v-btn
                color="red"
                flat
                @click="closeSnackbar(false)"
        >
            Close
        </v-btn>
    </v-snackbar>
</template>

<script>
    export default 
        name: "Snackbar",
        props: 
            snackbar: Boolean,
            y: String,
            x: null,
            mode: String,
            text: String
        ,
        methods: 
            closeSnackbar(snackbar) 
                this.$emit('update-snackbar', snackbar);
            
        ,
        data() 
            return 
        
    
</script>

如果有人知道如何做到这一点,请告诉我。此外,如果需要 CodeSandBox,我将创建一个。提前致谢!

【问题讨论】:

【参考方案1】:

我设法在超时时更新父状态。我通过添加:

@input="closeSnackbar"

到我的 v-snackbar。当超时发生时,它现在会触发 closeSnackbar 函数来更新我的父组件。对于所有有同样问题的人,这里是我完整的小吃栏组件:

<template>
    <v-snackbar
            :value="snackbar"
            @input="closeSnackbar"
            bottom
            :timeout="1500"
    >
         text 
    </v-snackbar>
</template>

<script>
    export default 
        name: "Snackbar",
        props: 
            snackbar: Boolean,
            text: String
        ,
        methods: 
            closeSnackbar(snackbar) 
                this.$emit('update-snackbar', snackbar);
            
        ,
    
</script>

【讨论】:

以上是关于Vuetify 小吃吧超时时更新父状态的主要内容,如果未能解决你的问题,请参考以下文章

想在 vuejs 中使用 vuetify 小吃吧作为全局自定义组件

Vue 3 和 Vuetify 3 Alpha:ValidationError:进度插件无效选项

java sqlserver 怎么做当某一笔数据超时时,自动更新该笔数据状态?

Vue/Vuetify:显示/隐藏父组件的对话框。 Esc 键不起作用

如何访问深层嵌套父级中的方法 [Vue][Vuetify]

用户登录应用程序后如何打开 vuetify 对话框