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 相关文章推荐
制作特殊字的脚本
Jun 26 Javascript
Javascript技术技巧大全(五)
Jan 22 Javascript
用prototype实现的简单小巧的多级联动菜单
Mar 24 Javascript
js 弹出框 替代浏览器的弹出框
Oct 29 Javascript
使用js dom和jquery分别实现简单增删改
Sep 11 Javascript
JavaScript仿商城实现图片广告轮播实例代码
Feb 06 Javascript
Node.js实用代码段之正确拼接Buffer
Mar 17 Javascript
简单实现node.js图片上传
Dec 18 Javascript
小程序获取周围IBeacon设备的方法
Oct 31 Javascript
js中的深浅拷贝问题简析
May 10 Javascript
js实现简单五子棋游戏
May 28 Javascript
JavaScript实现滑块验证解锁
Jan 07 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
我的论坛源代码(四)
2006/10/09 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
2016/01/12 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
基于Jquery的开发个代阴影的对话框效果代码
2011/07/28 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
AngularJS实现单独作用域内的数据操作
2016/09/05 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
Python中join和split用法实例
2015/04/14 Python
Python采用Django制作简易的知乎日报API
2016/08/03 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
python函数的作用域及关键字详解
2019/08/20 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
python用opencv完成图像分割并进行目标物的提取
2020/05/25 Python
python Selenium 库的使用技巧
2020/10/16 Python
秘书岗位职责
2013/11/18 职场文书
教师实习自我鉴定
2013/12/13 职场文书
学生鉴定评语大全
2014/05/05 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
纪律教育月活动总结
2014/08/26 职场文书
万里长城导游词
2015/01/30 职场文书
捐款仪式主持词
2015/07/04 职场文书
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python