【Vue十二】--- 指令

一、 指令

1-1 内置指令

v-bind,v-v-model,v-for,v-on,v-else,v-show

1-1-1 v-text
  1. <div>
        <div v-text="name"></div>
        <div v-html="str"></div>
    </div>    
    <script>
    	new Vue({
            el: '#root',
            data: {
                name: 'aaa',
                str:'<h3>你好呀</h3>'
            }
        })
    </script>
    
    • 向其所在节点中渲染文本内容
    • 替换节点中的内容
  2. cookie

    image-20220716100232110

1-1-2 v-html
  1. 作用: 向指定节点中渲染html结构的内容
  2. 与插值语法区别:
    • 替换节点中所有内容
    • v-html可以识别html结构
  3. v-html有安全性问题
    • 在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击
    • 在可信的内容上加上v-html,永远不要相信用户提交的内容
1-1-3 v-cloak
    • 本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性
    • 使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题
  1. <styel>
    	[v-cloak]{
        	display:none;
        }
    </styel>
    <body>
        <h2 v-cloak>
            {{name}}
        </h2>
    </body>
    
1-1-4 v-once指令
  1. <div id="root">
        <h2 v-once>
            初始化的n值是:{{n}}
        </h2>
        <h2>
            当前的n值是:{{n}}
        </h2>
        <button @click="n++">
            点我n+1
        </button>
    </div>
    <script>
    	new Vue({
            el:"",
            data: {
                n: 1
            }
        })
    </script>
    
    • 所在节点在初次动态渲染后,视为静态内容了
    • 以后数据的变化不会引起v-once所在结构的更新,可以用于性能优化
1-1-5 v-pre
    • 跳过所在节点的编译过程
    • 可以利用它跳过:没有使用指令语法,没有使用插值语法的节点,会加快编译
  1. 不管是否有指令语法这些,直接拉过内容就用

1-2 自定义指令

  1. 指令语法:

    • 功能: 用于解析标签(标签属性、标签体内容、绑定事件…)
    • 举例: v-bind:href="xxx",xxx同样要写js表达式,且可以直接读取到data中的所有属性
    • Vue中有很多指令,且形式都是: v-???
  2. <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    
    </head>
    
    <body>
        <button id="btn">点我创建一个输入框</button>
        <div id="root">
            <!-- - 定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍-->
            <!-- 准备好一个容器 -->
            <div id="root">
                <h2>当前的n值是: <span v-text="n"></span></h2>
                <h2>放大10倍后的值是: <span v-big="n"></span></h2>
                <button @click="n++">点我n+1</button>
            </div>
    
            <!-- - 定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点 -->
    
        </div>
        <script>
            new Vue({
                el: '#root',
                data: {
                    n: 1
                },
                directives: {
                    // big函数何时会被调用? 1. 指令与元素成功绑定时,指令所在的模板被重新解析
                    big(element, binding) {
                        console.log(element);
                        console.log(binding);
                        element.innerText = binding.value * 10
                    },
                    fbind(element, binding) {
                        element.value = binding.value
                        element.focus()
                    }
                }
            })
        </script>
    </body>
    
    
    </html>
    
1-2-2
		<!-- 
				需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
				需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。
				自定义指令总结:
						一、定义语法:
									(1).局部指令:
												new Vue({															new Vue({
													directives:{指令名:配置对象}   或   		directives{指令名:回调函数}
												}) 																		})
									(2).全局指令:
													Vue.directive(指令名,配置对象) 或   Vue.directive(指令名,回调函数)

						二、配置对象中常用的3个回调:
									(1).bind:指令与元素成功绑定时调用。
									(2).inserted:指令所在元素被插入页面时调用。
									(3).update:指令所在模板结构被重新解析时调用。

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

二、 一个完整例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>自定义指令</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
				需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。
				自定义指令总结:
						一、定义语法:
									(1).局部指令:
												new Vue({															new Vue({
													directives:{指令名:配置对象}   或   		directives{指令名:回调函数}
												}) 																		})
									(2).全局指令:
													Vue.directive(指令名,配置对象) 或   Vue.directive(指令名,回调函数)

						二、配置对象中常用的3个回调:
									(1).bind:指令与元素成功绑定时调用。
									(2).inserted:指令所在元素被插入页面时调用。
									(3).update:指令所在模板结构被重新解析时调用。

						三、备注:
									1.指令定义时不加v-,但使用时要加v-;
									2.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>{{name}}</h2>
			<h2>当前的n值是:<span v-text="n"></span> </h2>
			<!-- <h2>放大10倍后的n值是:<span v-big-number="n"></span> </h2> -->
			<h2>放大10倍后的n值是:<span v-big="n"></span> </h2>
			<button @click="n++">点我n+1</button>
			<hr/>
			<input type="text" v-fbind:value="n">
		</div>
	</body>
	
	<script type="text/javascript">
		Vue.config.productionTip = false

		//定义全局指令
		/* Vue.directive('fbind',{
			//指令与元素成功绑定时(一上来)
			bind(element,binding){
				element.value = binding.value
			},
			//指令所在元素被插入页面时
			inserted(element,binding){
				element.focus()
			},
			//指令所在的模板被重新解析时
			update(element,binding){
				element.value = binding.value
			}
		}) */

		new Vue({
			el:'#root',
			data:{
				name:'尚硅谷',
				n:1
			},
			directives:{
				//big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。
				/* 'big-number'(element,binding){
					// console.log('big')
					element.innerText = binding.value * 10
				}, */
				big(element,binding){
					console.log('big',this) //注意此处的this是window
					// console.log('big')
					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
					}
				}
			}
		})
		
	</script>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值