vue toastヒントボックスコンポーネントとVueBuseventコンポーネントvue-happy-busソースコードの解読、あなたはまだ知らないBuseventの使用方法...

7686 ワード

前言
皆さん、こんにちは.また一週間も会っていません.今週は先週話したVueBuseventのコンポーネントvue-happy-busのソースコード解読とtoastヒントボックスのコンポーネントについて話します.
vue-happy-busソースコード解読
vue-happy-busの使い方を見たことがない方は、私のこの文章を見てください.vue-happy-busの使い方は初心者に向いています.Vue eventbusの使用における繰返しトリガソリューションおよび存在するBug
まず、以下のソースコードの解読は私の個人的な観点を代表しているだけで、もしみんなが興味があれば、やはり自分でソースコードを理解したり、以下の討論区で積極的に評論したり討論したりすれば、私はいつでもこの内容に注目して修正します.
ここで下の注釈に注意して、私は私の理解を下の注釈の中に書いて暑いですが、まだ少し気に入らないので、ここで皆さんの指摘を歓迎します.

(function (global, factory) {
    //             ,    function    Vue$ exports          function
	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('vue')) :
	typeof define === 'function' && define.amd ? define(['exports', 'vue'], factory) :
	(factory((global['happy-bus'] = {}),global.Vue$));
    //	       window,     window        Vue  ,         
}(this, (function (exports,Vue$) { 'use strict';
//     Vue$ Vue$        default  ,  Vue$  efaul,    Vue$  
Vue$ = Vue$ && Vue$.hasOwnProperty('default') ? Vue$['default'] : Vue$;
//     
var version = "0.1.0";
//  window      Vue
var Vue = Vue$;
if (typeof window !== 'undefined' && window.Vue) {
  Vue = window.Vue;
}

//               ,       Vue      
var EventStore = {};
var Bus = new Vue();

//          
var destroyHandler = function destroyHandler() {
  // this        vue  
  var currentEventObj = EventStore[this._uid];
  if (typeof currentEventObj === 'undefined') {
    return;
  }
  for (var type in currentEventObj) {
    var key = Array.isArray(type) ? type.join(',') : type;
    // Bus     ,   bus.$emit     bus.$off  
    Bus.$off(type, currentEventObj[key]);
  }
  //          
  delete EventStore[this._uid];
};

//  BusFactory       ,    $on,$off,$once,$emit  。
var BusFactory = function BusFactory(vm) {
  //         destroyed   ,     
  var destroyed = vm.$options.destroyed;
  //          (vue     ID),  id            css       
  var uid = vm._uid;
  //               
  EventStore[uid] = {};
  //        destroyed  
  !destroyed.includes(destroyHandler) && destroyed.push(destroyHandler);

  return {
    $on: function $on(type, handler) {
      //     bus.$emit
      console.log(type, handler)
      var key = Array.isArray(type) ? type.join(',') : type;
      //     bus.$emit   
      console.log(key)
      EventStore[uid][key] = handler;
      //  bus.$on        (em) => {
      //  console.log(em)//   
      // }
      //        bus.$on   
      console.log(EventStore[uid][key])
      Bus.$on(type, handler);
    },
    //          ,  type true  false  ,        
    $off: function $off(type, handler) {
      // $off()   type   ,      
      if (!type) {
        //    uid     
        delete EventStore[uid];
        Bus.$off();
        return;
      }
      //    key               。          。
      var key = Array.isArray(type) ? type.join(',') : type;
      //        
      delete EventStore[uid][key];
      Bus.$off(type, handler);
    },
    $once: function $once() {
      //         ones                        ,                        
      return Bus.$once.apply(Bus, arguments);
    },
    $emit: function $emit() {
      //       ,            .
      return Bus.$emit.apply(Bus, arguments);
    }
  };
};

BusFactory.$emit = function () {
  //  emit  
  return Bus.$emit.apply(Bus, arguments);
};
BusFactory.$once = function () {
  //  once  
  return Bus.$once.apply(Bus, arguments);
};

exports['default'] = BusFactory;
exports.version = version;

Object.defineProperty(exports, '__esModule', { value: true });


//     BusFactory      main.js                   ,            
})));

