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 ui resizable bug解决方法
Oct 26 Javascript
jQuery实现视频作为全屏幕背景
Dec 18 Javascript
JavaScript的removeChild()函数用法详解
Dec 27 Javascript
Bootstrap布局组件应用实例讲解
Feb 17 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
Mar 25 Javascript
JavaScript hasOwnProperty() 函数实例详解
Aug 04 Javascript
javascript计算对象长度的方法
Oct 25 Javascript
详解浏览器缓存和webpack缓存配置
Jul 06 Javascript
详解Vue之父子组件传值
Apr 01 Javascript
Vue数据绑定简析小结
May 07 Javascript
通过实例解析js简易模块加载器
Jun 17 Javascript
vue中实现上传文件给后台实例详解
Aug 22 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
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
PHP 验证登陆类分享
2015/03/13 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
jquery实现的省市区三级联动
2015/04/02 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
关于vue组件事件属性穿透详解
2019/10/28 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
基于javascript的无缝滚动动画1
2020/08/07 Javascript
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
pymysql的简单封装代码实例
2020/01/08 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
python time()的实例用法
2020/11/03 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
商得四方公司面试题(gid+)
2014/04/30 面试题
程序集与命名空间有什么不同
2014/07/25 面试题
会计毕业生自我鉴定
2013/11/04 职场文书
大学秋游活动方案
2014/02/11 职场文书
小班幼儿评语大全
2014/04/30 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS
java开发双人五子棋游戏
2022/05/06 Java/Android
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers