vue官网:https://cn.vuejs.org/
1、v-text
数据类型:string字符串。
给一个标签加了v-text 会覆盖标签内部原先的内容,str中的内容不会显式
<body>
<div id="app">
<h1 v-text="newStr">{{str}}</h1>
</div>
</body>
<script src="./js/vue.min.js"></script>
<script>
new Vue({
el: "#app",
data: {
str: "默认数据",
newStr: "学习Vue指令:v-text"
}
})
</script>
输出结果:
2、v-html
数据类型:string字符串。
双大括号会将数据内容按普通 HTML 插入 - 不会作为 Vue 模板进行编译。v-html更新元素的 innerHTML,内容中有HTML标签结构会将其解析为标签。
<body>
<div id="app">
<h1 v-html="str"></h1>
<h1>{{str}}</h1>
</div>
</body>
<script src="./js/vue.min.js"></script>
<script>
new Vue({
el: "#app",
data: {
str: "<span style='color:red;fong-size:30px';>学习Vue指令</span>"
}
})
</script>
输出结果:
3、v-show
数据类型:Boolean
根据表达式之真假值,显式或者隐藏数据,如果为假v-show给一个display:none的属性 让它不显示!不管条件为真还是假都会加载。
<body>
<div id="app">
<h1 v-show="bol">{{ str}} </h1>
</div>
</body>
<script src="./js/vue.min.js"></script>
<script>
new Vue({
el: "#app",
data: {
str: "学习Vue指令:v-show",
bol: false
}
})
</script>
3.1条件为false,页面不显式,通过F12查看源码,是通过display:none样式隐藏了,无论条件为真还是假都会加载。
4、v-if、v-else-if、v-else
数据类型:Boolean
根据表达式之真假值,显式或者隐藏数据。如果条件为true,代码正常加载;如果条件为false,代码不加载。
<body>
<div id="app">
<h1 v-if="bol">{{ str}}
<h1 v-if="age<10 && age>=5">未成年</h1>
<h1 v-else-if="age>=10 && age<36">青年</h1>
<h1 v-else-if="age>=36 && age<= 60">成年</h1>
<h1 v-else="age>60">老年</h1>
</h1>
</div>
</body>
<script src="./js/vue.min.js"></script>
<script>
new Vue({
el: "#app",
data: {
str: "学习Vue指令:v-if",
bol: true,
age: 20
}
})
输出结果:
通过F12查看源码可以看到,条件为假根本不会加载。
v-show与v-if的区别
- 控制手段不同
- 编译过程不同
- 编译条件不同
控制手段:v-show隐藏则是为该元素添加css–display:none,dom元素依旧还在。v-if显示隐藏是将dom元素整个添加或删除
编译过程:v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;v-show只是简单的基于css切换
编译条件:v-if是真正的条件渲染,它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。只有渲染条件为假时,并不做操作,直到为真才渲染
v-show 由false变为true的时候不会触发组件的生命周期
v-if由false变为true的时候,触发组件的beforeCreate、create、beforeMount、mounted钩子,由true变为false的时候触发组件的beforeDestory、destoryed方法
性能消耗:v-if有更高的切换消耗;v-show有更高的初始渲染消耗;
v-show与v-if的使用场景
v-if 与 v-show 都能控制dom元素在页面的显示
v-if 相比 v-show 开销更大的(直接操作dom节点增加与删除)
如果需要非常频繁地切换,则使用 v-show 较好
如果在运行时条件很少改变,则使用 v-if 较好
5、v-for
基于数据渲染一个列表,类似于JS中的遍历。其数据类型可以是 Array | Object | number | string
该指令之值,必须使用特定的语法(item, index) in items, index是索引,可以省略。item是 为当前遍历元素提供别名(可以自己随便起名字) 。v-for的优先级别高于v-if之类的其他指令
<body>
<div id="app">
<h1>v-for 循环遍历数组array ----> value</h1>
<p v-for="value in arr">{{value}}</p>
<h1>v-for 循环遍历数组array ----> value- ---> index</h1>
<p v-for="(value,index) in arr">{{index}}--->{{value}}</p>
<h1>v-for 循环遍历对象object ----> value</h1>
<p v-for="value in obj">{{value}}</p>
<h1>v-for 循环遍历对象object ----> value- ---> key</h1>
<p v-for="(value,key) in obj">{{key}}--->{{value}}</p>
<h1>v-for 循环遍历对象object ----> value ----> key ----> index</h1>
<p v-for="(value,key,index) in obj">{{index}}--->{{key}}--->{{value}}</p>
<h1>v-for 循环遍历number ----> value</h1>
<p v-for="value in num">{{value}}</p>
<h1>v-for 循环遍历string----> value</h1>
<p v-for="(value,key) in str">{{key+1}}---->{{value}}</p>
</div>
</body>
<script src="./js/vue.min.js"></script>
<script>
new Vue({
el: "#app",
data: {
arr: [1, 2, 3, 4, 5],
obj: {
username: "张三",
age: 20,
sex: "男"
},
num: 10,
str: "123Abc盒子+-*/#@!"
}
})
</script>
输出结果:
6、v-on
绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。
用在普通元素上时,只能监听原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件。
简写 @后面跟上事件,比如:@click、@change
演示的是原生JS的onclick鼠标点击事件,vue将原生JS事件进行的二次封装
<body>
<div id="app">
<h1 v-on:click="demo">{{str}}</h1>
<h1 v-on:click="demo1('bbbbbb')">{{str}}</h1>
<h1 @click="demo2(element)">{{str}}</h1>
<button @click="num++">点赞:</button>
<h1>当前点赞数:{{num}}</h1>
</div>
</body>
<script src="./js/vue.min.js"></script>
<script>
new Vue({
el: "#app",
data: {
str: "学习Vue指令",
element: "ccccc",
num: 0
},
methods: {
demo: function() {
this.str = "aaaaa";
},
demo1(value) {
this.str = value;
},
demo2(value) {
this.str = value;
}
}
})
</script>
点击前输出结果:
点击第一个学习Vue指令,点击一下点赞输出结果:
点击第二个学习Vue指令,点击两下点赞输出结果:
点击第三个学习Vue指令,点击三下点赞输出结果:
7、v-bind
动态绑定属性值
-
缩写**:
:
-
预期:
any (with argument) | Object (without argument)
-
参数:
attrOrProp (optional)
-
用法:
动态地绑定一个或多个 attribute,或一个组件 prop 到表达式。
<body>
<div id="app">
<img v-bind:src="imgs"><br/>
<a :href="obj.url">{{obj.value}}</a>
<h1 :class="{demo:bols}">{{str}}</h1>
</div>
</body>
<script src="./js/vue.min.js"></script>
<script>
new Vue({
el: "#app",
data: {
imgs: "./img/1.gif",
obj: {
url: "https:www.baidu.com",
value: "百度一下"
},
str: "学习Vue指令:v-bind",
bols: false
}
})
</script>
输出结果:
只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。
动态获取表单元素,它是一个语法糖
<div id="app">
<input type="text" v-model="str"><br/>
<h1>{{str}}</h1>
<!-- 单选框 -->
<input type="radio" name="sex" value="man" v-model="sex">男
<input type="radio" name="sex" value="woman" v-model="sex">女
<h1>性别是:{{sex}}</h1>
<!-- 多选框 -->
<input type="checkbox" value="basketball" v-model="hobby">蓝球
<input type="checkbox" value="games" v-model="hobby">游戏
<input type="checkbox" value="wark" v-model="hobby">散步
<h1>爱好是:{{hobby}}</h1>
<!-- select 下拉框-->
<select v-model="city">
<option value="xian ">西安市</option>
<option value="xianyang ">咸阳市</option>
<option value="weinan ">渭南市</option>
<option value="hangzhong ">汉中市</option>
</select>
<h1>所在城市:{{city}}</h1>
<!-- textarea 文本域-->
<textarea cols="60" rows="20" v-model="str"></textarea>
</div>
<body>
**输出结果:** ![在这里插入图片描述](https://img-blog.csdnimg.cn/73a7a0c98428493dae0271f97ee978c6.png) ### 9、v-once 只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。
<!-- 单个元素 -->
<span v-once>This will never change: {{msg}}</span>
<!-- 有子元素 -->
<div v-once>
<h1>comment</h1>
<p>{{msg}}</p>
</div>
<!-- 组件 -->
<my-component v-once :comment="msg"></my-component>
<!-- `v-for` 指令-->
<ul>
<li v-for="i in list" v-once>{{i}}</li>
</ul>
10、v-pre
跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签。跳过大量没有指令的节点会加快编译。
- 示例:
{{ this will not be compiled }}
v-cloak
这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。
- 示例:
[v-cloak] {
display: none;
}
预期:可放置在函数参数位置的 JavaScript 表达式 (在支持的环境下可使用解构)。可选,即只需要在为插槽传入 prop 的时候使用。
参数:插槽名 (可选,默认值是 default)
限用于
组件 (对于一个单独的带 prop 的默认插槽) 用法:提供具名插槽或需要接收 prop 的插槽。
示例:
<!-- 具名插槽 -->
<base-layout>
<template v-slot:header>
Header content
</template>
Default slot content
<template v-slot:footer>
Footer content
</template>
</base-layout>
<!-- 接收 prop 的具名插槽 -->
<infinite-scroll>
<template v-slot:item="slotProps">
<div class="item">
{{ slotProps.item.text }}
</div>
</template>
</infinite-scroll>
<!-- 接收 prop 的默认插槽,使用了解构 -->
<mouse-position v-slot="{ x, y }">
Mouse position: {{ x }}, {{ y }}
</mouse-position>