Maison interface Web js tutoriel Comment utiliser v-model et promettre d'implémenter le composant pop-up vue

Comment utiliser v-model et promettre d'implémenter le composant pop-up vue

May 28, 2018 pm 03:00 PM
promise v-model

Cette fois, je vais vous montrer comment utiliser v-model et promettre d'implémenter le composant pop-up vue. Quelles sont les précautions concernant l'utilisation de v-model et promettre d'implémenter le composant pop-up vue. composant , ce qui suit est un cas pratique, jetons un coup d’oeil.

Récemment, l'entreprise a une activité back-end qui est écrite dans le système back-end existant. Cependant, elle devra être retirée séparément pour créer ultérieurement un nouveau système back-end pour cette activité. Par conséquent, la bibliothèque de composants vue dans le système back-end existant ne peut plus être utilisée (car je ne sais pas sur quelle bibliothèque de composants le futur système sera basé pour éviter les problèmes liés aux futurs projets de transplantation). la fonction de fenêtre contextuelle dans mon entreprise, je ne peux donc en écrire qu'une manuellement (même si c'est le cas. Le composant de fenêtre contextuelle est très simple et je souhaite le résumer moi-même. Veuillez indiquer s'il y a des erreurs sur). d'abord, j'ai utilisé les accessoires traditionnels et $emit, mais j'ai senti que la logique de devoir recevoir deux rappels d'annulation et de confirmation était dispersée, j'ai donc utilisé Écrire les deux rappels ensemble au lieu de deux rappels de promesse n'est pas nécessairement une bonne idée, mais c'est donne une idée.

1. Présentation

Regardons d'abord la méthode d'appel finale

méthode props $emit

<chat-modal ref="chat-modal" v-model="showModal" cancelText="取消" sureText="确认" title="弹窗标题" small @on-ok="onOK" @on-cancel="onCancel">
  <p>slot的东西,想向弹窗中添加自定义的内容</p>
</chat-modal>
methods: {
  display() {
   this.showModal = true;//交互点击手动触发显示弹窗 
  },
  onOK() {},//点击确认的回调
  onCancel() {}//点击取消的回调
}
Copier après la connexion

Méthode de rappel de promesse

<chat-modal ref="chat-modal"></chat-modal>
methods: {
  display() {
    this.$refs["chat-modal"].openModal({
      title: "弹窗标题",
      sureText: "确认",
      cancelText: "取消"
    }).then(res => {
      //点击确认的回调
    }, res => {
      //点击取消的回调
    })
  }
}
Copier après la connexion

L'avantage de la deuxième méthode est que toute la logique est concentrée en une seule méthode.

2. Jetez un oeil au code source du composant

astuce : Le style est un peu mauvais...

<template>
  <p>
    <p class="shadow" v-show="showModal"></p>
    <p class="modal" :class="{&#39;smSize&#39;: otherText.small || small}" v-show="showModal">
      <p class="header">{{ otherText.title || title}}</p>
      <p class="body">
        <slot></slot>
      </p>
      <p class="footer">
        <p class="item success" id="sure" ref="sure" @click="makeSure" v-show="otherText.sureText || sureText">{{ otherText.sureText || sureText }}</p>
        <p class="item red" id="cancel" ref="cancel" @click="makeCancel" v-show="otherText.cancelText || cancelText">{{ otherText.cancelText || cancelText }}</p>
      </p>
    </p>
  </p>
