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 相关文章推荐
JavaScript 动态添加表格行 使用模板、标记
Oct 24 Javascript
网页禁用右键实现代码(JavaScript代码)
Oct 29 Javascript
JavaScript中出现乱码的处理心得
Dec 24 Javascript
JavaScript Accessor实现说明
Dec 06 Javascript
JS实现自动阅读单词(有道单词本添加功能)
Nov 14 Javascript
AngularJS全局scope与Isolate scope通信用法示例
Nov 22 Javascript
微信小程序 数据交互与渲染实例详解
Jan 21 Javascript
详细分析JS函数去抖和节流
Dec 05 Javascript
js实现二级菜单点击显示当前内容效果
Apr 28 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
Aug 22 Javascript
构建一个JavaScript插件系统
Oct 20 Javascript
jQuery实现购物车全功能
Jan 11 jQuery
关于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
jquery在Chrome下获取图片的长宽问题解决
2013/03/20 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
python list使用示例 list中找连续的数字
2014/01/27 Python
python中Flask框架简单入门实例
2015/03/21 Python
Python实例一个类背后发生了什么
2016/02/09 Python
基于Python对象引用、可变性和垃圾回收详解
2017/08/21 Python
python 中的list和array的不同之处及转换问题
2018/03/13 Python
用python生成1000个txt文件的方法
2018/10/25 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
Java软件工程师综合面试题笔试题
2013/09/08 面试题
生物技术专业毕业生求职信范文
2013/12/14 职场文书
小学毕业演讲稿
2014/04/25 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
python缺失值的解决方法总结
2021/06/09 Python
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技