zoukankan      html  css  js  c++  java
  • vue 公用组件开发 消息提示$message

    文件目录:

    github地址:https://github.com/xingkongwuyu/vue-spa-experience/tree/master/src/components/message

    最终的效果:

     这里的样式颜色啥的写的比较草率了,图标也选的比较草率,我需要一个ui设计师,没有的话我只能随便打打颜色了

     组件的源码解析:

    message:  message的框架

    ./index.js

    import messageBox from './src/index';
    export default {
        install(Vue) {
          Vue.prototype.$message = messageBox;
        },
      };

    使用transition来实现动画效果

    <template>
      <transition name="mei-message-fade">
        <div v-if="show" :class="[
            'mei-message',
            type? `mei-message-${ type }` : '']"
          >
          <i v-if="type=='error'" class="mei-message-icon">
         <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" t="1515656768815" 
          style="" viewBox="0 0 1024 1024" version="1.1" p-id="2794"width="40" height="40"><path d="M512 958.016611c-245.919634 0-446.016611-200.064292-446.016611-446.016611 0-245.919634 200.095256-446.016611 446.016611-446.016611 245.952318 0 446.016611 200.064292 446.016611 446.016611S757.952318 958.016611 512 958.016611zM512 129.983389c-210.655557 0-382.016611 171.359333-382.016611 382.016611 0 210.624593 171.359333 382.016611 382.016611 382.016611 210.624593 0 382.016611-171.359333 382.016611-382.016611S722.624593 129.983389 512 129.983389z" p-id="2795"/><path d="M463.99957 304.00043c0 26.509985 21.490445 48.00043 48.00043 48.00043s48.00043-21.490445 48.00043-48.00043-21.490445-48.00043-48.00043-48.00043S463.99957 277.490445 463.99957 304.00043z" p-id="2796"/><path d="M512 768c-17.664722 0-32.00086-14.303454-32.00086-32.00086L479.99914 448c0-17.664722 14.336138-32.00086 32.00086-32.00086s32.00086 14.336138 32.00086 32.00086l0 287.99914C544.00086 753.696546 529.664722 768 512 768z" p-id="2797"/></svg>
          </i>
          <i v-if="type=='success'" class="mei-message-icon">
           <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" t="1515656188050"
           style="" viewBox="0 0 1024 1024" version="1.1" p-id="2186" data-spm-anchor-id="a313x.7781069.0.i11" width="40" height="40"><path d="M887.904744 298.20852c-12.863647-12.063755-33.151673-11.487488-45.215428 1.408843L415.935493 753.983819 182.815858 524.287381c-12.607338-12.416396-32.8644-12.287381-45.280796 0.319957-12.416396 12.576374-12.256417 32.8644 0.352641 45.248112l256.479935 252.671415c0.096331 0.096331 0.223626 0.127295 0.319957 0.223626s0.127295 0.223626 0.223626 0.319957c2.016073 1.919742 4.448434 3.008628 6.784464 4.288456 1.152533 0.672598 2.143368 1.663432 3.359548 2.143368 3.775837 1.47249 7.775299 2.239699 11.743798 2.239699 4.192125 0 8.384249-0.832576 12.287381-2.496009 1.312512-0.543583 2.33603-1.663432 3.552211-2.368714 2.399677-1.408843 4.895686-2.59234 6.944443-4.67206 0.096331-0.096331 0.127295-0.25631 0.223626-0.352641 0.063647-0.096331 0.192662-0.127295 0.287273-0.223626L889.277463 343.420508C901.439269 330.591265 900.768391 310.335923 887.904744 298.20852z" p-id="2187" fill="#ffffff"/></svg>
          </i>
          <span class="mei-message-con">{{text}}</span>
        </div>
      </transition>
    </template>
    
    <script type="text/babel">
      const typeMap = {
        success: 'success',
        info: 'info',
        warning: 'warning',
        error: 'error',
      
      };
      export default {
        data() {
          return {
            show:false,
            text:'',
            type:''
          };
        },
        computed: {
          iconClass() {
            return this.type
              ? `mei-message-icon mei-icon-${typeMap[this.type] }`
              : '';
          }
        },
      };
    </script>
    <style lang="scss" rel="stylesheet/scss" >
       .mei-message{
              position: fixed;
              min- 380px;
              border-radius: 4px;
              position: fixed;
              left: 50%;
              top: 20px;
              height:40px;
              transform: translateX(-50%);
              background-color: #edf2fc;
              transition: opacity .3s,transform .4s;
              overflow: hidden;
              padding: 15px 15px 15px 20px;
              background-color:#ccc;
              color:#000;
             
        }
        .mei-message-success{
            background-color:rgb(87, 161, 87); 
            color:#fff;
        }
        .mei-message-error{
            background-color:#ff5000; 
            color:#fff;
        }
        .mei-message-warning{
            background-color:#ccc; 
        }
        .mei-message-icon{
          display:inline-block;
          40px;
          height:40px;
          float:left;
        }
        .mei-message-con{
          line-height:40px;
          height:40px;
          display:inline-block;
          margin-left:10px;
        }
    .mei-message-fade-enter-active {
      transition: all 0.3s linear;
    }
    .mei-message-fade-leave-active {
      transition: all 0.3s linear;
    }
    .mei-message-fade-enter, .mei-message-fade-leave-to
    /* .slide-fade-leave-active for below version 2.1.8 */ {
      opacity: 0;
    }
    </style>

     ./src/index.js

    import Vue from 'vue';
    import messageVue from './message.vue';
    const defaults = {
        show:false,
        text:'',
        duration:'3000',
        type:''
    };
    const messageVueConstructor = Vue.extend(messageVue);
    messageVueConstructor.prototype.close = function() {
      var vm=this;
      this.$on('after-leave', _ => {
        if (vm.$el && vm.$el.parentNode) {
          vm.$el.parentNode.removeChild(vm.$el);
        }
        this.$destroy();
      });
        vm.show = false;
    
    };
    const messageBox = (options = {}) => {
        if (Vue.prototype.$isServer) return;
        options = Object.assign({}, defaults, options);
        let parent = document.body ;
        let instance = new messageVueConstructor({
          el: document.createElement('div'),
          data: options
        });
        parent.appendChild(instance.$el);
        Vue.nextTick(() => {
          instance.show = true;
          setTimeout(function(){
            instance.close();
          },options.duration)
        });
    
       
        return instance;
      };
      
      export default messageBox;

    引入全局 使用:

    import VueMessage from './components/message'
    Vue.use(VueMessage)
     message () {
             this.$message({
              type:'success',
              text:11111,
            });
    },

                 配置项:

          type:类型【success,error,info,warning
          button:按钮
    text:内容
          duration:时间

    这里type类型你们可以去找找好看的我就是随便乱弄了下 iconfont 另外我就找了success和error的icon比较草率;
     
  • 相关阅读:
    Hive之序列化与反序列化(SerDe)
    Hive从入门到精通
    HIVE从路人到入门
    Intel IDEA 2018破解(亲测成功)
    在小红家里面,有n组开关,触摸每个开关,可以使得一组灯泡点亮。
    一个n*n 的方格,要从左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走动的方法数。
    Ionic3多个自定义过滤器--管道(pipe)
    ionic3 添加多个自定义组件
    ionic3 slides轮播图手动滑动后无法自动播放问题
    Vue2.2版本学习小结
  • 原文地址:https://www.cnblogs.com/heyinwangchuan/p/8269369.html
Copyright © 2011-2022 走看看