</template>
<script>
//此组件提供两种调用方法,可以在组件上v-model一个表示是否显示弹窗的对话框,然后需要的一些值通过props传入,然后$emit在组件上@监听做回调
//第二中方法所有的传值回调都只需要在组件内部的一个方法调用然后在组件外部this.$refs[xxx].open调用然后.then触发回调,比上一种方便些
var initOtherText = {
  sureText: "",
  cancelText: "",
  title: "",
  small: false
};
export default {
  props: {
    title: {
      type: String
    },
    sureText: {
      type: String
    },
    cancelText: {
      type: String
    },
    value: {
      type: Boolean
    },
    small: {
      type: Boolean
    }
  },
  watch: {
    value(newVal) {
      this.showModal = newVal;
    }
  },
  data() {
    return {
      otherText: JSON.parse(JSON.stringify(initOtherText)),
      showModal: this.value
    };
  },
  methods: {
    makeSure() {
      this.$emit("on-ok");
      this.$emit("input", false);
    },
    makeCancel() {
      this.$emit("on-cancel");
      this.$emit("input", false);
    },
    openModal(otherText) {
      this.otherText = { ...otherText };
      this.showModal = true;
      var pms = new Promise((resolve, reject) => {
        this.$refs["sure"].addEventListener("click", () => {
          this.showModal = false;
          resolve("点击了确定");
        });
        this.$refs["cancel"].addEventListener("click", () => {
          this.showModal = false;
          reject("点击了取消");
        });
      });
      return pms;
    }
  }
};
</script>
<style lang="scss" scoped>
.shadow {
  background-color: rgba(0, 0, 0, 0.5);
  display: table;
  height: 100%;
  left: 0;
  position: fixed;
  top: 0;
  transition: opacity 0.3s ease;
  width: 100%;
  z-index: 50;
}
.modal {
  display: table-cell;
  vertical-align: middle;
  overflow-x: hidden;
  position: fixed;
  background-color: white;
  box-shadow: rgba(0, 0, 0, 0.33) 0px 2px 8px;
  border-radius: 5px;
  outline: 0px;
  overflow: hidden;
  transition: all 0.3s ease;
  width: 600px;
  height: 400px;
  top: 50%;
  left: 50%;
  margin-top: -200px;
  margin-left: -300px;
}
.header {
  align-items: center;
  background-color: #62a39e;
  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.16);
  color: #fff;
  font-weight: bold;
  display: -ms-flexbox;
  display: flex;
  height: 3.5rem;
  padding: 0 1.5rem;
  position: relative;
  z-index: 1;
}
.body {
  align-items: center;
  padding: 1.5rem;
}
.footer {
  justify-content: flex-end;
  padding: 1.5rem;
  position: absolute;
  bottom: 0;
  width: 100%;
  float: right;
}
.item {
  color: white;
  text-align: center;
  border-radius: 5px;
  padding: 10px;
  cursor: pointer;
  display: inline-block;
}
.info {
  background-color: #2196f3;
}
.success {
  background-color: #62a39e;
}
.red {
  background-color: #e95358;
}
.smSize {
  height: 200px;
}
</style>
Copier après la connexion

Première analyse Regardons la première méthode : l'appelant doit lier une variable (showModal dans cet exemple) au v-model en dehors du composant pour indiquer si la fenêtre contextuelle est affichée lors de l'affichage, il doit définir manuellement this.showModal = true à l'extérieur du composant et la définition des accessoires à l'intérieur du composant. Un attribut pour recevoir cette valeur est value : {type : Boolean}. En même temps, une variable est déclarée à l'intérieur du composant pour synchroniser les accessoires. valeur transmise de l'extérieur. La valeur par défaut est showModal : this.value (la valeur déclarée en interne est également appelée showModal ), écoutez dans la montre la synchronisation watch: { value(newVal) { this.showModal = newVal } } puis liez la valeur showModal à l'intérieur du composant à l'élément DOM ; qui doit être affiché ou masqué. L'événement est rejeté lorsque vous cliquez sur les boutons OK et Fermer à l'intérieur du composant

makeSure() {
      this.$emit("on-ok");
      this.$emit("input", false);
    },
makeCancel() {
      this.$emit("on-cancel");
      this.$emit("input", false);
    }
Copier après la connexion

this.$emit("on-ok");this.$emit("on-cancel"); Ces deux phrases concernent le rejet de l'événement, sortez-le du composant @, puis écrivez ce dont vous avez besoin. . La fonction de rappel . À ce stade, la fenêtre contextuelle peut être affichée et masquée. Vous constaterez peut-être qu'il n'y a aucun code pour définir this.showModal = false; Principalement à cause de ces lignes de code v-model = 'showModal' et props: {value: {type: Boolean}} this.$emit("input", false) à l'intérieur du composant. v-model est en fait le sucre syntaxique de vue. <chat-modal v-model="showModal"> peut en fait être écrit comme <chat-modal :value="showModal" @input="showModal = arguments[0]">, nous devons donc spécifier que le nom des accessoires doit avoir une valeur à l'intérieur du composant, puis déclencher la confirmation ou l'annulation à l'intérieur du composant. composant this.$emit("input", false) De cette façon, la fenêtre contextuelle peut être masquée directement sans déranger l'utilisateur et sans lui demander de définir manuellement showModal sur false en dehors du composant.

