亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

基于element-ui組件手動實現單選和上傳功能

2019-11-19 12:24:01
字體:
來源:轉載
供稿:網友

前言

在用戶使用過程中提出一鍵導入的功能,需求如下:點擊導入按鈕顯示提示框,然后是單選框以及上傳按鈕。pc端常使用element-ui組件,但是這個項目是vue1的老項目,并且沒有element-ui組件。所以需要自己動手實現單選功能和上傳功能。

 

radio 屬性及方法

name: 用于定義同一類型的 radio 同一 name 的 radio 只能選中一個(單選實現)

  • id: 用于和 label 標簽關聯起來 實現點擊 label 標簽內的元素也能選中 radio
  • value:單選按鈕的值,選中某個單選按鈕相當于拿到 value 值 tip:用于識別組中的哪個單選按鈕被選中。
  • checked 用于設置默認選中的 radio
  • v-model 創建雙向數據綁定。 會忽略所有表單元素的 value、checked、selected 特性的初始值而總是將 Vue 實例的數據作為數據來源。
// html <div v-for="day in weekSelectList" :key="day.id" class="select__day"> <input type="radio"  name="week"  :id="day.label"  :value="day.value"  v-model="selectedDay"> <label :for="day.label">{{day.label}}({{day.value}})</label> </div>// 暫定的數據data(){ return { weekSelectList: [  { label: '周一', value: '2018-12', id: 1 },  { label: '周二', value: '2018-13', id: 2 },  { label: '周三', value: '2018-14', id: 3 },  { label: '周四', value: '2018-15', id: 4 },  { label: '周五', value: '2018-16', id: 5 } ] }, selectedDay: '2018-12',}

通過 v-model 綁定 selectedDay,匹配到相同的值會將該 radio 選中,當改變 radio 的選擇,selectedDay 也會動態的變更成選中的 radio 的 value

上傳文件

屬性

accept 屬性接受一個(多個值時)逗號分隔的字符串 如:accept="image/png, image/jpeg"

  • id
  • name
  • 注意:accept 屬性并不會驗證選中文件的類型只是在用戶瀏覽時只顯示指定文件類型

缺點

  1. 在未上傳文件時,顯示"未選擇文件",用戶界面不友好,不可配置
  2. 同一個文件名即使內容改變了,重新上傳也不會觸發 change 事件
  3. 用戶如果在上傳過程中點擊了“取消”,已經上傳的文件會被移除

解決方式

 

 <div class="upload__button" :class="{'upload__button--uploaded':isUploaded}" @click="onUploadClick">點擊上傳</div> <input type="file" class="upload__file" v-el:upload accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" @change="onFileChange" />methods:{ onUploadClick() { if (!this.isUploaded) {  this.$els.upload.click() } }, onFileChange(e) { const file = e.target.files[0] if (file === undefined) { return } this.fileName = file.name const result = /[xls|xlsx]$/.test(this.fileName) if (result) {  this.isUploaded = true  this.showAlert('上傳成功')  this.$els.upload.value = null } else {  this.showAlert('文件格式錯誤,請確認后重試。') } },}

當點擊上傳按鈕觸發 onUploadClick 事件后,獲取到 upload 綁定的 DOM (由于是老的項目使用的是$els,vue2 使用 ref)手動觸發 click 事件并且可以在change事件中默認接收一個文件信息對象其中target.files[0]包含文件的更多信息,如下圖:

 

判斷文件類型

可以看到 change 事件的返回值包含著文件屬性,這里我們需要判斷是文件名是否為 excel,使用正則的 test 方法。

重置change事件

在最后 this.$refs.uploadFile.value = null; 移除文件,可以保證上傳同樣的文件時,也會觸發 change 事件

優化樣式

至此關于表單方面的功能都已經實現了,由于原始的radio樣式比較丑,而且不能更改。下面我們就想辦法將它做的漂亮些。

