vue自定义指令

1. 自定义指令限制字符长度

方法一
<div id="app">
	<input type="text" v-model="msg" v-limit="msg"/>
</div>
<script>
	// 第一次绑定和数据更新时都会调用
	Vue.directive("limit",function(el,bindings,vnode) {
		/*
		console.log(el);  // 指令作用的元素 <input type="text">
		console.log(bindings); // 包含所有指令相关信息的一个对象
		console.log(vnode); // 虚拟dom,是一个js对象,代表这个元素
		*/
		// bindings.expression 代表对象的值
		let ctx = vnode.context; // 作用的实例
		ctx[bindings.expression] = el.value.slice(0,5);  // 截取从下标为0开始到下标为5结束不包括5的字符
	});
	let vm = new Vue({
		el: "#app",
		data: {
			msg: "123"
		}
	});
</script>
方法一优化限制字符长度
<div id="app">
	<input type="text" v-model="msg" v-limit.3="msg"/>
</div>
<script>
	// 第一次绑定和数据更新时都会调用
	Vue.directive("limit",function(el,bindings,vnode) {
		let [,len] = bindings.rawName.split("."); // 获取v-limit.3的3
		let ctx = vnode.context; // 作用的实例
		ctx[bindings.expression] = el.value.slice(0,len);  // 截取从下标为0开始到下标为5结束不包括5的字符
	});
	let vm = new Vue({
		el: "#app",
		data: {
			msg: "123"
		}
	});
</script>
方法二
<div id="app">
	<input type="text" v-model="msg" v-limit="msg"/>
</div>
<script>
	// 
	Vue.directive("limit",{
		// 指令第一次作用到元素时调用
		bind(el,bindings,vnode) {
			let ctx = vnode.context; // 作用的实例
			ctx[bindings.expression] = el.value.slice(0,5);  // 截取从下标为0开始到下标为5结束不包括5
		},
		// 数据发生改变时调用
		update(el,bindings,vnode) {
			let ctx = vnode.context; // 作用的实例
			ctx[bindings.expression] = el.value.slice(0,5);  // 截取从下标为0开始到下标为5结束不包括5
		}
	});
	let vm = new Vue({
		el: "#app",
		data: {
			msg: "123"
		}
	});
</script>

2. 自定义指令实现双向数据绑定

<div id="app">
	<input type="text" v-limit.3="msg"/>
</div>
<script>
	// 第一次绑定和数据更新时都会调用
	Vue.directive("limit",function(el,bindings,vnode) {
		let [,len] = bindings.rawName.split("."); // 获取v-limit.3的3
		let ctx = vnode.context; // 作用的实例
		// 输入时触发
		el.addEventListener("input", (e)=>{  // 注册input事件
			let val = e.target.value.slice(0,len); // 截取字符串
			ctx[bindings.expression] = val; // 将新值赋给msg
			el.value = val; // 同步修改视图
		});
		el.value = ctx[bindings.expression]..slice(0,len); 
	});
	let vm = new Vue({
		el: "#app",
		data: {
			msg: "123456"
		}
	});
</script>

3. 自定义自动获取焦点

<div id="app">
	<input type="text" v-model="msg" v-limit="msg" v-focus/>
</div>
<script>
	// 自动获取焦点
	Vue.directive("foucus",{
		/* 方法一:
		bind(el) {  //获取不到dom的状态
			// 延迟执行,渲染后再执行
			Vue.nextTick(()=>{
				el.focus();
			});
		}
		*/
		// 方法二:dom渲染完后执行
		inserted(el) {
			el.focus();
		}
	});
	Vue.directive("limit",{
		// 指令第一次作用到元素时调用
		bind(el,bindings,vnode) {
			let ctx = vnode.context; // 作用的实例
			ctx[bindings.expression] = el.value.slice(0,5);  // 截取从下标为0开始到下标为5结束不包括5
		},
		// 数据发生改变时调用
		update(el,bindings,vnode) {
			let ctx = vnode.context; // 作用的实例
			ctx[bindings.expression] = el.value.slice(0,5);  // 截取从下标为0开始到下标为5结束不包括5
		}
	});
	let vm = new Vue({
		el: "#app",
		data: {
			msg: "123"
		}
	});
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值