当前位置:   article > 正文

Vue + el-ui table 内嵌 input 调用 focus 方法无效;this.$refs.xxx.focus()方法无效_vue input为啥不能focus

vue input为啥不能focus

1、先说需求

a.在表格编辑态的时候,可以在①处敲击“回车键”,光标能跳转到②处

b.表格可以在浏览态和编辑态切换,用v-show来实现的编辑和浏览

2、代码片段(这种方式不生效)

        页面显示代码:

  1. <el-table-column label="产量" prop="ptCn" width="110px" header-align="center" align="center">
  2. <template slot-scope="scope">
  3. <div v-show="scope.row.edit">
  4. <el-input :ref="'ptCn' + scope.row.index" v-model="scope.row.ptCn" @keyup.enter.native="inputFocus('ptCn', scope.row.index)"></el-input>
  5. </div>
  6. <div v-show="!scope.row.edit">
  7. {{ scope.row.ptCn }}
  8. </div>
  9. </template>
  10. </el-table-column>

methods方法:

  1. // 回车点击事件
  2. inputFocus(flag, index) {
  3. const nextRow = flag + (++index)
  4. console.log("refs = ");
  5. console.log(this.$refs);
  6. console.log("nextRow = ");
  7. console.log(this.$refs[nextRow]);
  8. console.log("光标定位前。。。");
  9. this.$refs[nextRow].focus();
  10. console.log("光标定位后。。。");
  11. },

3、页面效果

如图,当在第一行 9999 处敲击回车之后,控制台打印出了this.$refs的所有组件,也打印了定位前和定位后的log日志,且没有报错,说明我们的代码是正确执行了的,但是光标没有变,还是在第一行。

4、百度了以下几个原因,但是改了之后依旧是不管用

Element UI输入框focus()方法自动获取焦点失败处理方法_element focus_冒泡_L的博客-CSDN博客

Vue Element UI input输入框focus()无法获取焦点_vue使用v-show隐藏input框后不再能聚焦_ALL700的博客-CSDN博客

Element UI输入框focus()方法自动获取焦点失败处理方法 - 行业资讯 - 电子产品设计开发与电子技术学习交流!

vue element popover input focus() 不生效 解决办法 | 码农家园

5、分析原因

我又试了一下,当不把<el-input>标签放在<el-table>里的时候,比如正常表单(ref不是通过动态赋值)的时候,这段代码是完全没有问题的。所以问题应该是出在了<el-table>上,不知道Element-ui加了什么限制或者Vue的什么bug,导致的代码执行了,但是光标却没有移动

6、改为原生DOM的方式(自测生效)

页面显示代码:(将 ref 改为 id,其他都没变)

  1. <el-table-column label="产量" prop="ptCn" width="110px" header-align="center" align="center">
  2. <template slot-scope="scope">
  3. <div v-show="scope.row.edit">
  4. <!-- 仅仅是将这里的 ref 改为了 id -->
  5. <el-input :id="'ptCn' + scope.row.index" v-model="scope.row.ptCn" @keyup.enter.native="inputFocus('ptCn', scope.row.index)"></el-input>
  6. </div>
  7. <div v-show="!scope.row.edit">
  8. {{ scope.row.ptCn }}
  9. </div>
  10. </template>
  11. </el-table-column>

methods方法:(将this.$refs 改为 document.getElementById)

  1. // 回车点击事件
  2. inputFocus(flag, index) {
  3. const nextRow = flag + (++index)
  4. console.log("nextRow = ");
  5. console.log(document.getElementById(nextRow));
  6. console.log("光标定位前。。。");
  7. document.getElementById(nextRow).focus();
  8. console.log("光标定位后。。。");
  9. },

页面效果:(在第一行的 9999 处敲击 回车键,此时能正常跳转到第二行的 27447 处)

7、总结:

学好HTML,JS,CSS吧(这是基础的基础),无论框架怎么变,底层都是这东西,当发现框架不支持的时候,可以考虑考虑原生的DOM实现。

8、至于为啥this.$refs.xxx.focus() 这个方法不生效,目前还没有研究出来,有知道的大佬欢迎留言在这篇文章的评论区,共勉!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号