注意してください.この中には4つの方法$on,$off,$once,$emitが登録されています.重要なのは、$offイベントが$onイベントを使用した後、destroyedで自動的に破棄イベントを登録することです.このような方法は、手動で登録して破棄する必要はありません.自動的にマッチングと破棄操作を行う必要はありません.ここで破棄した後、2回のトリガの問題を心配する必要はありません.あなたの転送の値を安心して管理すればいいのです.
ここで比較的良い書き方は、$emitイベントを作成する際に$offメソッドを自動的に登録して$emitメソッドを使用した後に直接ループを使用して$onメソッドを使用して受信しているパラメータを検出し、その後$onメソッドを使用した後に直接内部で破棄し、二次呼び出しに影響を与えないと思います.しかし、このコンポーネントは、小さなプロジェクトを解決する際に適しているか、プロジェクトを解決する前に緊急オンラインを解決する際に使用したほうがいいです.
vue toastプロンプトボックスコンポーネントを手で引く
構想を話して、最初はブラウザのデフォルトのポップアップボックスがみっともないと思っていたので、クリックしないグローバルなヒントを作るために、toastヒントボックスコンポーネントが誕生しました.次に全体の構想を話します.
まず、ある検証の場合、緑色の完了ヒント、または赤色のエラーヒントなど、さまざまなヒントが必要です.では、ヒントはヒント語と表示の色で構成されています.このコンポーネントは2つのパラメータを入力する必要があります.最初のヒントタイトルボックスの色です.2番目のヒント.
まずtoastを作成します.js、中の書き方は普通のjsの書き方と同じです

//                   
function toast(color, text){
    //    div                  
	const body = document.getElementsByTagName('body')
	const toast = document.createElement("div")
	toast.innerText = text
	toast.className = 'toast' +" "+ color
	document.body.appendChild(toast)
    //               
	setTimeout(function(){
		document.body.removeChild(toast)
	}, 5000)
}
exports.toast= toast;

次はcss

.toast {
    position: fixed;
    top: -100px;
    left: 50%;
    margin-left: -199px;
    width: 398px;
    height: 50px;
    animation: myfirst 5s;
    animation-direction:alternate;
    z-index: 9999999999;
    text-align: center;
}
.toast.red {
    background-color: #fbe7ea;
    border: 1px solid #e57785;
    line-height: 50px;
    color: #e57785;
}
.toast.blue {
    background-color: #c5eafb;
    border: 1px solid #0083ae;
    line-height: 50px;
    color: #0083ae;
}
.toast.green {
    background-color: #dff0d7;
    border: 1px solid #378d4e;
    line-height: 50px;
    box-sizing: border-box;
    color: #378d4e;
}
#toast_close{
    cursor: pointer;
    display: block;
    float: right;
    width: 50px;
    height: 50px;
    text-align: center;
    font-size: 30px;
    position: absolute;
    top: 0;
    right: 0;
}
@keyframes myfirst
{
    0% {top: -200px;display: block;}
    25% {top: 100px;}
    50% {top: 100px;}
    75% {top: 100px;}
    100% {top: -200px;}
}

その後はグローバル導入

//main.js
...
//           ,       
import './lib/toast/toast.css'
import toast from './lib/toast/toast.js'
// toast.js          
Vue.prototype.$toast = toast;

a.vueの作成

 export default {
        name: '',
        data: function () {
        
        },
        methods: {
            toast:function(){
                this.$toast.toast('green', '    ,   toast   ')
            }
        }
 }






このように呼び出すと完成し、実は非常に簡単にvueコンポーネントをカプセル化することができますが、私のプロジェクトでしか使用できません.カプセル化はまだ完璧ではありません.またmixinsquでカプセル化することもできます.vueで専門的に露出した方法でカプセル化することもできます.私はここでプレゼンテーションをしているだけで、この方法だけが実行できるわけではありません.また、私が前に書いたVue mixinsの使い方や注意点を理解することに興味があります.以下にリンクがあります.Vue mixinsの使い方や注意点について
後記
今日の話は少し少ないような気がしますが、文章はどれだけの字を書くかではなく、その品質が優れているかどうかにかかっています.これだけで十分です.問題があるので、以下の評論区で議論してください.ありがとうございます.私は先にフラッシュしてvue-routerをやめました.ここで予告をして、来週vue-routerの使用を浅く説明します.
転載先:https://juejin.im/post/5b57259ee51d4516e91f995b