简书

使用Vue了一段时间,感觉确实不错,“数据驱动视图”非常好用,大部分情况下都不需要关心dom,但是凡事都有例外,总有一些时候我们必须要直接对dom进行操作,比如下面这个例子:

<!DOCTYPE html>
<html> <head>
<meta charset="utf-8" />
<title>vPager</title>
<script src="vue.js"></script>
<script src="vCheckBox.js"></script>
</head> <body> <table border="1">
<thead>
<tr>
<th>名称</th>
<th>数量</th>
</tr>
</thead>
<tbody>
<tr v-for="row in rows">
<td>{{row.text}}</td>
<td>
<input v-model.number="row.count" type="number" />
<label style="color:red" v-show="row.count<0">数量不能为负数</label>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan=" 2 " style="text-align:center ">
<button @click="submit ">提交</button>
</td>
</tr>
</tfoot>
</table> <script>
var table = new Vue({
el: "table ",
data: {
rows: [
{ text: "苹果 ", count: 0 },
{ text: "香蕉 ", count: 0 },
{ text: "桃子 ", count: 0 }
]
},
methods: {
submit: function () {
var rows = this.rows;
var arr = ["您需要的水果是:"];
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
if (row.count < 0) {
return;
}
arr.push(row.text + ": " + row.count + "个");
}
alert(arr.join("\n"));
}
}
});
</script>
</body> </html>

这是一段很简单的示例,运行效果如下:

现在增加一个需求:

当某行count小于0时,点击提交按钮,将小于0的输入框激活(获得焦点)。

难道要为每一个input设置一个id或者别的属性?然后用jQuery去操作它?这岂不是非常坑爹?

呵呵,当然不用,借助自定义指令可以比较轻松的完成这件事:

Vue.directive('dom', {
bind: function (el, binding) {
var obj = binding.value;
if (obj != null) {
var key = Object.keys(binding.modifiers)[0] || "el";
Vue.set(obj, key, el);
}
}
});

注册一个全局自定义指令v-dom,并且这个指令可以用一个修饰符拓展,它的作用是在指令被绑定到元素时,将被绑定的dom元素添加到指定的对象的属性中去,属性名就是修饰符名称,如果不存在修饰符时默认为el

然后将第一部分的代码做如下修改:

<input v-dom="row" v-model.number="row.count" type="number" />

表示将input元素保存到row对象的属性el里;

然后修改submit部分的代码:

methods: {
submit: function () {
var rows = this.rows;
var arr = ["您需要的水果是:"];
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
if (row.count < 0) {
row.el.focus(); //获得焦点
row.el.select(); //全选
return;
}
arr.push(row.text + ": " + row.count + "个");
}
alert(arr.join("\n"));
}
}

执行效果:



已经获得了焦点



从控制台中也可以看到rows中的每一个对象都已经拥有了el属性

PS:如果不希望使用el为属性名可以使用修饰符自定义属性名称

<input v-dom.input="row" v-model.number="row.count" type="number" />

相应的,在取值的时候需要使用row.input来获取dom元素。

Vue 学习笔记 — 无法避免的dom操作的更多相关文章

  1. jQuery学习笔记(二)jQuery中DOM操作

    目录 DOM操作分类 jQuery中的各种DOM操作 查找节点 创建节点 删除节点 复制节点 替换节点 包裹节点 属性操作 样式操作 对HTML.文本和值的操作 遍历节点 CSS-DOM操作 小结 本 ...

  2. JavaWeb学习笔记——jquery中的dom操作

     jquery中的dom操作 废话不说:直接上例子: 1.添加节点-html页面 Append:向每个匹配的元素内部追加内容. <body> <ul id="city& ...

  3. Javascript高级编程学习笔记(45)——DOM 操作表格及DOM动态集合

    操作DOM表格 早些时候,HTML 还是以表格布局为主, 所以DOM操作表格是比较重要的一点 但是现如今 有其它的选择,所以表格的操作也就慢慢地淡出了人们的视线 所以这里也就不过多去详细展开,这里也就 ...

  4. 《JavaScript权威指南》学习笔记 第七天 DOM操作

    由衷的觉得,随着IT技术的广泛的运用,个人电脑以及智能手机的使用,信息的获取与传播更为简单.但是我们获取有用信息的难度相反是越来越大了,想要保持住自己的注意力越来越难了.除了吃饭睡觉,我的精力都在电脑 ...

  5. js学习笔记之日期倒计时DOM操作

    1.访问html元素 getElementById() 方法  返回对拥有指定 id 的第一个对象的引用,只有dom对象有效 getElementsByName() 方法  返回指定名称的对象集合 g ...

  6. Vue学习笔记十三:Vue+Bootstrap+vue-resource从接口获取数据库数据

    目录 前言 SpringBoot提供后端接口 Entity类 JPA操作接口 配置文件 数据库表自动映射,添加数据 写提供数据的接口 跨域问题 前端修改 效果图 待续 前言 Vue学习笔记九的列表案例 ...

  7. Vue学习笔记-Vue.js-2.X 学习(一)===>基本知识学习

    一  使用环境: windows 7 64位操作系统 二  IDE:VSCode/PyCharm 三  Vue.js官网: https://cn.vuejs.org/ 四  下载安装引用 方式1:直接 ...

  8. vue 学习笔记(二)

    最近公司赶项目,一直也没时间看 vue,之前看下的都快忘得差不多了.哈哈哈,来一起回顾一下vue 学习笔记(一)后,继续向下看嘛. #表单输入绑定 基础用法 v-model 会忽略所有表单元素的 va ...

  9. vue学习笔记(十)路由

    前言 在上一篇博客vue学习笔记(九)vue-cli中的组件通信内容中,我们学习组件通信的相关内容和进行了一些组件通信的小练习,相信大家已经掌握了vue-cli中的组件通信,而本篇博客将会带你更上一层 ...

随机推荐

  1. HTTP请求(Request)和回应(Response)对象

    附录H HTTP请求(Request)和回应(Response)对象 57 http://djangobook.py3k.cn/ Django使用request和response对象在系统间传递状态. ...

  2. bounding box的简单理解

    1. 小吐槽 OverFeat是我看的第一篇深度学习目标检测paper,因为它是第一次用深度学习来做定位.目标检测问题.可是,很难懂...那个bounding box写得也太简单了吧.虽然,很努力地想 ...

  3. PDF中的空白页面怎么删除,PDF页面删除技巧

    在Word中想要删除其中一页文档的怎么办?直接打开就可以删除了,那么我们如何删除PDF其中几页呢?下面小编就来告诉大家PDF删除页面跟空白页面的方法.想要删除PDF文档中的页面,可以使用PDF编辑器, ...

  4. SpringBoot 整合Dubbo

    RPC框架可参考:https://blog.csdn.net/top_code/article/details/54615853 整合可参考:https://www.dalaoyang.cn/arti ...

  5. 记录下在阿里云linux上安装与配置Mysql

    环境:阿里云ECS服务器,系统为centos7.2 用户:root 参考博客:https://blog.csdn.net/kunzai6/article/details/81938613 师兄的哈哈哈 ...

  6. PowerDesigner15连接Oracle数据库并导出Oracle的表结构

    PowerDesigner连接Oracle数据库,根据建立的数据源进行E-R图生成.详细步骤如下: 1.启动PowerDesigner 2.菜单:File->Reverse Engineer - ...

  7. Log4j使用笔记:每天生成一个日志文件、按日志大小生成文件

    其中TestLog4j.java如下: package cn.zhoucy.test; import org.apache.log4j.Logger; public class TestLog4j { ...

  8. 工具系列-idea破解

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  9. 1、Linux文件结构介绍

    文件目录介绍 bin 可执行的命令 boot 启动相关的程序:boot→grub→grub.conf timeout修改启动时间 dev 设备.硬件相关信息 etc 程序.系统配置文件 home 用户 ...

  10. 在SOUI中使用布局模板

    概要 注意:布局模板是SOUI 2.8.0.4 新增加的功能.之前版本不支持. SOUI的listview等一系统控件支持通过模板来创建列表项,这里要说的模板不是指listview中的使用的列表项模板 ...