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加密解密7种方法总结分析
Oct 07 Javascript
js 文件引入实现代码
Apr 23 Javascript
jQuery DOM操作实例
Mar 05 Javascript
判断日期是否能跨月查询的js代码
Jul 25 Javascript
浅析Node.js查找字符串功能
Sep 03 Javascript
jQuery中:checkbox选择器用法实例
Jan 03 Javascript
使用ionic切换页面卡顿的解决方法
Dec 16 Javascript
jQuery内容筛选选择器实例代码
Feb 06 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
Feb 13 Javascript
jQuery实现点击关注和取消功能
Jul 03 jQuery
vue-lazyload使用总结(推荐)
Nov 01 Javascript
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
关于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
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
PHP截取中文字符串的问题
2006/07/12 PHP
PHP+MYSQL 出现乱码的解决方法
2008/08/08 PHP
php中inlcude()性能对比详解
2012/09/16 PHP
自定义php类(查找/修改)xml文档
2013/03/26 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
javascript css float属性的特殊写法
2008/11/13 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
JavaScript this关键字的深入详解
2021/01/14 Javascript
高效使用Python字典的清单
2018/04/04 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
给你一面国旗 教你用python画中国国旗
2019/09/24 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
python中xlrd模块的使用详解
2021/02/01 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
护理专业本科生自荐信
2013/10/01 职场文书
中职生自我鉴定范文
2013/10/03 职场文书
勾股定理课后反思
2014/04/26 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
工作一年自我鉴定
2019/06/20 职场文书
Python图像处理之图像拼接
2021/04/28 Python
总结一些Java常用的加密算法
2021/06/11 Java/Android
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js