Bootstrap

element input focus()获取焦点无效?

有个业务场景需要需要点击表格单元格变成input编辑,点击其他地方input切换成span。

如图:

未编辑状态使用span显示

 编辑状态切换成input

 代码

//html
template v-slot:value="{row}">
     <el-input v-if="row.isEdit" placeholder="请输入内容" v-model="row.value" ref="Textinp"  clearable @blur="preserve(row)"></el-input>

    <span  v-show="!row.isEdit" class="valueEdit" @click="valueEdit(row)">{{row.value}}            
    </span>
 </template>


//js

methods:{
   // 值编辑
    valueEdit(row) {
      this.$set(row, "isEdit", true)
      this.$nextTick(() => {
          this.$refs.Textinp.focus();
        })
 },

  // 值保存
    preserve(row){
      this.$set(row, "isEdit", false)
    },

在这里就出现了一个问题,那就是切换到input的时候 无法自动获取焦点,无法获取焦点的话就没办法点击其他地方关闭。在百度也找了很多办法,都是无效。最终的解决方案就是在html哪里把v-if改成v-show就解决了这个问题。

修改代码

<el-input v-show="row.isEdit" placeholder="请输入内容" v-model="row.value" ref="Textinp"  clearable @blur="preserve(row)"></el-input>

 <span  v-show="!row.isEdit" class="valueEdit" @click="valueEdit(row)">{{row.value}}</span>

ps:如果是多个输入框的话,还是v-if和v-else有效。

pps:如果以上全部方法都无效的话可以试试自定义指令

在data同级定义自定义指令

 
//js
 directives: {
    focus: {
      inserted: function (el) {
        el.querySelector("input").focus()
      }
    }
  },

 使用

 

;