IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Elementui- Button 源码解析「开始造轮子啦~」 -> 正文阅读

[JavaScript知识库]Elementui- Button 源码解析「开始造轮子啦~」

Button部分源码包含了三个大的方面。

第一个是DOM结构

DOM结构:

<template>
<!-- 1.按钮样式 -->
<!-- 2.点击事件 -->
<!-- 3.当主动禁用或者loading的时候,都会触发按钮的disabled -->
<!-- 是一个整体,整个括号括起来,还得紧紧的挨着等号 -->
<!-- 4.是否默认聚焦 -->
<!-- 5.Button 原始类型 -->
<!-- class -->
<!-- 最开始的是类名 -->
<!-- 后面的那个是属性 -->
<!-- 
    class里面最先是类型,然后是能否禁用
    然后是风格和形状
 -->
<button
class="el-button"
@click="handleClick"
:disabled="buttonDisabled || loading"
:autofocus="autofocus"
:type="nativeType"
:class="[
    type ? 'el-button--' + type : '',
    buttonSize ? 'el-button--' + buttonSize : '',
    {
        'is-disabled': buttonDisabled,
        'is-loading': loading,
        'is-plain': plain,
        'is-round': round,
        'is-circle': circle
    }
]"
>
<!-- 动画 -->
<!-- 在loading,就出现这个表情 -->
    <i class="el-icon-loading" v-if="loading"></i>
<!-- icon -->
<!-- icon存在,并且loading不存在 -->
    <i class="icon" v-if="icon && ! loading"></i>
    <!-- 插槽 -->
    <span v-if="$slot.default"><slot></slot></span>
  </button>
</template>

里面有较为清晰的注释。

在这里再写一遍

?class="el-button" ?????? ?->?按钮样式

@click="handleClick"? ?-> 点击事件

:disabled="buttonDisabled || loading" ->?当主动禁用或者loading的时候,都会触发按钮的disabled

:autofocus="autofocus" ? ? ? ?-> ?是否默认聚焦

:type="nativeType" ? ? ? ? ? ? ? ? ->?Button 原始类型

type ? 'el-button--' + type : '', ? ? ? ? ->?????????控制颜色

buttonSize ? 'el-button--' + buttonSize : '', ? ? ? ?->?buttonSize函数控制按钮的大小

? ? ? ? // 禁用
? ? ? ?
'is-disabled': buttonDisabled,
? ? ? ? // 加载
? ? ? ?
'is-loading': loading,
? ? ? ? // 用于控制其风格
? ? ? ?
'is-plain': plain,
? ? ? ? // 用于控制其形状
? ? ?
? 'is-round': round,
? ? ? ? // 用于控制其形状
? ? ?
? 'is-circle': circle

? ? // 承载加载动画的标签
? ?
<i class="el-icon-loading" v-if="loading"></i>
? ? // 承载加载icon的标签
? ?
<i :class="icon" v-if="icon && !loading"></i>
? ? // 不具名插槽
? ?
<span v-if="$slots.default"><slot></slot></span>

第二个是属性注册

    props: {
      type: {
        type: String,
        default: 'default'
      },
      size: String,
      icon: {
        type: String,
        default: ''
      },
      nativeType: {
        type: String,
        default: 'button'
      },
      loading: Boolean,
      disabled: Boolean,
      plain: Boolean,
      autofocus: Boolean,
      round: Boolean,
      circle: Boolean
    },

第三个是方法&计算属性

    computed: {
      _elFormItemSize() {
        return (this.elFormItem || {}).elFormItemSize;
      },
      buttonSize() {
        return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
      },
      buttonDisabled() {
        return this.$options.propsData.hasOwnProperty('disabled') ? this.disabled : (this.elForm || {}).disabled;
      }
    },

    methods: {
      // 点击事件
      handleClick(evt) {
        // 上传到了click这个事件,evt则是传的值
        this.$emit('click', evt);
      }
    }

注意:

还有inject!:

    inject: {
      elForm: {
        default: ''
      },
      elFormItem: {
        default: ''
      }
    },

inject

成对出现:provide和inject是成对出现的

使用方法:provide在父组件中返回要传给下级的数据

inject在需要使用这个数据的子辈组件或者孙辈等下级组件中注入数据。

使用场景:由于vue有$parent属性可以让子组件访问父组件。

但孙组件想要访问祖先组件就比较困难。

通过provide/inject可以轻松实现跨级访问父组件的数据

源码是这样的:

<template>
<button
class="el-button"
@click="handleClick"
:disabled="buttonDisabled || loading"
:autofocus="autofocus"
:type="nativeType"
:class="[
    type ? 'el-button--' + type : '',
    buttonSize ? 'el-button--' + buttonSize : '',
    {
        'is-disabled': buttonDisabled,
        'is-loading': loading,
        'is-plain': plain,
        'is-round': round,
        'is-circle': circle
    }
]"
>
<!-- 动画 -->
<!-- 在loading,就出现这个表情 -->
    <i class="el-icon-loading" v-if="loading"></i>
<!-- icon -->
<!-- icon存在,并且loading不存在 -->
    <i class="icon" v-if="icon && ! loading"></i>
    <!-- 插槽 -->
    <span v-if="$slot.default"><slot></slot></span>
  </button>
</template>

<script>
export default {
    name:'ElButton',
    inject: {
        elForm:{
            default:"",
        },
        elFormItem:{
            default:"",
        }
    },
    // 注册一箩筐属性
    props:{
        type:{
            type:String,
            default:"default"
        },
        size:String,
        icon:{
            type:String,
            default:""
        },
        nativeType:{
            type:String,
            default:"button"
        },
        loading: Boolean,
        disabled: Boolean,
        plain: Boolean,
        autofocus: Boolean,
        round: Boolean,
        circle: Boolean
    },
    methods:{
        handleClick(evt){
            // emit前面是属性名
            // click
            // evt是传入的参数
            this.$emit('click',evt);
        }
    },
    computed:{
        buttonDisabled() {
            return this.$options.propsData.hasOwnProperty('disabled') ? this.disabled : (this.elForm || {}).disabled;
        },
        _elFormItemSize() {
            // elFormItemSize 应该是本身的一个属性
            return (this.elFormItem || {}).elFormItemSize;
        },
        buttonSize() {
            return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
        }
    }
}
</script>

<style>

</style>

参考博客

Element-UI 源码简析——Button篇 - 掘金

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 18:03:56  更:2022-05-24 18:05:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:39:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码