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 相关文章推荐
css transform 3D幻灯片特效实现步骤解读
Mar 27 Javascript
Js操作Select大全(取值、设置选中等等)
Oct 29 Javascript
JS、CSS加载中的小问题探讨
Nov 26 Javascript
js实现进度条的方法
Feb 13 Javascript
浅析JS异步加载进度条
May 05 Javascript
angularjs实现简单的购物车功能
Sep 21 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
Aug 24 Javascript
jQuery轻量级表单模型验证插件
Oct 15 jQuery
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
Apr 10 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
Aug 12 Javascript
小程序自动化测试的示例代码
Aug 11 Javascript
HTML元素拖拽功能实现的完整实例
Dec 04 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与ASP
2006/10/09 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
简单实现jQuery手风琴效果
2017/08/18 jQuery
微信小程序实现tab切换效果
2017/11/21 Javascript
使用JavaScript破解web
2018/09/28 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
eslint+prettier统一代码风格的实现方法
2020/07/22 Javascript
python中使用序列的方法
2015/08/03 Python
Python中str.format()详解
2017/03/12 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
什么是封装
2013/03/26 面试题
《满井游记》教学反思
2014/02/26 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
2019同学聚会主持词
2019/05/06 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
浅析Django接口版本控制
2021/06/26 Python