// template <label v-for="(item,index) in radioList"  :key="item.value"  :for="item.linkLabel"  :accesskey="index">  <span class="content__input">   <span class="radio__replace"   :class="{'radio__replace--checked':selectedRadio===item.value,'radio__replace--disable':item.isDisabled}">   </span>   <input v-model="selectedRadio"   type="radio"   class="radio__button"   name="radio"   :id="item.linkLabel"   :tabindex="index"   :value="item.value"   :disabled="item.isDisabled"   @focus="item.isFocus = true"   @blur="item.isFocus = false" />  </span>  <span class="content__text">{{item.label}}</span>  </label>// data data() { return {  radioList: [  {   linkLabel: 'label1',   value: '1',   isDisabled: false,   isFocus: false,   label: '標簽1'  },  {   linkLabel: 'label2',   value: '2',   isDisabled: false,   isFocus: false,   label: '標簽2'  },  {   linkLabel: 'label3',   value: '3',   isDisabled: true,   isFocus: false,   label: '標簽3'  }  ],  selectedRadio: '1' }
  • 這里使用遍歷的方式在data中定義多個radio,在前面我們講到過radio的基本用法,使用label的for屬性和input的for屬性實現關聯起來。(這里我將input放在label內,這樣點擊整個label都會選中,沒有label和radio元素之間的間隙)。
  • name相同的radio會實現單選效果,tabindex代表使用"Tab"鍵的遍歷順序 ,value是選中時v-model綁定的selectedRadio也就會跟著變更
  • 實現個性化樣式的關鍵在于結構就是用一個類名content__input標簽將類名radio__replace和radio包起來。設置定位層級(相當于radio被覆蓋了,然而只要點擊到labelradio就會被選中)
  • 通過selectedRadio選中的值和當前radio值做對比,以及isDisabled這些Boolean值來動態綁定class實現我們自定義的radio樣式切換

效果如下:

 

其實radio__replace類名對應的標簽就是我們自定義的radio,其中的白色原點是通過偽類生成的css代碼放在最后,感興趣可以看下

偽類樣式修改

如果想通過類名來改變白色原點的樣式,可以通過權重來改變。如下通過isShow來給外層添加test類名 而起始的時候設置的權重為兩層,之后添加一層可以起到修改樣式的效果。(ps:偽類不能通過預先設定好的類名來修改樣式)

例子代碼如下:

