2.vue造轮子-icon

前言

前面的button做的差不多,但是现在要做一个效果就是 点击按钮会出现 loading 这个icon 再点击就消失

image.png

到这一步如何做?

icon

发现重新使用了好多 icon,那么就做一个icon的组件

<template>
    <svg class="g-icon" aria-hidden="true">
        <use :xlink:href="`#i-${name}`"></use>
    </svg>
</template>

<script>
    export default {
        props: ['name']
    }
</script>

<style lang="scss">
    .g-icon {
        width: 1em;
        height: 1em;
        vertical-align: -0.15em;
        fill: currentColor;
        overflow: hidden;
    }
</style>

其中 props 接收参数名,替换 template中的 name

将button.vue中的原来的写法替换下

image.png
<template>
    <button class="g-button" :class="{[`icon-${iconPosition}`]:true}">
        <g-icon class="icon" v-if="icon " :name="icon"></g-icon>
        <div class="content">
            <slot/>
        </div>
    </button>
</template>

添加loading

<template>
    <button class="g-button" :class="{[`icon-${iconPosition}`]:true}" @click="$emit('click')">
        <g-icon class="icon" v-if="icon" :name="icon"></g-icon>
        <g-icon class="loadding" name="loading"></g-icon>
        <div class="content">
            <slot/>
        </div>
    </button>
</template>

<style>
 @keyframes spin {
    0%{transform: rotate(0deg)}
    100%{transform: rotate(360deg)}
}
.loadding{
    animation:spin 1s infinite linear;
 }
</style>

上面代码中下方的css是 添加动画效果

image.png

处理细节

当loading 出现的时候 其他的就不要出现

<template>
    <button class="g-button" :class="{[`icon-${iconPosition}`]:true}" @click="$emit('click')">
        <g-icon class="icon" v-if="icon && !loading " :name="icon"></g-icon>
        <g-icon class="loadding icon" v-if="loading" name="loading"></g-icon>
        <div class="content">
            <slot/>
        </div>
    </button>
</template>

<script>
    export default {
        // props: ['icon', 'iconPosition']
        // iconPosition : left right
        props: {
            icon:{},
            loading:{
              type:Boolean,
              default: false
            },
            iconPosition:{
                type:String,
                default:'left',
                validator(value){
                    return value === 'left' || value === 'right';
                }
            }
        }
    }
</script>

接收父组件传来的值

<div id="app">
    <g-button :loading="true">按钮</g-button>
</div>

点击事件

当点击按钮的时候 出现loading 再点击就消失

image.png
image.png

index.html

<div id="app">
    <g-button :loading="loading1" @click="loading1 = !loading1">按钮</g-button>
    <g-button icon="setting" icon-position="left" :loading="loading2" @click="loading2 = !loading2">按钮</g-button>
    <g-button icon="setting" icon-position="right" :loading="loading3" @click="loading3 = !loading3">按钮</g-button>
</div>

其中loading1就是app.js中设置的值

import Vue from 'vue'
import  Button from './button'
import  Icon from './icon'

Vue.component('g-button',Button);
Vue.component('g-icon',Icon);

new Vue({
    el: "#app",
    data:{
        loading1:false,
        loading2:true,
        loading3:false
    }
});

button.vue

<template>
    <button class="g-button" :class="{[`icon-${iconPosition}`]:true}" @click="$emit('click')">
        <g-icon class="icon" v-if="icon && !loading " :name="icon"></g-icon>
        <g-icon class="loadding icon" v-if="loading" name="loading"></g-icon>
        <div class="content">
            <slot/>
        </div>
    </button>
</template>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 7,627评论 0 25
  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,297评论 0 1
  • 小树画画阅读 143评论 0 0
  • 最后的夜,没有月光,不爽啊。 2019年6月30日,上半年的最后一天,上半年,就这么结束了。 明天,7月一日,20...
    山中客卿阅读 152评论 0 2
  • 亲爱的小伙伴, 大家晚上好, 欢迎来到甩宝宝群 很多人呢 还不了解甩宝宝是什么? 那今天简单的人说一下,甩宝宝是由...
    杭宝妈妈玖维设计阅读 154评论 0 0

友情链接更多精彩内容