自定义组件库

实例内容
封装常见的功能组件(Button,Modal,Form相关),封装完成后封装成UI组件库发布到NPM上。

涉及知识点
        vue基础语法
        组件基本语法
        字键通讯(sync,provide,inject)
        插槽使用
        prop校验
       过渡与动画处理
       计算属性与监听属性
       v-model语法糖
       vue插件机制
       npm发布


实例目的
       掌握组件封装的语法和技巧
       学会造轮子,了解组件库实现原理
       搭建和积累自己的组件库


学习前提
       有一定vue基础,懂vue语法
       熟悉ES6的一些常见语法
       对vue感兴趣
 

一、使用vue脚手架初始化一个项目

使用vue created one-ui,创建一个名为one-ui的项目。

按照自己的习惯设置脚手架风格,这里不多做介绍。

脚手架搭建完毕后,将App.vue文件下的自带内容清理一下,为后续开发做准备。

二、如何封装,注册和使用一个组件

在componet下创建一个button.vue的文件,放置button组件代码。创建一个组建的button组件,,并且指定name为lyfButton。

<template>
  <button class="lyf-button">
   按钮组件
  </button>
</template>
 
<script>
export default {
  name: 'lyfButton'
}
</script>
 
<style lang="scss">
 
</style>

创建组件完成后,不能在项目中直接使用,需要到main.js中注册才可以使用。

import Vue from 'vue'
import App from './App.vue'
// 第一步:导入button组件
import OneButton from './components/button.vue'
 
Vue.config.productionTip = false
 
// 第二步:注册组件,设置(组件名,组件)
Vue.component(OneButton.name, OneButton)
 
new Vue({
  render: h => h(App)
}).$mount('#app')

注册完成后,组件就可以在项目中使用了。

<template>
  <div>
    <lyf-button></lyf-button>
  </div>
</template>

三、封装一个element-ui风格的按钮

需要使用到的知识:

  1. 组件通讯
  2. 组件插槽
  3. props校验

参数支持:

 

参数名参数描述参数类型默认值
type按钮类型(primary/success/warning/danger/info)stringdefault
plain是否是朴素按钮booleanfalse
round是否是圆角按钮booleanfalse
circle是否是圆形按钮booleanfalse
disabled是否禁用按钮booleanfalse
icon图标类名string
暂无        暂无

使用插槽

简单来说,凡是希望组件中内容可以灵活设置的地方,都需要用到slot插槽来自定义内容。

使用slot来定义按钮上的文本内容:

<template>
  <button class="lyf-button">
   <span><slot></slot></span>
  </button>
</template>

在使用时就可以直接输入文本,定义按钮文本内容了:

<template>
  <div>
    <lyf-button>登录</lyf-button>
    <lyf-button>删除</lyf-button>
    <lyf-button>取消</lyf-button>
  </div>
</template>

button组件基础样式:

<style lang="scss">
  .lyf-button{
    display: inline-block;
    line-height: 1;
    white-space: nowrap;
    cursor: pointer;
    background: #ffffff;
    border: 1px solid #dcdfe6;
    color: #606266;
    -webkit-appearance: none;
    text-align: center;
    box-sizing: border-box;
    outline: none;
    margin: 0;
    transition: 0.1s;
    font-weight: 500;
    //禁止元素的文字被选中
    -moz-user-select: none;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    padding: 12px 20px;
    font-size: 14px;
    border-radius: 4px;
    &:hover,
    &:hover{
      color: #409eff;
      border-color: #c6e2ff;
      background-color: #ecf5ff;
    }
  }
</style>

3.1button组件的type属性

让按钮支持type属性,使得按钮支持不同样式:

第一步:父组件组件传递type属性

<template>
  <div id="app">
    <div class="row">
    <lyf-button>按钮</lyf-button>
    <lyf-button type="primary">primary按钮</lyf-button>
    <lyf-button type="success">success按钮</lyf-button>
    <lyf-button type="info">info按钮</lyf-button>
    <lyf-button type="danger">danger按钮</lyf-button>
    <lyf-button type="warning">warning按钮</lyf-button>
    </div>
  </div>
</template>

第二步:子组件接收负组件传递的数据

