Vue 学习笔记 — 无法避免的dom操作
使用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操作的更多相关文章
- jQuery学习笔记(二)jQuery中DOM操作
		
目录 DOM操作分类 jQuery中的各种DOM操作 查找节点 创建节点 删除节点 复制节点 替换节点 包裹节点 属性操作 样式操作 对HTML.文本和值的操作 遍历节点 CSS-DOM操作 小结 本 ...
 - JavaWeb学习笔记——jquery中的dom操作
		
 jquery中的dom操作 废话不说:直接上例子: 1.添加节点-html页面 Append:向每个匹配的元素内部追加内容. <body> <ul id="city& ...
 - Javascript高级编程学习笔记(45)——DOM 操作表格及DOM动态集合
		
操作DOM表格 早些时候,HTML 还是以表格布局为主, 所以DOM操作表格是比较重要的一点 但是现如今 有其它的选择,所以表格的操作也就慢慢地淡出了人们的视线 所以这里也就不过多去详细展开,这里也就 ...
 - 《JavaScript权威指南》学习笔记 第七天 DOM操作
		
由衷的觉得,随着IT技术的广泛的运用,个人电脑以及智能手机的使用,信息的获取与传播更为简单.但是我们获取有用信息的难度相反是越来越大了,想要保持住自己的注意力越来越难了.除了吃饭睡觉,我的精力都在电脑 ...
 - js学习笔记之日期倒计时DOM操作
		
1.访问html元素 getElementById() 方法 返回对拥有指定 id 的第一个对象的引用,只有dom对象有效 getElementsByName() 方法 返回指定名称的对象集合 g ...
 - Vue学习笔记十三:Vue+Bootstrap+vue-resource从接口获取数据库数据
		
目录 前言 SpringBoot提供后端接口 Entity类 JPA操作接口 配置文件 数据库表自动映射,添加数据 写提供数据的接口 跨域问题 前端修改 效果图 待续 前言 Vue学习笔记九的列表案例 ...
 - Vue学习笔记-Vue.js-2.X 学习(一)===>基本知识学习
		
一 使用环境: windows 7 64位操作系统 二 IDE:VSCode/PyCharm 三 Vue.js官网: https://cn.vuejs.org/ 四 下载安装引用 方式1:直接 ...
 - vue 学习笔记(二)
		
最近公司赶项目,一直也没时间看 vue,之前看下的都快忘得差不多了.哈哈哈,来一起回顾一下vue 学习笔记(一)后,继续向下看嘛. #表单输入绑定 基础用法 v-model 会忽略所有表单元素的 va ...
 - vue学习笔记(十)路由
		
前言 在上一篇博客vue学习笔记(九)vue-cli中的组件通信内容中,我们学习组件通信的相关内容和进行了一些组件通信的小练习,相信大家已经掌握了vue-cli中的组件通信,而本篇博客将会带你更上一层 ...
 
随机推荐
- vue打包遇到的坑
			
1.-webkie-box-orient:vertical没大打包上,解决方案 /* ! autoprefixer: off */ -webkit-box-orient: vertical; /* a ...
 - matplotlib 中的柱状图
			
def drawBar(): pyplot.bar(range(5),[100,200,300,400,400]) pyplot.xticks(range(5),['A','B','C','D','E ...
 - cocos creator 碰撞检测
			
creator的碰撞检测系统分为碰撞检测系统和物理碰撞检测系统两个模块,并且这两个模块是相互独立的(这边主要是非物理碰撞检测系统) 1.在制作碰撞检测系统的时候要对物体进行分组,即指定节点的分组与分组 ...
 - Linux 常用命令介绍
			
介绍常用命令,在忘记时便于即使查询 复制.移动.删除 cp.mv.rm.pwd 1. CP 介绍 用法:CP [-adfilprsu] 源文件 目标文件 参数:参数说明: -a:是指arc ...
 - MySQL数据库快速造大量数据
			
这段时间做性能测试,发现数据都是分库写进数据库了,并且要构造大量数据,大概4000万的数据量,用普通的方法,写个MySQL函数,之前测试过,大概200万数据也要跑一个多小时,太慢了. 后面研究发现有个 ...
 - ****微信小程序架构解析
			
| 导语 微信小程序的公测掀起了学习小程序开发的浪潮,天生跨平台,即用即走.媲美原生体验.完善的文档.高效的开发框架,小程序给开发者带来了很多惊喜.通过这篇文章和大家一起分析小程序的架构,分享开发 ...
 - centos 7.5+如何格式化硬盘
			
[root@k8s-node2 ~]# fdisk -l Disk /dev/sdb: bytes, sectors Units = sectors of * = bytes Sector size ...
 - Ionic2中腾讯Bugly异常捕获以及上报
			
Ionic2混合开发,入坑系列:Ionic2中腾讯Bugly异常捕获以及上报 1.Ionic2中处理全局异常,直接继承IonicErrorHandler即可,代码如下 import { IonicEr ...
 - Selenium Webdriver点击事件失效问题
			
最近在用selenium webdriver时,遇到一个棘手的问题,点击事件有时候会失效,具体原因我也不知道是什么. 但是有两个解决办法,第一,在点击该标签前,先点击它的父标签,也就是点击两次. dr ...
 - Django----使用模板系统渲染博客页面、实现列表和详情页的跳转、前后跳转功能
			
.模板写法同Flask,可以参考之前的FLask-模板 .将之前的BootStrap静态页面中的数据使用模板写 <!DOCTYPE html> <html lang="en ...