關於vue中輸入框的使用場景總結

輸入框的使用場景總結

1. 自動聚焦

第1種方法:使用 $nextTick

<input ref="myInput" v-model="text"/>
mounted() {
  this.$nextTick(function () {
    this.$refs.myInput.focus();
  });
},

第2種方法:自定義 v-focus 指令

為瞭方便,這裡用到瞭 jquery

Vue.directive('focus', {
  inserted(el) {
    // 兼容 Element 基於原生 input 封裝的輸入框組件
    let innerInput = el.querySelector('input');
    if (innerInput) {
      innerInput.focus();
    // 兼容原生 input
    } else {
      el.focus();
    }
  },
});

如果你有一個按鈕可以控制輸入框的顯示和隱藏,需要每次顯示的時候都自動聚焦,那要 v-if 而不能使用 v-show,因為隻有 v-if 才能觸發自定義指令的 inserted 生命周期函數。

<input v-if="visible" v-focus v-model="text"/>

2. 如何優雅的實現下面效果

效果描述:我們在開發表格的時候經常會遇到一個輸入框,輸入框聚焦的時候會顯示輸入框後面的“保存”按鈕,失焦的時候後面的“保存”按鈕隱藏。點擊保存,保存輸入框裡面的內容。輸入框失焦的時候(點擊保存按鈕保存成功除外),輸入框裡面的內容要顯示原先的內容。  

這裡實現的時候會遇到一些比較惡心的地方,比如說,點擊保存按鈕,輸入框失焦瞭,保存按鈕先隱藏瞭,就不會觸發按鈕上綁定的點擊事件,等等。話不多說,直接上代碼,看怎麼優雅的去實現它。

代碼實現: 

<template>
  <div>
    <el-table
      :data="tableData"
      border
    >
      <el-table-column
        label="商傢編碼"
        width="200"
      >
        <template slot-scope="{row, $index}">
          <input
            style="width: 100px;"
            v-model="row.skuOuterId"
            @focus="toggleFocus($event, $index, row, true)"
            @blur="toggleFocus($event, $index, row, false)"
          />
          <el-button
            :class="`J_saveBtn_${$index}`"
            :ref="'saveBtn_' + $index"
            v-show="row.showSaveBtn"
            type="primary"
          >保存
          </el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableData: [
        {
          skuOuterId: '123',
          oldSkuOuterId: '123',
          showSaveBtn: false,
        }
      ]
    };
  },
  methods: {
    toggleFocus(e, $index, data = {}, isFocus = false) {
      // 聚焦
      if (isFocus) { 
        data.showSaveBtn = true;
      // 失焦
      } else { 
        // 點擊“保存”失焦(判斷失焦時關聯的目標元素是不是輸入框後面的保存按鈕)
        if (e.relatedTarget === this.$refs[`saveBtn_${$index}`].$el) {
          axios.post('/updateSkuOuterId', {skuOuterId: data.skuOuterId}).then(res => {
            // 保存成功
            data.oldSkuOuterId = data.skuOuterId;
          }).catch(() => {
            data.skuOuterId = data.oldSkuOuterId;
          });
        // 點擊其他地址失焦
        } else {
          data.skuOuterId = data.oldSkuOuterId;
        }
        data.showSaveBtn = false;
      }
    },
  },
};
</script>

上面的代碼在有橫向滾動條的時候,如果出現瞭 e.relatedTarget === this.$refs[`saveBtn_${$index}`].$el 為 false,但我們感覺失焦的目標元素就是保存按鈕的情況,我們可以把判斷條件這麼改一下:

e.relatedTarget === this.$refs[`saveBtn_${$index}`].$el
// 改成(下面使用瞭jQuery) 
$(e.relatedTarget).hasClass(`J_saveBtn_${$index}`)

這樣就 OK 瞭!

vue關於輸入框的一些操作

關於輸入框

監聽輸入

失去焦點的事件

<template>
  <div class="orderinfo">
  <input type="text" v-model="text" @blur="blur()">
  </div>
</template>
<script>
export default {
  name: "Orderinfo",
  data() {
    return {
      text:''
    };
  },
 
  mounted() {},
  watch: {
    // 監聽輸入框輸入
    text: function(val) {
      if (val.length > 0) {
        console.log('顯示刪除')
      } else {
         console.log('不顯示刪除')
      }
    }
  },
 
  methods: {
    //失去焦點
    blur(){
      console.log(this.text)
    }
  }
};
</script>
 
<style scoped lang="scss">
</style>

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: