文章目录
- 1. 常用内置指令
- 2. 自定义指令
- 2.1 定义语法
- 2.2 配置对象中常用的3个回调
- 2.3 备注
- 2.4 使用指令
1. 常用内置指令
-
v-text
: 更新元素的 textContent -
v-html
: 更新元素的 innerHTML -
v-if
: 如果为true, 当前标签才会输出到页面 -
v-else
: 如果为false, 当前标签才会输出到页面 -
v-show
: 通过控制display样式来控制显示/隐藏 -
v-for
: 遍历数组/对象 -
v-on
: 绑定事件监听, 一般简写为@ -
v-bind
: 强制绑定解析表达式, 可以省略v-bind -
v-model
: 双向数据绑定
-
v-text
: 更新元素的 textContent
- 作用:向其所在的节点中渲染文本内容。
- 与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。
-
v-html
: 更新元素的 innerHTML
- 作用:向指定节点中渲染包含html结构的内容。
- 与插值语法的区别:
(1). v-html会替换掉节点中所有的内容,{{xx}}则不会。
(2). v-html可以识别html结构。 - 严重注意:v-html有安全性问题!!!!
(1). 在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
(2). 一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!
-
v-once
指令:
- v-once所在节点在初次动态渲染后,就视为静态内容了。
- 以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。
-
v-pre
指令:
- 跳过其所在节点的编译过程。
- 可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。
-
ref
: 为某个元素注册一个唯一标识, vue对象通过$refs属性访问这个元素对象 -
v-cloak
: 使用它防止闪现表达式, 与css配合: [v-cloak] { display: none }
- 本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
- 使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题。
[v-clock] {
display: none;
}
- 1
- 2
- 3
<body>
<div id="demo">
<p ref="content"></p>
<button @click="hint">提示</button>
<p v-cloak>{{msg}}</p>
</div>
<script src="../js/"></script>
<script>
new Vue({
el: "#demo",
data: {
msg: "YK菌"
},
methods: {
hint(){
alert(this.$refs.content.textContent);
}
}
})
</script>
</body>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
2. 自定义指令
需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。
2.1 定义语法
(1) 局部指令
new Vue({
directives:{指令名:配置对象}
})
- 1
- 2
- 3
或
new Vue({
directives{指令名:回调函数}
})
- 1
- 2
- 3
例子
directives : {
'my-directive' : {
bind (el, binding) {
el.innerHTML = binding.value.toupperCase()
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
(2) 全局指令
Vue.directive(指令名,配置对象)
- 1
或
Vue.directive(指令名,回调函数)
- 1
例子
Vue.directive('my-directive', function(el, binding){
el.innerHTML = binding.value.toupperCase()
})
- 1
- 2
- 3
2.2 配置对象中常用的3个回调
- bind:指令与元素成功绑定时调用。
- inserted:指令所在元素被插入页面时调用。
- update:指令所在模板结构被重新解析时调用。
2.3 备注
- 指令定义时不加v-,但使用时要加v-;
- 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。
2.4 使用指令
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>自定义指令</title>
<script type="text/javascript" src="../js/"></script>
</head>
<body>
<!-- 准备好一个容器-->
<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
//定义全局指令
/* ('fbind',{
//指令与元素成功绑定时(一上来)
bind(element,binding){
=
},
//指令所在元素被插入页面时
inserted(element,binding){
()
},
//指令所在的模板被重新解析时
update(element,binding){
=
}
}) */
new Vue({
el:'#root',
data:{
name:'尚硅谷',
n:1
},
directives:{
//big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。
/* 'big-number'(element,binding){
// ('big')
= * 10
}, */
big(element,binding){
console.log('big',this) //注意此处的this是window
// ('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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75