<div :class="{test:isShow}"  @click="onRedClick">  <div class="text__item"></div> </div>.text__item { &:after { content: ''; width: 30px; height: 30px; background-color: #f00; position: absolute; bottom: 20px; }}.test { .text__item { &:after {  background-color: #ff0; } }}// css .radio {  &__replace {   border: 1px solid #dcdfe6;   border-radius: 100%;   width: 14px;   height: 14px;   background-color: #fff;   position: relative;   cursor: pointer;   display: inline-block;   box-sizing: border-box;   z-index: 999;   transition: 0.15s ease-in;   &--checked {   border-color: #409eff;   background-color: #409eff;   }   &--disable {   cursor: not-allowed;   }   &:after {   width: 4px;   height: 4px;   border-radius: 100%;   background-color: #fff;   content: '';   position: absolute;   left: 50%;   top: 50%;   transform: translate(-50%, -50%);   }  }  &__button {   opacity: 0;   outline: none;   position: absolute;   z-index: -1;   top: 0;   left: 0;   right: 0;   bottom: 0;   margin: 0;  }  }

總結

  1. 介紹了radio基本屬性,使用案例并優化了radio的樣式
  2. 原始上傳文件元素的缺點以及改善方法

以上所述是小編給大家介紹的基于element-ui組件手動實現單選和上傳功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av三级在线观看| 亚洲老头同性xxxxx| 国产小视频91| 久久精品久久久久久国产 免费| 欧美日韩国产成人高清视频| 成人乱人伦精品视频在线观看| 中文字幕亚洲综合久久| 亚洲国产成人av在线| 日韩亚洲精品电影| 欧美激情视频在线免费观看 欧美视频免费一| 色婷婷av一区二区三区在线观看| 亚洲一区亚洲二区亚洲三区| 成人免费午夜电影| 欧美美女操人视频| 久久福利网址导航| 成人国产精品久久久| 日韩电影免费观看中文字幕| 最新中文字幕亚洲| 91久久在线观看| 久99久在线视频| 久久精品电影一区二区| 久久亚洲成人精品| 亚洲大胆人体视频| 日韩av第一页| 欧美视频一二三| 久久综合色88| 国产成人福利网站| 亚洲自拍在线观看| 欧美激情a∨在线视频播放| 在线观看亚洲视频| 久久免费国产精品1| 亚洲护士老师的毛茸茸最新章节| 神马久久桃色视频| 国产精品视频最多的网站| 亚洲图片欧美午夜| 国产成人免费av| 国产一区玩具在线观看| 在线观看日韩专区| 亚洲日本欧美日韩高观看| 57pao成人永久免费视频| 日韩av免费网站| 国产亚洲欧洲高清| 欧美日韩午夜激情| 亚洲天堂av在线播放| 国产精品中文字幕在线观看| 亚洲欧洲偷拍精品| 88国产精品欧美一区二区三区| 亚洲欧美日韩爽爽影院| 日产精品99久久久久久| 亚洲精品网站在线播放gif| 全球成人中文在线| 日韩欧美中文字幕在线观看| 国产精品美乳在线观看| 国产精品jizz在线观看麻豆| 国产成人精品综合久久久| 亚洲国产毛片完整版| 中文字幕视频一区二区在线有码| 精品高清美女精品国产区| 亚洲精品久久在线| 国产一区二中文字幕在线看| 国产日韩精品在线播放| 国产欧美亚洲精品| 日本精品一区二区三区在线| 国内久久久精品| 日韩欧美主播在线| 中文字幕最新精品| 国产午夜精品免费一区二区三区| 欧美午夜精品久久久久久浪潮| 黄色一区二区三区| 91亚洲精品久久久| 在线精品国产成人综合| 中文字幕亚洲色图| 欧美日韩在线第一页| 538国产精品一区二区免费视频| 亚洲欧美另类自拍| 久久国产加勒比精品无码| 国产精品白嫩美女在线观看| 国产自摸综合网| 亚洲国产欧美在线成人app| 精品亚洲男同gayvideo网站| 精品久久久久久久久久ntr影视| 精品国产成人av| 欧美日本在线视频中文字字幕| 亚洲欧美成人精品| 国产一区二区三区在线看| 欧美国产日韩免费| 少妇高潮 亚洲精品| 欧美色视频日本高清在线观看| 日韩成人av网址| 欧美美女操人视频| 欧美在线性爱视频| 欧美日韩亚洲精品一区二区三区| 亚洲欧美制服综合另类| 岛国av一区二区在线在线观看| 日韩在线视频二区| 中文字幕一区二区三区电影| 国产精品丝袜白浆摸在线| 久久中文字幕在线| 欧美不卡视频一区发布| 国产亚洲精品激情久久| 久久综合伊人77777蜜臀| 亚洲人成电影网站色| 欧美激情高清视频| 日韩精品电影网| 啪一啪鲁一鲁2019在线视频| 国产区亚洲区欧美区| 九色精品美女在线| 国产精品99蜜臀久久不卡二区| 国产精品美女免费| 亚洲成人av在线播放| 高清在线视频日韩欧美| 国产精品久久久久久久久久久久久| 欧美日韩一区二区三区在线免费观看| 日韩国产高清污视频在线观看| 国产精品高清在线观看| 日本精品一区二区三区在线| yellow中文字幕久久| 色综合色综合网色综合| 亚洲美腿欧美激情另类| 精品久久久久国产| 中文字幕久久久| 精品激情国产视频| 亚洲成av人影院在线观看| 亚洲精品中文字幕女同| 91精品国产自产91精品| 国产香蕉一区二区三区在线视频| 久久伊人精品天天| 伊人久久大香线蕉av一区二区| 国产精品1区2区在线观看| 久久国产色av| 成人动漫网站在线观看| 国语自产精品视频在线看抢先版图片| 国内精品在线一区| 亚洲丝袜av一区| 欧美成人精品不卡视频在线观看| 成人国产精品久久久久久亚洲| 久久久亚洲福利精品午夜| 日韩中文字幕在线视频| 韩国视频理论视频久久| 欧美大片va欧美在线播放| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品尤物福利片在线观看| 欧美老女人bb| 日韩中文字幕不卡视频| 最近的2019中文字幕免费一页| 2019av中文字幕| 日韩天堂在线视频| 欧美视频免费在线观看| 午夜精品一区二区三区在线视| 国产精品扒开腿做爽爽爽男男| 亚洲人成欧美中文字幕| 欧美午夜精品伦理| 久久久噜久噜久久综合| 日韩在线观看免费高清| 久久中文字幕在线视频| 日韩hd视频在线观看| 日韩精品极品在线观看| 欧美日韩国产限制| 国产精品久久久久久久久久ktv| 久久久久久综合网天天| 色中色综合影院手机版在线观看| 欧美福利视频在线观看| 成人免费大片黄在线播放| 久久这里只有精品视频首页|