封装组件库仿elementui<1>

目录

type属性

引入字体图标 

button的点击事件

disabled属性


methods:{
  //点击事件是外部注册的
  handleClick(e){
    this.$emit('click',e)
    //通知父组件点击了,点了按钮,触发外界的click?传参为事件对象
    //向父组件派发了click事件
  }
},

type属性

用到props传参,app向button组件传参数type

- app.vue:
<miao-button type="primary"></miao-button>

- button.vue:

<button :class="[`miao-button-${type}`]">

export default{

 props:{

 type:{

 type:String,

default:'default'
}

}

}

分别设置 plain,round,circle类的图标:

三者都是boolean类型

- app.vue:

<div class="row">
      <miao-button plain round>sousuo</miao-button>
      <miao-button plain round type="primary">sasa</miao-button>
      <miao-button plain round type="warning">ss</miao-button>
      <miao-button plain round type="success">ss</miao-button>
      <miao-button plain round type="info">ss</miao-button>
      <miao-button plain round type="danger">ss</miao-button>
      <!-- 把type属性传给封装的button组件,plain值bool类型 -->
    </div>

- button.vue

plain:{
  type:Boolean,
  default:false
 },
<button class="miao-button" :class="[`miao-button-${type}`,{
    'is-plain':plain,
    'is-round':round,
    'is-circle':circle
  }]">

引入字体图标 

在main.js里引入

import './assets/fonts/iconfont.css'

在下载下来的iconfont.css里 把类名全改成miao-icon

像这样:

.miao-icon-bluray:before {
  content: "\e6a4";
}

然后在button里添加

<button class="miao-button" :class="[`miao-button-${type}`,{
    'is-plain':plain,
    'is-round':round,
    'is-circle':circle
  }]">
    <!-- is-plain是个bool值用对象来控制 -->
    <i class="miao-icon miao-icon-camera"></i>
    <span>
        <slot></slot>
    </span>
    </button>

添加了那句:

 <i class="miao-icon miao-icon-camera"></i>

然后所有button都有了camera的icon

但是这里添加属性要两个类:
.miao-icon .miao-icon-camera
用属性选择器:[class*='miao-icon']
*=是包含的意思,只要类名包含miao-icon-,就用如下样式,这样就只要写一个类名就行了

[class*='miao-icon'] {
  font-family: "iconfont" !important;
  font-size: 16px;
  font-style: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

这样这句话就改为:

 <i class=" miao-icon-camera"></i>

.miao-button [class*=miao-icon-]+span{
	margin-left:5px
}

//找到.miao-button元素里的包含miao-icon-的类的后面的span给他加个margin-left

然后发现button里点击事件,直接给组件定义事件无法触发

$slots能够获取所有插槽,只有icon的slots为空就可以不显示文字span

button的点击事件

如果在父组件app.vue里随便一个按钮注册事件:

<miao-button @click="fn">sousuo</miao-button>

会发现点击按钮没有动静

需要在子组件里:

button.vue里:

<button class="miao-button" :class="[`miao-button-${type}`,{
    'is-plain':plain,
    'is-round':round,
    'is-circle':circle
  }]"
  @click="handleClick"
  >

添加这个click然后向父组件派发click事件

methods:{
  //点击事件是外部注册的
  handleClick(e){
    this.$emit('click',e)
    //通知父组件点击了,点了按钮,触发外界的click?传参为事件对象
    //向父组件派发了click事件
  }
},

然后就能正常触发了

disabled属性

<button class="miao-button" :class="[`miao-button-${type}`,{
    'is-plain':plain,
    'is-round':round,
    'is-circle':circle,
    'is-disabled':disabled

  }]"
  :disabled="disabled"
  @click="handleClick"
  >

props里添加

disabled:{
  type:Boolean,
  default:false
 }

样式添加:

// disabled属性
.miao-button.is-disabled {
  cursor: no-drop;
  opacity: .5;
    cursor: not-allowed;
}

相关推荐

  1. vue2组件封装+elementUI

    2024-06-08 09:22:03       9 阅读
  2. vue2 elementui 封装一个动态表单复杂组件

    2024-06-08 09:22:03       21 阅读
  3. vue2 elementui 封装一个动态表格复杂组件

    2024-06-08 09:22:03       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 09:22:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 09:22:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 09:22:03       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 09:22:03       20 阅读

热门阅读

  1. 深度解读ChatGPT基本原理

    2024-06-08 09:22:03       9 阅读
  2. 部件库(Widget Factory)

    2024-06-08 09:22:03       11 阅读
  3. 图像处理 -- 自适应色调映射(ATM)整理

    2024-06-08 09:22:03       9 阅读
  4. python项目中到底使用什么解释器更合适?

    2024-06-08 09:22:03       9 阅读
  5. python安装Django

    2024-06-08 09:22:03       8 阅读
  6. 设计模式-责任链模式

    2024-06-08 09:22:03       5 阅读
  7. react组件中的this

    2024-06-08 09:22:03       8 阅读
  8. 换热器设计参数的选用

    2024-06-08 09:22:03       7 阅读