Regardons ensuite la méthode de promesse : Dans la première méthode, les valeurs transmises sont toutes transmises via props Pour le recevoir, cette méthode définit un autre objet à l'intérieur du composant pour recevoir la valeur entrante,

var initOtherText = {
  sureText: "",
  cancelText: "",
  title: "",
  small: false
};
otherText: JSON.parse(JSON.stringify(initOtherText)),
Copier après la connexion

puis définit une méthode nommée openModal dans menthods, puis prend la valeur entrante. Une série de paramètres est assignée à l'objet à l'intérieur du composant this.otherText = { ...otherText }; this.showModal = true; et showModal est défini sur true, puis un nouvel objet de promesse est créé à chaque fois qu'il est déclenché. sont deux événements de clic, cliquez sur OK et Annuler. Le DOM doit être manipulé ici

this.$refs["sure"].addEventListener("click", () => {
  this.showModal = false;
  resolve("点击了确定");
});
Copier après la connexion

Obtenez l'événement de clic de liaison de l'élément DOM du bouton OK, définissez showModal sur false dans le rappel et résolvez. 🎜>

this.$refs["cancel"].addEventListener("click", () => {
  this.showModal = false;
  reject("点击了取消");
});
Copier après la connexion
Obtenez l'événement de clic de liaison DOM du bouton Annuler, rejetez.

Pièges rencontrés lors du rappel

J'ai déjà rencontré un piège, car l'événement click a été lié pour la première fois. La résolution et le rejet échoueront la deuxième fois. Je voulais annuler l'événement de liaison, mais parce que la fenêtre contextuelle entière

était affichée : none;, il n'est pas nécessaire de le dissocier manuellement. La seconde consiste à savoir s'il faut utiliser v-if ou v-show pour masquer la fenêtre contextuelle. J'ai utilisé v-if au début mais j'ai trouvé cela à cette étape v-show="showModal".

this.showModal = true;
var pms = new Promise((resolve, reject) => {
  this.$refs["sure"].addEventListener.xxx//省略
});
return pms;
Copier après la connexion

将showModal置为true时然后就去绑定事件这时候还没有DOM还没有解析玩DOM树上还没有,要不就得用this.$nextTick增加了复杂度,最后采用了v-show;

关于优先级问题

如果既在组件上用prop传了值(title,sureText之类的)如 <chat-modal" title="xx" sureText="xxx"></chat-modal> 也在方法里传了

this.$refs["chat-modal"].openModal({
  title: "服务小结",
  sureText: "提交并结束",
  cancelText: "取消"
  }).then();
Copier après la connexion

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

如何使用Vue内父子组件通讯todolist组件

如何使用Vue整合AdminLTE模板

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser v-model.number pour implémenter la conversion du type de données des zones de saisie dans Vue Comment utiliser v-model.number pour implémenter la conversion du type de données des zones de saisie dans Vue Jun 11, 2023 am 08:54 AM

Dans Vue, v-model est une instruction importante utilisée pour implémenter la liaison bidirectionnelle. Elle nous permet de synchroniser facilement les entrées de l'utilisateur avec l'attribut data de Vue. Mais dans certains cas, nous devons convertir les données, comme la conversion du type de chaîne saisi par l'utilisateur en un type numérique. Dans ce cas, nous devons utiliser le modificateur .number de v-model pour y parvenir. Utilisation de base de v-model.number v-model.number est une modification de v-model

Tenir parole : les avantages et les inconvénients de tenir ses promesses Tenir parole : les avantages et les inconvénients de tenir ses promesses Feb 18, 2024 pm 08:06 PM

Dans la vie quotidienne, nous rencontrons souvent des problèmes entre promesses et réalisation. Que ce soit dans une relation personnelle ou dans une transaction commerciale, tenir ses promesses est essentiel pour instaurer la confiance. Cependant, les avantages et les inconvénients de l’engagement sont souvent controversés. Cet article explorera les avantages et les inconvénients des engagements et donnera quelques conseils sur la façon de tenir parole. Les avantages promis sont évidents. Premièrement, l’engagement renforce la confiance. Lorsqu’une personne tient parole, elle fait croire aux autres qu’elle est une personne digne de confiance. La confiance est le lien établi entre les personnes, qui peut les rendre plus

Que dois-je faire si je rencontre une TypeError non capturée (promise) dans une application Vue ? Que dois-je faire si je rencontre une TypeError non capturée (promise) dans une application Vue ? Jun 25, 2023 pm 06:39 PM

