前言
專案背景:VUE + 基於elementUI 的 Transfer 元件.
實現功能
- 穿梭框 增加按鈕
- 穿梭框 編輯欄位
- 穿梭框 輸入框自動獲取焦點
- 穿梭框 回車確認修改內容
- 穿梭框 失焦提示未提交內容
1. 穿梭框增加按鈕
elementUI
的 Transfer
元件,UI是不分左右的。需求是隻有穿梭到右邊的欄位才有編輯的操作。找遍天也沒有看到有slot
,或者暴露區分左右的鉤子。大膽的說 【render-content
自定義資料項渲染函式】是不滿足的。
解決思路
利用穿梭框已穿梭欄位陣列
,在HTML元素寫一個v-if
。控制這個按鈕的隱藏與顯示。
<el-transfer
filterable
:titles="transferTitles"
:filter-method="filterMethod"
v-model="selectSourceFileArr"
:data="sourceFileData"
@change="handleChangeFileTransfer"
class="field-transfer"
>
<span
v-if="selectSourceFileArr.includes(option.key)" // 關鍵程式碼!!!!
class="el-icon-edit field-transfer__icon"
></span>
</el-transfer>
執行效果
2. 穿梭框編輯欄位
增加了按鈕只是一個開關,需求是點選小圖示可以修改欄位名稱。使用者可以輸入,那就是input
標籤。這個小圖示控制input
的顯示與隱藏
解決方案
小圖示繫結點選事件 @click.stop.prevent="rename(option)"
這裡一定要注意阻止冒泡噢,不然你可能永遠也觸發不了這個事件。v-show="option.showInput"
這個欄位後端是不會提供的,需要在介面資料回來自己forEach
加上去切記哦~~~
filterable
:titles="transferTitles"
:filter-method="filterMethod"
v-model="selectSourceFileArr"
:data="sourceFileData"
@change="handleChangeFileTransfer"
class="field-transfer"
>
<span>
<span v-show="!option.showInput"> {{ option.label }}</span>
<span v-show="option.showInput" class="field-transfer__input"> // 控制是否顯示input
<el-input v-model="option.label"></el-input>
<i class="el-icon-close" @click.stop.prevent="closeInput(option)"></i> // 取消修改內容
<i class="el-icon-check" @click.stop.prevent="checkInput(option)"></i>// 儲存修改內容
</span>
<span
v-if="selectSourceFileArr.includes(option.key)"
@click.stop.prevent="rename(option)" // 關鍵程式碼!!!!!!!!
class="el-icon-edit field-transfer__icon"
></span>
</span>
</el-transfer>
執行效果
3. 穿梭框 輸入框自動獲取焦點
需求是點選小圖示,顯示input,但是它的焦點是不在這個輸入框上面的。
解決方案
自動獲取焦點少不了focus()
,input
是迴圈渲染出來的,不可直接寫ref
,那就用賦值變數好啦~<el-input :ref='option.id'></el-input>
。上面點選小圖示不是有一個@click.stop.prevent="rename(option)"
直接寫在rename方法裡面就行。效果就不放了,親測有效!
//將輸入框自動獲取焦點
option 為入參
this.$nextTick(() => {
this.$refs[option.id].focus()
})
4. 回車確認修改內容
單獨把這個回車事件都拿出來寫,是不是有點?
input + vue
監聽回車事件@keyup.13/@keyup.enter
el-input + vue
監聽回車事件@keyup.13.native/@keyup.enter.native
5.穿梭框 失焦提示未提交內容
這個拿出寫,我承認是有點那啥了,但是我的穿梭框就是有這玩意。又回車又失焦又。。。
就一個@blur
打擾了,嗚嗚嗚嗚
芳妮醬總結
這幾個方法其實不僅僅用在穿梭框上,雖然挺簡單的,但有時候一時沒有想到也挺鬧心的。比如第一個如何在已有的穿梭框上多加一個小icon
,而且只有右邊有。一不留神el-input
上面寫@keyup.enter
沒有寫 .native
。都是一些非常細節的小問題,你看一遍下一回就留意了!