亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue如何實現過渡動畫Message消息提示組件

發布時間:2022-07-28 09:52:23 來源:億速云 閱讀:229 作者:iii 欄目:開發技術

本篇內容主要講解“vue如何實現過渡動畫Message消息提示組件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“vue如何實現過渡動畫Message消息提示組件”吧!

概述

在我自己平時做項目的時候,必不可少的會用到message組件,用來對用戶友好反饋,總之使用頻率還是挺高的,剛開始工作的時候,經常用的就是組件庫的現成的,想想也不能總是用別人現成的,最近模擬組件庫調用方式自己寫了一個消息提示組件,支持過渡效果,支持自己進行擴展。

目錄結構

vue如何實現過渡動畫Message消息提示組件

  • .src/component/MessageBox/MessageBox.vue代碼:

<template>
//css實現過渡
  <transition name="fade-in" mode="out-in">
    <div
      :class="['message-box', 'message-box-' + type]"
      v-if="show"
      :
    >
      <p>{{ message }}</p>
    </div>
  </transition>
  //方法2:js實現過渡,用到了Velocity
   <transition
    name="fade-in"
    mode="out-in"
    v-bind:css="false"
    v-on:before-enter="beforeEnter"
    v-on:enter="enter"
    v-on:leave="leave"
  >
  <div
      :class="['message-box', 'message-box-' + type]"
      v-if="show"
      :
    >
      <p>{{ message }}</p>
    </div>
  </transition>
</template>
<script>
//動畫組件用到了Velocity,詳細用法可以看官網
import Velocity from "velocity-animate";
export default {
  name: "MessageBox",
  props: {
    message: {
      type: String,
      default: "",
    },
    type: {
      type: String,
      default: "default",
    },
    showClose: {
      type: Boolean,
      default: false,
    },
    center: {
      type: Boolean,
      default: false,
    },
    onClose: {
      type: Function,
      default: () => {},
    },
    offset: {
      type: Number,
      default: 20,
    },
  },
  data() {
    return {
      show: false,
    };
  },
  methods: {
    setShow(status) {
      this.show = status;
    },
    //以下是js實現動畫效果邏輯
       beforeEnter: function (el) {
      el.style.opacity = 0;
    },
    enter: function (el, done) {
      Velocity(el, { opacity: 1 }, { duration: 300 }, { complete: done });
    },
    leave: function (el, done) {
      Velocity(
        el,
        {
          top: 0,
          opacity: 0,
        },
        { duration: 300 ,easing: "ease-in"},
        { complete: done }
      );
    },
  },
};
</script>
<style lang="less">
.message-box {
  width: 380px;
  height: 48px;
  position: fixed;
  left: 50%;
  transform: translate(-50%);
  top: 20px;
  line-height: 48px;
  padding-left: 20px;
}
.message-box-default {
  background-color: #edf2fc;
  color: #cccc;
}
.message-box-success {
  background-color: #bcdbae;
  color: green;
}
.message-box-warning {
  background-color: #fdf6ec;
  color: orange;
}
.message-box-error {
  background-color: #f3f0f0;
  color: red;
}
.fade-in-enter-active,
.fade-in-leave-active {
  transition: all 0.5s;
}
.fade-in-enter,
.fade-in-leave-to {
  top: 0;
  opacity: 0;
  transform: translate(-50%, 0);
}
</style>
  • .src/component/MessageBox/index.js代碼:

//這里主要是為了按需注冊導出當前組件
import MessageBox from "./MessageBox.vue";
export default MessageBox;
  • .src/component/index.js代碼:

import MessageBox from "./MessageBox/index";
const componetns = [MessageBox];
export { MessageBox };
//保存所有提示組件的偏移量隊列
const messageQueen = [];
export default {
  install(Vue) {
  //注冊全局組件
    componetns.forEach((compoennt) => {
      Vue.component(compoennt.name, compoennt);
    });
    //掛載實例化消息組件對象
    Vue.prototype.$message = {
      warning(message) {
        Vue.prototype.$show({ message, type: "warning" });
      },
      success(message) {
        Vue.prototype.$show({ message, type: "success" });
      },
      error(message) {
        Vue.prototype.$show({ message, type: "error" });
      },
      default(message) {
        Vue.prototype.$show({ message, type: "default" });
      },
    };
    Vue.prototype.$show = function (props) {
      // 向彈窗隊列添加當前組件的偏移量(入棧)
      if (!messageQueen.length) {
        messageQueen.push(20);
      } else {
        messageQueen.push(messageQueen[messageQueen.length - 1] + 20 + 48);
      }
      /*
       *方法1:直接返回一個vnode組件虛擬dom也可以
       */
      // let MessageBoxConstructor = Vue.extend({
      //   render(h) {
      //     return h("message-box", {
      //       props: {
      //         ...props,
      //         show: true,
      //       },
      //     });
      //   },
      // });
      let MessageBoxConstructor = Vue.extend(MessageBox);
      // 方法2:實例化組件的時候傳遞配置項也是可以的
      let messageBoxInstance = new MessageBoxConstructor({
        // 向組件傳遞props數據,具體參考vue官方propsData
        propsData: {
          ...props,
          offset: !messageQueen.length
            ? 20
            : messageQueen[messageQueen.length - 1],
        },
      }).$mount();
      document.body.appendChild(messageBoxInstance.$el);
      // 顯示彈窗(增加過渡效果)
      messageBoxInstance.setShow(true);
      setTimeout(() => {
        // 當前彈窗出棧
        messageQueen.shift();
        // 銷毀彈窗(增加過渡效果)
        messageBoxInstance.setShow(false);
      }, 1500);
    };
  },
};
  • .src/App/index.js代碼:

<template>
  <div id="app">
    <button @click="handleSuccess">成功</button>
    <button @click="handleWarning">警告</button>
    <button @click="handleDefault">消息</button>
    <button @click="handleError">錯誤</button>
  </div>
</template>
<script>
export default {
  name: "App",
  methods: {
    handleSuccess() {
      this.$message.success("這是一條成功消息");
    },
    handleWarning() {
      this.$message.warning("這是一條警告消息");
    },
    handleDefault() {
      this.$message.default("這是一條消息提示");
    },
    handleError() {
      this.$message.error("這是一條失敗消息");
    },
  },
};
</script>
<style lang="less">
button {
  width: 70px;
  height: 45px;
  border: 1px solid #000;
  margin: 5px!important;
}
</style>
  • 效果圖:

vue如何實現過渡動畫Message消息提示組件

vue如何實現過渡動畫Message消息提示組件

到此,相信大家對“vue如何實現過渡動畫Message消息提示組件”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

林周县| 牡丹江市| 宁波市| 张家界市| 大厂| 大荔县| 峨眉山市| 防城港市| 宜章县| 和林格尔县| 莆田市| 大兴区| 丘北县| 盐城市| 阿坝| 淮阳县| 萝北县| 叶城县| 蓬溪县| 祁连县| 大安市| 平武县| 通海县| 嘉善县| 阜阳市| 蒙自县| 称多县| 梁河县| 通江县| 莱州市| 兖州市| 惠来县| 铅山县| 广灵县| 台南县| 连山| 宝兴县| 长汀县| 天气| 常德市| 旅游|