Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Ocultar exibir um child component

Salve turma, Estou tentando criar um componente para alert/msg box e ocultar ou exibir esse componente quando a messagem mudar no componente pai. A intensão é uma vez que eu feche o alert-box, ele somente será exibido novamente se a messagem mudar, como no caso de um erro ao obter dados ou validacao de formulario, success messages, etc. Entretanto a prop é reativa e o componente pai está sempre fazendo update. Consigo ocultar uma vez, sem utilizar o hook updated porem se a mensagem muda no componente pai, o alert-box nao é reexibido. Existe a possiblidade de usar um $emit() porem nao gostaria dessa abordagem, gostaria de utilizar somente o estado do componente MsgBox. Alguem pode me dar uma ajudinha nessa flag para exbir/ocultar o componente?

//Component pai - Lista.vue
<template>
    <div class="container">

        <MessageBox :message="message"/>
    </div>

</template>

<script>
import MessageBox from './shared/MessageBox';
export default {
    components:{
        MessageBox
    },
    data() {
        return {
            message: ''
        }
    },

}
</script>
//  ./shared/MesageBox.vue
<template>
    <div class="alert alert-danger" v-show="content.length">
        <button type="button" class="close"aria-label="Close" @click="close">
            <span aria-hidden="true">&times;</span>
        </button>
        {{content}}
    </div>
</template>
<script>
export default {
    props: ['message'],
    data() {
        return {
            content: ''
        }
    },
    created: function(){
        this.updateMessage();
    },
    methods:{
        close: function() {
            this.content = '';
        },
        updateMessage: function(){
            this.content = this.message;
        }
    },
    updated: function() {
        this.updateMessage();
    }
}
</script>
3 respostas

Boa tarde.

Comunicação entre elemento pai e filho é feita através das props. Comunicação entre filho e pai é feito através de evento. Se você não curtiu essa abordagem, talvez seja interessante você dar uma olhada no Vuex que implementa um central state management estilo Flux, aquele utilizado por aplicações React.

solução!

Obrigado pela sugestão Flávio. Mas achei um tanto pesado para uma tarefa tão simples. Eu ate utilizo o Vuex mas pra gerenciar outras coisas como tokens e outras informacoes do usuario. Alem disso estou tentando criar uma biblioteca propria de componentes visuais, como datatable, autocomplete, tabs, etc e não ficaria muito interessante depender do Vuex, nao seria tão prático. A resposta estava na minha primeira pergunta, bastava guardar o estado anterior da mensagem e exibir somente quando os valores forem diferentes, ta redondinho agora.

//AlertBox.vue
<template>
    <div class="alert alert-danger" v-show="message != previousContent">
        <button type="button" class="close"aria-label="Close" @click="close">
            <span aria-hidden="true">&times;</span>
        </button>
        {{message}}
    </div>
</template>
<script>
export default {
    props: ['message'],
    data() {
        return {
            previousContent: ''
        }
    },
    created: function(){
        this.updateMessage();

    },
    methods:{
        close: function() {
            this.previousContent = this.message;
        },
        updateMessage: function(){
            this.content = this.message;
        }
    },
    updated: function() {
        this.updateMessage();
    }
}
</script>

Ficou super redondo mesmo! Vou marcar sua resposta como solução!!!!!