在使用elementUI時,點擊table組件中的某個單元格,會彈出一個popover,並且popover中包含input輸入框,如果只是給input添加autofocus屬性是沒有效果的。當然這里也是分兩種情況。
第一:點擊table組件中的一個單元格,彈出一個popover。
HTML代碼:(equipment項目,orderList頁面)
1 <el-table-column 2 prop="assumption" 3 label="預設" 4 align="center" 5 v-if="orderInfo.assumptionShow"> 6 <template slot-scope="scopeAssumption"> 7 <el-popover 8 popper-class="edit-popover fixed-popover" 9 placement="bottom" 10 width="200" 11 v-model="scopeAssumption.row.assumptionFlag"> 12 <p>系統預設:<span>{{scopeAssumption.row.assumption}}</span></p> 13 <p>正確預設:</p> 14 <input 15 class="edictInput" 16 type="text" 17 v-model="editAssumption" 18 ref="focusAssumptionInput" 19 placeholder="請輸入內容" 20 autofocus="autofocus" 21 v-if="scopeAssumption.row.assumptionFlag"/> 22 <div class="edictBtn"> 23 <el-button 24 type="primary" 25 size="mini" 26 @click="getEditAssumption(scopeAssumption.row.matchUniqueId)">修改</el-button> 27 </div> 28 <el-button 29 slot="reference" 30 type="text" 31 size="small" 32 :disabled="!scopeAssumption.row.score || printFlag!==1" 33 @click="showAssumptiondsPopover(scopeAssumption.row.matchUniqueId)">[{{scopeAssumption.row.assumption}}]</el-button> 34 </el-popover> 35 </template> 36 </el-table-column>
js代碼
// 打開修改預設值的彈出框 showAssumptiondsPopover (matchUniqueId) { this.editAssumption = '' this.hoverData.map((item, index) => { this.$set(item, 'assumptionFlag', false) if (item.matchUniqueId === matchUniqueId) { this.$set(item, 'assumptionFlag', true) this.keyAssumptionFalg = true this.AssumptionIndex = index } }) this.$nextTick(() => { this.$refs.focusAssumptionInput.focus() })
說明:使用原生屬性autofocus 只在模板加載完成時起作用,也就是說只有第一次有用。而使用element UI的組件是通過v-show控制的,所以通過將input輸入框的顯示控制跟popover組件的顯示一致,就能解決了。當然,同時還需要通過Vue中的$nextTick方法,等元素渲染完成后執行該回調方法,這樣子focus才有效果。
這里生成的唯一popover方法暫時不講,下次再說。
第二:table中的單元格中有多個按鈕,遍歷生成popover。
HTML代碼:
<el-table-column label="投注項" width="300" align="center"> <template slot-scope="scope"> <span>{{scope.row.subPlayTypeWord}}</span> <el-popover popper-class="edit-popover fixed-popover" v-for="(item1, index1) in scope.row.betItemsObj" :key="index1" trigger="click" placement="bottom" width="200" v-model="item1.flag"> <p>系統賠率:<span>{{item1.odds}}</span></p> <p>正確賠率:</p> <input class="edictInput" autofocus="autofocus" type="text" v-model="editOdds" ref="focusOddsInput" placeholder="請輸入正確賠率"/> <div class="edictBtn"> <button :ref="scope.row.matchUniqueId" :data-idx="index1" :data-row="JSON.stringify(scope.row)" :data-odd="item1.odds" @click="getEditOdds(scope.row, index1, item1.odds)">修改</button> </div> <el-button slot="reference" type="text" size="small" @click="showOddsPopover(scope.row, item1.odds, index1)" :disabled="printFlag!==1">[{{item1.key}} ({{item1.odds}})]</el-button> </el-popover> </template> </el-table-column>
js代碼:
1 // 打開修改賠率的彈出框 2 showOddsPopover (rows, odds, editIndex) { 3 this.editOdds = '' 4 let len = 0 5 this.hoverData.map((item, index) => { 6 len += item.betItemsObj.length 7 item.betItemsObj.map((item1, index1) => { 8 this.$set(item1, 'flag', false) 9 // 展開對應賠率修改框 10 if (item.matchUniqueId === rows.matchUniqueId && (index1 === editIndex) && (item1.odds === odds)) { 11 this.$set(item1, 'flag', true) 12 this.keyOddFalg = true 13 this.oddIndex = index 14 this.oddIndexNum = index1 15 } 16 }) 17 }) 18 // 賠率輸入框獲取焦點 19 for (let i = 0; i < len; i++) { 20 this.$nextTick(() => { 21 this.$refs.focusOddsInput[i].focus() 22 }) 23 } 24 }