文章目录
- 十四、内置指令
- v-text
- v-html
- v-cloak(没有值)
- v-once
- v-pre
- 自定义指令
- 一、定义语法
- 二、配置对象中常用的3个问题
- 三、备注
十四、内置指令
回顾:
v-bind :单向绑定解析表达式,可简写为 :xxx
v-model : 双向数据绑定
v-for :遍历数组/对象/字符串
v-on :绑定事件监听,可简写为@
v-if :条件渲染(动态控制节点是否存在)
v-else :条件渲染(动态控制节点是否存在)
v-show :条件渲染(动态控制节点是否展示)
v-text
- 作用向其所在的节点中渲染文本内容
- 与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会
v-html:向指定节点中渲染包含html结构的内容
v-text - 作用向其所在的节点中渲染文本内容
- 与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会
<body>
<div id="root">
<div>你好,{{name}}</div>
<div v-text="name">你好,</div>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false;
new Vue({
el: '#root',
data: {
name: 'mq'
}
})
</script>
v-html
- 作用:向指定节点中渲染包含html结构的内容
- 与插值语法的区别:
a. v-html会替换掉节点中所有的内容,{{xx}}则不会
b. v-html可以识别html结构 - 严重注意:v-hmtl有安全性问题
a. 在网站上动态渲染任意HTML是非常危险的。容易导致xxs攻击
b. 一定要在可信的内容上使用v-html,永不要在用户提交的内容上
<body>
<div id="root">
<div>你好,{{name}}</div>
<div v-text="name">你好,</div>
<div v-html="str"></div>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false;
new Vue({
el: '#root',
data: {
name: 'mq',
str: '<span style="color:red">我是span标签</span>'
}
})
</script>
v-cloak(没有值)
- 本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性
- 使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题
<style>
[v-cloak]{
display: none;
}
</style>
<body>
<div id="root">
<div v-cloak>你好,{{name}}</div>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false;
new Vue({
el: '#root',
data: {
name: 'mq'
}
})
</script>
v-once
- v-once所在节点在初次动态渲染后,就视为静态内容了
- 以后数据的改变不会引起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 type="text/javascript">
Vue.config.productionTip = false;
new Vue({
el: '#root',
data: {
n: 1
}
})
</script>
v-pre
- 跳过其所在节点的编译过程
- 可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译
<div id="root">
<h2 v-pre>Vue好难</h2>
<h2>当前的n值是:{{n}}</h2>
<button @click="n++">点我n+1</button>
</div>
自定义指令
一、定义语法
- 局部指令
new Vue({
directives:{ 指令名:配置对象 }
})
new Vue({
directives(){指令名:回调函数}
}) - 全局指令
Vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数)
二、配置对象中常用的3个问题
- bind:指令与元素成功绑定时调用
- inserted:指令所在元素被插入页面时调用
- update:指令所在模版结构被重新解析是调用
三、备注
- 指令定义时不加v-,但使用时要加
- 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名
<body>
<!-- 需求1:定义一个v-big 指令,让被绑定的元素数值放大十倍
需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点 -->
<div id="root">
<h2>当前n值是:<span v-text="n"></span></h2>
<h2>放大十倍后的值是:<span v-big="n"></span></h2>
<!-- <h2>放大十倍后的值是:<span v-big-number="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;
new Vue({
el: '#root',
data: {
n: 1
},
directives: {
// big函数什么时候会被调用:1.指令绑定的时候(一开始),2.指令所在模板被重新解析的时候
big(element,binding){
element.innerText = binding.value * 10
},
// 'big-number'(element, binding) {
// 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>