Vue est un framework frontal populaire et vous rencontrez souvent diverses erreurs et problèmes lors du développement d'applications. Parmi eux, Uncaught(inpromise)TypeError est un type d’erreur courant. Dans cet article, nous discuterons de ses causes et de ses solutions. Qu'est-ce qu'une erreur de type non interceptée (inpromise) ? L'erreur Uncaught(inpromise)TypeError apparaît généralement dans

Résoudre l'erreur Vue : impossible d'utiliser v-model pour la liaison de données bidirectionnelle Résoudre l'erreur Vue : impossible d'utiliser v-model pour la liaison de données bidirectionnelle Aug 25, 2023 pm 04:49 PM

Résoudre l'erreur Vue : impossible d'utiliser v-model pour la liaison de données bidirectionnelle lors du développement avec Vue, l'instruction v-model est souvent utilisée pour réaliser une liaison de données bidirectionnelle, mais nous rencontrons parfois un problème lors de l'utilisation de v- Une erreur. sera signalé lors de l'utilisation du modèle et la liaison de données bidirectionnelle ne peut pas être effectuée correctement. Cela peut être dû à certaines erreurs courantes. Ci-dessous, je présenterai plusieurs situations courantes et les solutions correspondantes. L'attribut props du composant n'est pas défini correctement lorsque nous utilisons le composant, si nous devons passer v-.

En savoir plus sur Promise.resolve() En savoir plus sur Promise.resolve() Feb 18, 2024 pm 07:13 PM

Une explication détaillée de Promise.resolve() nécessite des exemples de code spécifiques. Promise est un mécanisme en JavaScript pour gérer les opérations asynchrones. Dans le développement réel, il est souvent nécessaire de traiter certaines tâches asynchrones qui doivent être exécutées dans l'ordre, et la méthode Promise.resolve() est utilisée pour renvoyer un objet Promise qui a été rempli. Promise.resolve() est une méthode statique de la classe Promise, qui accepte un

Erreur Vue : le modèle v ne peut pas être utilisé correctement pour la liaison de données bidirectionnelle. Comment le résoudre ? Erreur Vue : le modèle v ne peut pas être utilisé correctement pour la liaison de données bidirectionnelle. Comment le résoudre ? Aug 19, 2023 pm 08:46 PM

Erreur Vue : le modèle v ne peut pas être utilisé correctement pour la liaison de données bidirectionnelle. Comment le résoudre ? Introduction : la liaison de données bidirectionnelle est une fonctionnalité très courante et puissante lors du développement avec Vue. Cependant, nous pouvons parfois rencontrer un problème, c'est-à-dire que lorsque nous essayons d'utiliser le modèle V pour la liaison de données bidirectionnelle, nous rencontrons une erreur. Cet article décrit la cause et la solution de ce problème et fournit un exemple de code pour montrer comment résoudre le problème. Description du problème : lorsque nous essayons d'utiliser v-model dans Vue

Utilisation de la liaison bidirectionnelle de v-model dans Vue pour optimiser les performances des données d'application Utilisation de la liaison bidirectionnelle de v-model dans Vue pour optimiser les performances des données d'application Jul 17, 2023 pm 07:57 PM

Utilisation de la liaison bidirectionnelle de v-model dans Vue pour optimiser les performances des données d'application Dans Vue, nous utilisons souvent la directive v-model pour réaliser une liaison bidirectionnelle entre les éléments de formulaire et les données. Cette liaison bidirectionnelle simplifie considérablement le processus de développement et améliore l'expérience utilisateur. Cependant, étant donné que v-model doit écouter l'événement d'entrée de l'élément de formulaire, cette liaison bidirectionnelle peut entraîner certains problèmes de performances lorsque la quantité de données est importante. Cet article présentera comment optimiser les performances des données lors de l'utilisation du v-model et fournira un

Exemple d'analyse du principe et de l'utilisation d'ES6 Promise Exemple d'analyse du principe et de l'utilisation d'ES6 Promise Aug 09, 2022 pm 03:49 PM

Utilisez les objets Promise pour modifier les fonctions ordinaires afin de renvoyer Promise afin de résoudre le problème de l'enfer des rappels. Comprendre la logique d'appel du succès et de l'échec de Promise et pouvoir l'ajuster de manière flexible. Comprenez les connaissances de base, utilisez-les en premier, puis intégrez et absorbez lentement les connaissances.

See all articles