Vue2.x Todo之自定义指令实现自动聚焦的方法


Posted in Javascript onJanuary 08, 2019

我们希望用户双击 todo 进入编辑状态后输入框自动获取焦点,而不是需要先手动点一下。input 元素有一个 focus 方法可以来帮我们完成这个事情,但现在的问题是如何在 Vue 中获得这个 input 元素,从而来操作它。Vue 的自定义指令可以完成这个功能。

我们先来看看 Vue 官网的一个示例:

然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。举个聚焦输入框的例子,如下:

一个输入框:

当页面加载时,该元素将获得焦点 (注意: autofocus 在移动版 Safari 上不工作)。事实上,只要你在打开这个页面后还没点击过任何内容,这个输入框就应当还是处于聚焦状态。现在让我们用指令来实现这个功能:

// 注册一个全局自定义指令 `v-focus` 

Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时…… inserted: function (el) { // 聚焦元素 el.focus() } })

如果想注册局部指令,组件中也接受一个 directives 的选项:

directives: { focus: { // 指令的定义 inserted: function (el) { el.focus() } } }

指令是什么,就是用来指导被绑定的元素的行为,我们之前接触过 v-if、v-model、v-bind 等指令,官方文档说的非常清楚,我们可以自己注册一个指令,然后实现某些钩子函数,从而指定被绑定元素的行为。这里我们依葫芦画瓢,实现一个 focus 指令,这个指令实现了 inserted 钩子函数,这个函数在被绑定的元素被插入 dom 时触发,且被绑定的元素会作为参数传入钩子函数,我们就可以在函数中对它操作。

我们在 Vue 对象中声明局部指令:

<script>
  let id = 0; // 用于 id 生成
  var app = new Vue({
    ...
    methods: {
      ...
    },
    directives: {
      focus: {
        inserted: function (el) {
          el.focus()
        }
      }
    }
  })
</script>

然后就可以使用这个指令了,把它绑定到编辑框,这样编辑框出现时指令就被触发,从而聚焦。

<input type="text" 
    value="编辑 todo..."
    v-focus="true"
    v-if="editedTodo!==null && editedTodo.id===todo.id"
    v-model="todo.title"
    @keyup.enter="editDone(todo)"
    @keyup.esc="cancelEdit(todo)"/>

注意因为元素一旦出现一定要聚焦的,所以条件始终为 true。

现在用户体验好多了!快打开浏览器体验一下吧!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery中dialog属性小记
Sep 03 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
Jan 08 Javascript
js 页面元素的几个用法总结
Nov 18 Javascript
JavaScript中window.open用法实例详解
Apr 15 Javascript
实例讲解jquery与json的结合
Jan 07 Javascript
详解ES6中的let命令
Apr 05 Javascript
JavaScript奇技淫巧44招【实用】
Dec 11 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
May 08 jQuery
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
May 26 Javascript
微信小程序自定义菜单切换栏tabbar组件代码实例
Dec 30 Javascript
js实现带搜索功能的下拉框
Jan 11 Javascript
vue跳转方式(打开新页面)及传参操作示例
Jan 26 Javascript
关于React动态加载路由处理的相关问题
Jan 07 #Javascript
vue+iview 兼容IE11浏览器的实现方法
Jan 07 #Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
Jan 07 #Javascript
利用React Router4实现的服务端直出渲染(SSR)
Jan 07 #Javascript
Node.js EventEmmitter事件监听器用法实例分析
Jan 07 #Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
Jan 07 #Javascript
jQuery实现的别踩白块小游戏完整示例
Jan 07 #jQuery
You might like
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
jquery animate 动画效果使用说明
2009/11/04 Javascript
js function使用心得
2010/05/10 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
2013/11/03 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
python 文件操作删除某行的实例
2017/09/04 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
python学习基础之循环import及import过程
2018/04/22 Python
python监控文件并且发送告警邮件
2018/06/21 Python
Python拼接字符串的7种方法总结
2018/11/01 Python
python中的函数递归和迭代原理解析
2019/11/14 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
大学生创业感言
2014/01/25 职场文书
机关保密承诺书
2014/06/03 职场文书
金融专业求职信
2014/08/05 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
三方协议书
2015/01/27 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
如何用python插入独创性声明
2021/03/31 Python
python数字图像处理实现图像的形变与缩放
2022/06/28 Python