• element源码(五)radio 单选框组件


    系列文章目录

    第一章 element源码(一)简要介绍
    第二章 element源码(二)Layout 布局组件
    第三章 element源码(三)色彩、字体、边框与图标
    第四章 element源码(四)button按钮组件
    第五章 element源码(五)radio 单选框组件


    一、radio组件

    源码/packages/radio/src/radio.vue

    <template>
      <label class="el-radio">
        <span class="el-radio__input">
          <span class="el-radio__inner"></span>
          <input ref="radio"
          		 v-model="model"
                 class="el-radio__original"
                 type="radio">
        </span>
        <span class="el-radio__label"
              @keydown.stop>
          <slot></slot>
        </span>
      </label>
    </template>
    

    基本结构:label标签内含(1)input标签type="radio"和(2)slot插槽


    二、逻辑实现

    value / v-model 绑定值 string / number / boolean

    computed: {
        model: {
          get () {
            return this.isGroup ? this._radioGroup.value : this.value
          },
          set (val) {
            if (this.isGroup) {
              this.dispatch('ElRadioGroup', 'input', [val]);
            } else {
              this.$emit('input', val);
            }
            this.$refs.radio && (this.$refs.radio.checked = this.model === this.label);
          }
        },
      }
    

    value绑定值,用计算属性computed接收。基本上element组件中绑定值的处理都是这样完成的,在get中取值,然后在set通过$emit事件将结果传到父组件。
    在radio的具体案例中因为input上设置v-modle=“model”,选中radio时由于双向绑定计算机属性model会被赋值触发了set向外传递值,父组件可以通过@input取到值。

    isGroup () {
          let parent = this.$parent;
          while (parent) {
            if (parent.$options.componentName !== 'ElRadioGroup') {
              parent = parent.$parent;
            } else {
              this._radioGroup = parent;
              return true;
            }
          }
          return false;
        }
    

    get函数中this.isGroup ? this._radioGroup.value : this.value有radio-group时取radio-group上绑定的value,源码中的isGrop函数 在第二章layout布局组件中介绍el-row时解析过。看一下两者的区别。

     <template>
      <div>
        <!-- 有el-radio-group -->
        <el-radio-group v-model="radio">
          <el-radio :label="1">备选项</el-radio>
          <el-radio :label="2">备选项</el-radio>
          <el-radio :label="3">备选项</el-radio>
        </el-radio-group>
        
        <!-- 无el-radio-group -->
        <el-radio v-model="radio"
                  :label="1">备选项</el-radio>
        <el-radio v-model="radio"
                  :label="2">备选项</el-radio>
      </div>
    </template>
    

    使用区别不大,类似功能的组件进行编组更符合设计原则。再看一下选中的样式处理。

    <label class="el-radio"
             :class="[{ 'is-disabled': isDisabled },{'is-checked': model === label}]">
        <span class="el-radio__input"
              :class="{
            'is-disabled': isDisabled,
            'is-checked': model === label
          }">
    

    根据model===label(这个条件的逻辑很简单),绑定了两个is-checked类名。接下来就是用scss处理这两个类名的样式了(实际上只处理el-radio__input上的is-checked)

    @include b(radio) {
    	@include e(input) {
    		@include when(checked) {
    			.el-radio__inner {
    				border-color: $--radio-checked-input-border-color;
    				background: $--radio-checked-icon-color;
    
    				&::after {
    					transform: translate(-50%, -50%) scale(1);
    				}
    			}
    
    			&+.el-radio__label {
    				color: $--radio-checked-font-color;
    			}
    		}
    	}
    }
    //=> 编译成 编译过程的解析请看第二章
    .el-radio__input .is-checked .el-radio__inner{...}
    .el-radio__input .is-checked .el-radio__label{...}
    

    其中.el-radio__inner是前面的圆点,.el-radio__label是文字信息,然后定义了选中的颜色


    总结

    有部分属性如,size,border和样式相关的属性就不再解析了,前面几章基本上都涵盖了样式上的处理(主要是scss上的处理)。然后之后的组件只有在处理上比较特殊的才会拿出来讲了。

  • 相关阅读:
    谷粒商城 高级篇 (十三) --------- 异步&线程池
    (免费分享)基于springboot,vue高校就业管理平台
    【精通内核】Linux内核自旋锁实现原理与源码解析
    行泊一体迎爆发期,抢量产还是修技术护城河?
    回归和拟合有什么不同-(非)参数检验-假设检验
    可见性检测-unity掌握常见的可见性检测算法实现原理
    “益路同行”栏目人物专访 第0010期——中国公益万里行发起人李现
    动手学深度学习_目标检测算法 R-CNN 系列
    ATFX汇市:8月名义与核心CPI走势分化,美国通胀率算升高还是降低?
    JAVA宠物医院管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  • 原文地址:https://blog.csdn.net/weixin_47169270/article/details/127092555