Element-UI radio、radio-group、radio-button 單選框原始碼
Element-UI radio 單選框原始碼
radio
模板部分:
<template>
<label
//label 元素不會向使用者呈現任何特殊效果。不過,它為滑鼠使用者改進了可用性。如果您在 label 元素內點選文字,就會觸發此控制元件。就是說,當使用者選擇該標籤時,瀏覽器就會自動將焦點轉到和標籤相關的表單控制元件上。
class="el-radio"
:class="[
border && radioSize ? 'el-radio--' + radioSize : '', //border 與 radioSize 同時存在則有該樣式
{ 'is-disabled': isDisabled }, //是否禁用
{ 'is-focus': focus }, //是否選中
{ 'is-bordered': border }, //是否有邊框
{ 'is-checked': model === label } // model計算屬性見下面 script
]"
role="radio" // role aria-checked aria-disabled 用於螢幕閱讀器的,幫助殘障人士更好的訪問網站
:aria-checked="model === label"
:aria-disabled="isDisabled"
:tabindex="tabIndex" // 設定是否可以通過鍵盤上的 tab鍵 進行選擇, -1 代表不可選, 0 代表可選
@keydown.space.stop.prevent="model = isDisabled ? model : label"
// keydown.space 空格 .stop 停止冒泡 .prevent 阻止預設行為 .stop.prevent 串聯修飾符
>
<span class="el-radio__input"
:class="{
'is-disabled': isDisabled,
'is-checked': model === label
}"
>
<span class="el-radio__inner"></span> // 採用 css 偽類實現選中效果,代替 input
<input
ref="radio"
class="el-radio__original" //設定了 opacity: 0 對其隱藏
:value="label"
type="radio"
aria-hidden="true"
v-model="model"
@focus="focus = true"
@blur="focus = false"
@change="handleChange"
:name="name"
:disabled="isDisabled"
tabindex="-1"
>
</span>
<span class="el-radio__label" @keydown.stop>
<slot></slot>
// 要是沒有插槽內容則顯示 label
<template v-if="!$slots.default">{{label}}</template>
</span>
</label>
</template>
問題一:為啥不用原生 input 而是自己模擬
1、原生標籤
radio
不同瀏覽器樣式不同,所以自己寫來代替2、需要用到原生的
radio
來獲取焦點來觸發change
事件,所以element
是 採用了 絕對定位脫離文件流,以及設定透明度為0,而不是採用dispaly:none
或者visibility:hidden
radio
script 部分:
export default {
name: 'ElRadio', // name 三個好處 見其他原始碼文章
mixins: [Emitter], // mixins 下文單獨拎出來與之相關部分 也就是 自己實現 dispatch
inject: { //與 Form 表單相關
elForm: {
default: ''
},
elFormItem: {
default: ''
}
},
componentName: 'ElRadio', //用於當前 Vue 例項的初始化選項。需要在選項中包含自定義 property 時會有用處:
/* 比如:
new Vue({
customOption: 'foo',
created: function () {
console.log(this.$options.customOption) // => 'foo'
}
})
*/
props: { // 屬性傳值
value: {},
label: {},
disabled: Boolean,
name: String,
border: Boolean,
size: String
},
data() {
return {
focus: false
};
},
computed: {
isGroup() { // 是否為 radio-group 元件例項 ,是則為 true , 否則為 false
let parent = this.$parent;
// 向上迴圈找它爸爸,一直找到為止 也就是 下面的 parent.$options.componentName === 'ElRadioGroup' 的時候
while (parent) {
if (parent.$options.componentName !== 'ElRadioGroup') {
parent = parent.$parent;
} else {
this._radioGroup = parent; // 父例項,如果當前例項有的話
return true;
}
}
return false;
},
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);
}
},
_elFormItemSize() {
return (this.elFormItem || {}).elFormItemSize;
},
radioSize() {
const temRadioSize = this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
return this.isGroup
? this._radioGroup.radioGroupSize || temRadioSize
: temRadioSize;
},
isDisabled() {
return this.isGroup
? this._radioGroup.disabled || this.disabled || (this.elForm || {}).disabled
: this.disabled || (this.elForm || {}).disabled;
},
tabIndex() {
return (this.isDisabled || (this.isGroup && this.model !== this.label)) ? -1 : 0;
}
},
methods: {
handleChange() {
this.$nextTick(() => {
this.$emit('change', this.model);
this.isGroup && this.dispatch('ElRadioGroup', 'handleChange', this.model);
});
}
}
};
相關文章
- Element原始碼分析系列4-Radio(單選框)原始碼
- 常用操作單選框radio程式碼整理
- 短視訊原始碼,uniapp中單選框radio的實現原始碼APP
- 學習筆記(十四):ArkUi-單選框 (Radio)筆記UI
- elementUI radio修改單選框多選框選中樣式及自定義其他樣式。UI
- CSS3 checkbox核取方塊和radio單選框美化效果CSSS3
- 手寫(radio)element-ui元件UI元件
- radio 單選按鈕 選中多個
- HTML input radio單選按鈕HTML
- HTML input radio 單選按鈕HTML
- 多選單選混合 element-uiUI
- Selenium4自動化測試7--控制元件獲取資料--radio單選框、select下拉框選擇、iframe控制元件
- 設定radio單選按鈕預設選中
- JavaScript獲取選中radio單選按鈕值JavaScript
- element-ui表單原始碼解析之el-inputUI原始碼
- element-ui表單原始碼解析之el-formUI原始碼ORM
- CSS3 美化radio單選按鈕CSSS3
- 網頁設計實現核取方塊(checkbox)和單選框(radio)對齊的方法網頁
- Element-ui之導航選單UI
- element-ui表單原始碼解析之el-form-itemUI原始碼ORM
- 手機直播原始碼,Android 簡單的彈框原始碼Android
- Element原始碼分析系列7-Select(下拉選擇框)原始碼
- element-ui的日期選擇框底部清空按鈕點選不關閉日期選擇框的實現辦法UI
- 直播軟體原始碼,選項提供多選專案,彈出多選框原始碼
- Element(React)原始碼分析系列4--Radio元件React原始碼元件
- radio 預設選中
- 表單驗證:判斷所有radio組都已選中
- Element-ui el-scrollbar 原始碼解析UI原始碼
- 短視訊系統原始碼,點選選擇框,底部彈出可以選擇的選項原始碼
- 下拉選單框和滾動條
- JavaScript帶下拉選單的文字框JavaScript
- element-ui - 原始碼學習 - 自定義事件UI原始碼事件
- Element-Ui元件(四十)Popover 彈出框UI元件
- app直播原始碼,選取矩形框並進行文字標註APP原始碼
- js練習----radio name屬性定義單選按鈕組JS
- layui前端選單構建-批量刪除-彈框填寫-樹狀選單-樹狀下拉框選擇treeSelectUI前端
- jquery操作radio取值以及選中jQuery
- element-ui原始碼之元件通訊那些事UI原始碼元件