【问题标题】:Can't close the modal in Ionic-vue 5.5.2无法在 Ionic-vue 5.5.2 中关闭模式
【发布时间】:2021-04-20 17:54:19
【问题描述】:

在这个版本的@ionic/vue@0.5.5.2 中,我不能使用组件并为其分配引用()以在Modal 组件(Login.vue)中关闭它),所以我不知道如何从 Login.vue 中关闭它。我留下我的代码:

首页.vue

<template>
<ion-page>
    <ion-header>
        <ion-toolbar>
            <ion-title>
                Title
            </ion-title>
        </ion-toolbar>
    </ion-header>

    <ion-content class="auth-form">

        <ion-grid>
            <ion-row>
                <ion-col align-self-center>
                    <ion-button @click="openModal" expand="block" color="primary">Registrarme</ion-button>

                    <span class="divider line one-line">o</span>

                    <span class="already">¿Tienes una cuenta?</span>

                    <ion-button @click="openModal" expand="block" color="danger">Iniciar sesión</ion-button>
                </ion-col>
            </ion-row>
        </ion-grid>
       
    </ion-content>

</ion-page>
</template>

<script>
import {
    IonContent,
    modalController,
    IonTitle,
    IonToolbar,
    IonHeader,
    IonButton,
    IonCol,
    IonRow,
    IonGrid,
    IonPage
} from '@ionic/vue';
import Login from '../views/Login.vue';

export default {
    name: 'inicio',
    components: {
       
        IonContent,
        IonTitle,
        IonToolbar,
        IonHeader,
        IonButton,
        IonCol,
        IonRow,
        IonGrid,
        IonPage
    },
    data() {
        return {
            modal: '',
            isOpen: false,
        }
    },

    methods: {
        async createModal() {
            this.modal = await modalController.create({
                component: Login,
                componentProps: {
                  title: 'Iniciar sesión'
              },
                
            })
        },
        async openModal() {
            await this.createModal()
            this.isOpen = true
            this.modal.present()
        },
        closeModal() {
            this.isOpen = false
            this.modal.dismiss().then(() => {
                this.modal = null;
            });
        },
    },
}
</script>

还有我的 Login.vue:

<template>
<ion-page>
    <ion-header translucent>
        <ion-toolbar>
            <ion-title>{{ title }}</ion-title>
            <ion-buttons slot="end">
                <ion-button @click="cerrarmodal">Cerrar</ion-button>
            </ion-buttons>
        </ion-toolbar>
    </ion-header>

    <ion-content>

        <ion-list>

            <ion-item>
                <ion-label>Email</ion-label>
                <ion-input type="text"></ion-input>
            </ion-item>

            <ion-item>
                <ion-label>Contraseña</ion-label>
                <ion-input type="password"></ion-input>
            </ion-item>

        </ion-list>

        <ion-button color="primary" expand="block">Ingresar</ion-button>

    </ion-content>

</ion-page>
</template>

<script>
import {
    IonButtons,
    IonContent,
    IonButton,
    IonToolbar,
    IonHeader,
    IonTitle,
    IonList,
    IonLabel,
    IonInput,
    IonItem,
    IonPage
} from '@ionic/vue';
import {
    defineComponent
} from 'vue';

export default defineComponent({
    name: 'login',
    props: {
        title: {
            type: String,
            default: 'Super Modal'
        },
        closeMe: {
            type: Function,
            default: () => {
                ''
            }
        },
    },
    data() {
        return {
            content: 'Content',
        }
    },
    methods: {
        cerrarmodal() {
            this.$emit('close', {
                foo: 'bar'
            })
            // Not working
            this.$parent.closeModal()
        },
   
    },
    components: {
        IonButton,
        IonButtons,
        IonToolbar,
        IonList,
        IonInput,
        IonLabel,
        IonItem,
        IonPage,
        IonHeader,
        IonTitle,
        IonContent
    },
});
</script>

我已经尝试过 $emit 和 $ parent.closeModal () 但没有成功,提前感谢您的帮助。

【问题讨论】:

    标签: vue.js ionic-framework


    【解决方案1】:
    <!-- ./modal.vue -->
    
    <template>
      <ion-header>
        <ion-toolbar>
          <ion-button shape="round" fill="clear" @click="modalController.dismiss()">
              <ion-icon slot="icon-only" :icon="arrowBackOutline" />
            </ion-button>
        </ion-toolbar>
      </ion-header>
      <ion-content class="ion-padding">
        {{ content }}
      </ion-content>
    </template>
    
    <script lang="ts">
    import { IonButton, IonHeader,  IonToolbar, IonContent } from '@ionic/vue';
    import { arrowBackOutline } from 'ionicons/icons';
    import { modalController } from "@ionic/vue";
    
    export default {
      name: 'Modal',
      components: { IonButton, IonHeader, IonToolbar, IonContent },
      setup(){
        const content = 'Content';
        return {
          content,
          modalController,
          arrowBackOutline,
          IonHeader,
          IonToolbar
        }
      }
    }
    </script>
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

    我确认解决此问题的最佳且最简单的方法是调用modalControllerdismiss() 函数。

    首先我们必须在我们的模态组件中导入modalController

    import { modalController } from "@ionic/vue";
    

    接下来我们可以像这样关闭模态:

    async function close() {
      await modalController.dismiss();
    }
    

    重要:我使用 await 是因为 dismiss 返回一个承诺,所以使用它很重要。

    【讨论】:

    • 这是从模式代码中关闭模式的最简单方法
    • 同意。每次都为我工作。
    【解决方案3】:

    我想你可以打电话

    modalController.dismiss()
    

    关闭任何打开的对话框...发射也应该可以工作,但没有看到该代码

    【讨论】:

    • 这是正确的答案。在你的模式中调用它,它会起作用。
    【解决方案4】:

    我通过使用函数 closeModal 传递一个道具“close”并在模态组件中定义道具“close”然后使用 this.close 调用它来解决它

    this.modal = await modalController.create({
                    component: Login,
                    componentProps: {
                      title: 'Iniciar sesión',
                      close: () => this.closeModal()
                  },
                    
                })
    

    在模态组件中:

    props: {
            title: {
                type: String,
                default: 'Super Modal'
            },
            close: { type: Function }
        },
    
    cerrarmodal() {
                this.$emit('close', {
                    foo: 'bar'
                })
                this.close()
                
            },
    

    【讨论】:

    • 这可能有效,但它很笨重,并且不使用旨在完成此任务的内置 modalController。这里的另外两个答案是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2012-06-11
    • 1970-01-01
    • 2020-05-10
    • 2019-05-30
    • 1970-01-01
    相关资源
    最近更新 更多