export default {
  name: 'oneButton',
  // 此时对props进行校验,值接收string类型的type值
  props: {
    type:{
      type: String,
      // 设置默认值:如果不传值,那么使用default
      default: 'default'
    }
  },
  created () {
    console.log(this.type)//defalut primary success info danger warning
  }
}

第三步:通过绑定类名的方法动态控制样式

<template>
  <button class="one-button" :class="`one-button-${type}`">
   <span><slot></slot></span>
  </button>
</template>

第四步:设置不同类型的样式

.lyf-button-primary{
  color:#fff;
  background-color: #409eff;
  border-color: #409eff;
  &:hover,
  &:focus{
    background: #66b1ff;
    background-color: #66b1ff;
    color: #fff;
    }
  }
  .lyf-button-success{
  color:#fff;
  background-color: #67c23a;
  border-color: #67c23a;
  &:hover,
  &:focus{
    background: #85ce61;
    background-color: #85ce61;
    color: #fff;
    }
  }
  .lyf-button-info{
  color:#fff;
  background-color: #909399;
  border-color: #909399;
  &:hover,
  &:focus{
    background: #a6a9ad;
    background-color: #a6a9ad;
    color: #fff;
    }
  }
  .lyf-button-warning{
  color:#fff;
  background-color: #e6a23c;
  border-color: #e6a23c;
  &:hover,
  &:focus{
    background: #ebb563;
    background-color: #ebb563;
    color: #fff;
    }
  }
  .one-button-danger{
  color:#fff;
  background-color: #f56c6c;
  border-color: #f56c6c;
  &:hover,
  &:focus{
    background: #f78989;
    background-color: #f78989;
    color: #fff;
    }
  }

第五步:至此就完成了对于按钮样式的设置

 

3.2button组件的plain属性

和type类型相同,我们只要将样式先设置好,然后通过父组件传递过来的值进行判断,就可以设置plain属性了。

第一步:父组件组件传递plain值

<template>
  <div id="app">
    <div class="row">
    <lyf-button plain>按钮</lyf-button>
    <lyf-button plain type="primary">primary按钮</lyf-button>
    <lyf-button plain type="success">success按钮</lyf-button>
    <lyf-button plain type="info">info按钮</lyf-button>
    <lyf-button plain type="danger">danger按钮</lyf-button>
    <lyf-button plain type="warning">warning按钮</lyf-button>
    </div>
  </div>
</template>

第二步:子组件接收负组件传递的数据,同样进行props校验,并且设置默认值为false

  props: {
    plain: {
      type: Boolean,
      default: false
    }
  }

第三步:通过绑定类名的方法动态控制样式,由于plain类型是布尔值,所以在类型中我们使用对象的形式来控制样式

<template>
  <button class="one-button" :class="[`one-button-${type}`,{
    'is-plain':plain
  }]">
   <span><slot></slot></span>
  </button>
</template>

第四步:设置不同类型的样式,由于plain类型是以对象的形式在类中定义的,所以使用获取属性的方法定义样式

// 朴素按钮样式
.lyf-button.is-plain{
  &:hover,
  &:focus{
    background: #fff;
    border-color: #489eff;
    color: #409eff;
  }
}
.lyf-button-primary.is-plain{
  color: #409eff;
  background: #ecf5ff;
  &:hover,
  &:focus{
    background: #409eff;
    border-color: #409eff;
    color: #fff;
  }
}
.lyf-button-success.is-plain{
  color: #67c23a;
  background: #c2e7b0;
  &:hover,
  &:focus{
    background: #67c23a;
    border-color: #67c23a;
    color: #fff;
  }
}
.lyf-button-info.is-plain{
  color: #909399;
  background: #d3d4d6;
  &:hover,
  &:focus{
    background: #909399;
    border-color: #909399;
    color: #fff;
  }
}
.lyf-button-warning.is-plain{
  color: #e6a23c;
  background: #f5dab1;
  &:hover,
  &:focus{
    background: #e6a23c;
    border-color: #e6a23c;
    color: #fff;
  }
}
.lyf-button-danger.is-plain{
  color: #f56c6c;
  background: #fbc4c4;
  &:hover,
  &:focus{
    background: #f56c6c;
    border-color: #f56c6c;
    color: #fff;
  }
}

第五步:至此就完成了对于按钮样式的设置。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值