vue中使用svg封装全局消息提示组件

 更新时间:2022年04月18日 11:19:36   作者:zxo_apple  
这篇文章主要为大家详细介绍了vue中使用svg封装全局消息提示组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了vue中使用svg封装全局消息提示组件的具体代码,供大家参考,具体内容如下

先看效果图

一、首先安装下载需要用到的svg相关依赖

npm install svg-sprite-loader --save-dev

二、针对没有vue.config.js文件的vue项目,直接在webpack.base.conf.js中进行如下两个配置

1.找到图片相关配置位置,添加款选出的代码

2.在图片配置后添加如下代码

三、根据添加的代码我们去src下创建一个icons文件夹,icons下面创建一个svg文件夹,用于存放svg结尾的图片

index.js文件夹中添加代码

import Vue from 'vue'
import SvgIcon from '../components/SvgIcon/SvgIcon'

Vue.component('svg-icon', SvgIcon)

const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)

四、在components中添加SvgIcon文件夹,并创建组件svgIcon.vue,添加以下代码

<template>
    <svg class="svg-icon" aria-hidden="true" v-on="$listeners">
        <use :xlink:href="iconName" />
    </svg>
</template>

<script>
    export default {
        name: "icon-svg",
        props: {
            iconClass: {
                type: String,
                required: true
            },
            className: {
                type: String,
                default: ""
            }
        },
        computed: {
            iconName() {
                return `#icon-${this.iconClass}`;
            },
            svgClass() {
                if (this.className) {
                    return "svg-icon " + this.className;
                } else {
                    return "svg-icon";
                }
            }
        }
    };
</script>

<style>
    .svg-icon {
        width: 30px;
        height: 30px;
        vertical-align: -0.15em;
        fill: currentColor;
        overflow: hidden;
    }
</style>

五、在main.js中引入,src下创建的icons文件夹

六、至此vue中使用svg就完成,接着直接在项目中使用即可

完成了svg的配置 接下来试下全局消息提示

一、在components下创建Message文件夹,文件夹下创建两个文件,一个message.vue,一个index.js

message.vue下添加以下代码

<template>
    <transition name="fade">
        <div class="message_wrap" :class="type === 'success' ? 'wrap_success' : 'wrap_fail'" v-if="isShow">
            <!-- **这里引入前面创建的svg** -->
            <svg-icon :icon-class="type === 'success' ? 'success' : 'fail'" style="margin-left: 40px;"></svg-icon>
            <div class="message" :class="type === 'success' ? 'message_success' : 'message_fail'">{{text}}</div>
        </div>
    </transition>
</template>

<script>
    export default {
        name: 'message',
        props: {
            type: {
                type: String,
                default: 'success',
            },
            text: {
                type: String,
                default: '',
            },
            isShow: {
                type: Boolean,
                default: true,
            },
        },
    };
</script>

<style scoped lang="scss">
    .message_wrap {
        position: fixed;
        min-width: 400px;
        height: 64px;
        top: 6%;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        justify-content: flex-start;
        align-items: center;
        .message {
            font-size: 18px;
            line-height: 64px;
            text-align: center;
            margin-left: 16px;
        }
        .message_success {
            color: #4caf50;
        }
        .message_fail {
            color: #ff5252;
        }
    }
    .wrap_success {
        background: rgba(234,246,234, .5);
    }
    .wrap_fail {
        background: rgba(255,235,235, .5);
    }

    .fade-enter-active, .fade-leave-active {
        transition: opacity .5s
    }
    .fade-enter, .fade-leave-active {
        opacity: 0
    }
</style>

index.js中添加以下代码

import vue from 'vue'
import Message from './message'
const messageConstructor = vue.extend(Message)

const MsgMain = {
    show(text, type, duration) {
        const instance = new messageConstructor()  // 创建实例
        instance.$mount(document.createElement('div')) // 创建dom元素
        document.body.appendChild(instance.$el) // 将dom元素添加到body中

        instance.type = type  // 写入属性
        instance.text = text  // 写入属性
        instance.isShow = true // 写入属性

        setTimeout(() => {
            instance.isShow = false  // 一段时候后关闭提示
        }, duration)
    },
    success(text, duration = 2000) {
        this.show(text, 'success', duration)  // 成功时调用
    },
    error(text, duration = 2000) {
        this.show(text, 'error', duration) // 失败时调用
    },
};
// 全局注册
function Msg() {
    vue.prototype.$message = MsgMain
}

export default Msg

二、在main.js中引入

三、使用:最后在需要用到的地方调用即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • vue.js-div滚动条隐藏但有滚动效果的实现方法

    vue.js-div滚动条隐藏但有滚动效果的实现方法

    下面小编就为大家分享一篇vue.js-div滚动条隐藏但有滚动效果的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • UniApp中实现类似锚点定位滚动效果

    UniApp中实现类似锚点定位滚动效果

    一个uniapp小程序的项目,我们需要实现一个非常实用的功能——类似于锚点定位的交互效果,即在首页中有多个tab(分类标签),每个tab对应着不同的模块,当用户点击某个分类的tab时,需要流畅地滚动到对应的内容位置,提供更好的用户体验,
    2023-10-10
  • vue实现表单未编辑或未保存离开弹窗提示功能

    vue实现表单未编辑或未保存离开弹窗提示功能

    这篇文章主要介绍了vue实现表单未编辑或未保存离开弹窗提示功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • vue中实现全屏以及对退出全屏的监听

    vue中实现全屏以及对退出全屏的监听

    本文主要介绍了vue中实现全屏以及对退出全屏的监听,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • vue3+vite项目跨域配置踩坑实战篇

    vue3+vite项目跨域配置踩坑实战篇

    vue3是一个流行的前端框架,vite是一个快速的构建工具,下面这篇文章主要给大家介绍了关于vue3+vite项目跨域配置踩坑实战的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Vue3.2 新增指令 v-memo 用法详解(提高性能利器)

    Vue3.2 新增指令 v-memo 用法详解(提高性能利器)

    v-memo 接受一个依赖的数组,依赖的数组变化,v-memo 所对应的 DOM 包括子集将会重新渲染,这篇文章主要介绍了Vue3.2 新增指令 v-memo 用法,提高性能的又一利器,需要的朋友可以参考下
    2022-09-09
  • vue一步步实现alert功能

    vue一步步实现alert功能

    本篇文章主要介绍了vue一步步实现alert功能,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • element-ui 弹窗组件封装的步骤

    element-ui 弹窗组件封装的步骤

    这篇文章主要介绍了element-ui 弹窗组件封装的步骤,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2021-01-01
  • Vue Router修改query参数url参数没有变化问题及解决

    Vue Router修改query参数url参数没有变化问题及解决

    这篇文章主要介绍了Vue Router修改query参数url参数没有变化问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 解决在el-dialog中无法正确获取DOM的问题

    解决在el-dialog中无法正确获取DOM的问题

    这篇文章主要介绍了解决在el-dialog中无法正确获取DOM的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论