此笔记是2020年11月16日开始学习Vue敲得笔记,由有道云笔记开始转移到CSDN。方便自己查看,随时回忆。
一.v-bind指令,是用来绑定属性的
a: 基本介绍
b. v-bind动态绑定 class
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.active{
border: red 3px solid;
}
</style>
</head>
<body>
<div id="app">
<!-- 操作元素中的某个属性,可以使用 v-bind -->
<img v-bind:src="imgSrc" alt="">
<!-- 简写就是直接 : 就可以,当操作 clss 属性的时候,可以使用三元表达式 -->
<!-- "isActive?'active'" 意思: 如果isActive为真,那么加active-->
<img :src="imgSrc" alt="" :title="imgTitle" :class="isActive?'active':''" @click='changeClick'>
<!-- 通过对象来操作 class,"{ active:isActive }" 如果 isActive为真,那么添加acitve ,如果某个class是确定不变的,那么可以写死,最后会自动合并-->
<img :src="imgSrc" alt="" :title="imgTitle" class="title" :class="{ active:isActive }" @click='changeClick'>
<!--数组语法 可以将class 放在数组中进行绑定,如果类名较多,可以绑定在 methods的函数中-->
<img :src="imgSrc" alt="" class="active" :class="[sun, li]">
<img :src="imgSrc" alt="" class="active" :class="getClasses()">
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
imgSrc: "https://tse1-mm.cn.bing.net/th/id/OIP.CUhQzmHXj3F-UhhFIdQoUgHaEx?pid=Api&rs=1",
imgTitle: '小傻子',
isActive: false,
sun: 'aaa',
li: 'bbb',
},
methods: {
changeClick: function(){
this.isActive = !this.isActive
},
// 数组动态绑定class对象
getClasses: function(){
return [this.sun, this.li]
}
}
})
</script>
<!--
v-bind总结:
作用:为元素绑定属性
完整写法: v-bind:属性名
简写: 省略 v-bind 只保留 :属性名
如果操作的是 class属性,那么更建议使用对象写法来操作
-->
</html>
c.动态绑定style属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!--对象语法-->
<!-- <h2 :style="{key(属性名):value(属性值)}">{{message}}</h2>-->
<h2 :style="{fontSize:size + 'px'}">{{message}}</h2>
<!-- 数组语法, 本质上绑定的还是数组-->
<h3 :style="[baseStyle]">{{message}}</h3>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: "你好!",
size: 100,
baseStyle: {backgroundColor: 'red'},
}
})
</script>
</body>
</html>
二、Mustche语法(双大括号语法,最常用的语法)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
{{message}}
<!-- Mustache 语法:又称为双大括号。 -->
<!-- 不仅可以直接写变量,还可以写简单的表达式-->
<p>{{firstname + lastname}}</p>
<p>{{firstname + " " + lastname}}</p>
<p>{{firstname}} {{lastname}}</p>
<p>{{ count * 2 }}</p>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: "你好!",
firstname: '孙',
lastname: '博',
count: 100,
}
})
</script>
</body>
</html>
三、v-once指令(元素只允许渲染一次)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{message}}</h2>
<!-- v-once 指令,可以使元素只渲染第一次的数据,不随着数据的变化而变化-->
<h2 v-once>{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: "你好!1"
}
})
</script>
<!--
v-once:
该指令后面不需要跟任何表达式
该指令表示元素和组件之渲染一次,不会随着数据的变化而变化
-->
</body>
</html>
四、v-pre指令(不对数据进行渲染,按照html标签内容原样渲染)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{message}}</h2>
<!-- 不进行解析,原样显示到浏览器 -->
<h2 v-pre>{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: "你好!"
}
})
</script>
</body>
</html>
五、v-cloak指令(js文件未能加载完毕,导致一些元素未经渲染显示在页面上,使用该指令可以防止出现,)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
[v-cloak]{
display: none;
}
</style>
</head>
<body>
<!-- v-cloak:当js文件因为某些原因未能顺利加载完毕,导致一些元素未经过渲染直接在页面上显示,
不太友好,使用 v-cloak指令,可以让未经过渲染的元素不会在页面上显示。
-->
<div id="app" v-cloak>
{{message}}
</div>
<script src="../js/vue.js"></script>
<script>
setTimeout(function(){
const app = new Vue({
el: '#app',
data: {
message: "你好!"
}
})
}, 2000)
</script>
</body>
</html>
六、v-model双向绑定(可以实现表单元素和绑定数据的同步修改)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>获取和设置表单元素的值(双向数据绑定)</title>
</head>
<body>
<div id="app">
<!-- 当我们通过点击事件,修改message的值的时候,此时表单元素的值也会同步更新 -->
<input type="button" value="修改message" @click='setM'>
<!-- 通过 v-model 可以获取到表单元素的值,也可以 -->
<input type="text" v-model="message" @keyup.enter="getM">
<!-- 当我们修改表单元素的值,此时绑定数据的值也会同步修改 -->
<h3>{{ message }}</h3>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
message: "小黑黑"
},
methods: {
getM:function(){
alert(this.message)
},
setM:function(){
this.message="夏尔或"
}
}
})
</script>
<!--
v-model 总结:
作用是: 便捷的设置和获取表单元素的值;
绑定的数据会和表单元素值相关联
绑定的数据 《---》 表单元素的值
当我们去修改任何一个值的时候,另外一个值都会同步的更新,这就是双向绑定
切记: 这是表单元素的值!!
-->
</html>
七、v-on 事件绑定(点击事件之类的触发方法或者属性)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>v-on绑定事件</title>
</head>
<body>
<div id="app">
<input type="button" value="事件绑定" v-on:click='doIt'>
<!-- <input type="button" value="事件绑定" v-on:monseenter='dolt'> -->
<!-- <input type="button" value="事件绑定" v-on:dblclick='dolt'> -->
<input type="button" value="事件简写" @click='doIt'>
<!--
标准写法: v-on 进行绑定事件
简写: @
当我们绑定事件的时候,通过 methods 来进行绑定,在 methods中定义方法,然后绑定方法名就可以
-->
<h2 @click='changeFood'>{{ food }}</h2>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app= new Vue({
el: '#app',
data: {
food: '小鸡蛋'
},
methods: {
doIt: function(){
alert('做的')
},
// 定义方法,html标签绑定事件,触发方法
// 当我们想要获取某个标签中的数据的时候,可以通过 this.数据名 的方式来获取对应的数据,然后进行修改
// 数据驱动型,不用关注 dom 元素,而只需要关注数据本身就可以。
changeFood: function(){
this.food += '好吃呀!'
}
},
})
</script>
<!--
v-on 总结:
作用: 为元素绑定事件
时间名不需要写 on
指令可以简写为 @
绑定的方法定义在monthods属性中
-->
</body>
</html>
v-on 自定义传参和事件修饰符
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>v-on补充:传递自定义参数,事件修饰符</title>
</head>
<body>
<div id="app">
<!-- 传递自定义参数,和python一样 -->
<input type="button" value="点击" @click="doIt(666, 456)">
<!-- 事件修饰符, 通过 . 语法来绑定触发事件 -->
<input type="text" @keyup.enter= "sayHi('sss')">
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app =new Vue({
el: "#app",
methods: {
doIt:function(p1, p2){
console.log('123');
console.log(p1, p2)
},
sayHi:function(p3){
alert(p3)
}
}
})
</script>
<!--
v-on 补充:
事件绑定的方法携程 函数调用 的形式,可以传入自定义参数;
定义方法时需要定义形参来接受传入的参数
事件的后面跟上 .修饰符 可以对事件进行限制
.enter 可以限制触发的按键为回车键
事件修饰符有很多种
-->
</html>
八、v-for 指令 (处理数组,渲染到页面上)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<button @click="add">添加</button>
<button @click="remove">删除</button>
<ul>
<li v-for="(item, index) in arr">{{ index }}-{{ item }}</li>
</ul>
<-- 对象的话可以通过 .语法来获取其属性值 -->
<h3 v-for="item in ver">
{{ item.name }}
</h3>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
arr: [1, 2, 3, 4, 5, 6, 7],
ver: [
{name: '茄子'},
{name: '鸡蛋'}
]
},
methods: {
add:function(){
this.ver.push({ name: '黄瓜' })
},
remove:function(){
this.ver.shift()
}
}
})
</script>
<!--
v-for 总结:
作用: 根据数据生成列表结构
数组经常和 v-for结合使用
语法是 (item, index) in 数据
item 和 index 可以结合其他指令一起使用
数组长度的更新会同步到页面上,是响应式的
-->
</html>
九、v-text指令(结合data数据动态渲染,但是会覆盖元素内部的数据,一般直接会使用 双大括号语法)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue指令:v-text</title>
</head>
<body>
<div id="app">
<!-- 通过 v-text 指令,可以将 data数据赋值给对应的指令,但是会覆盖其内部所有的数据,设置的是行间属性 -->
<!-- 默认写法 -->
<h2 v-text='message'></h2>
<!-- 字符串拼接,行间数据拼接 -->
<h3 v-text="info + '!'"></h3>
<!-- 差值表达式写法,可以单独赋值,不影响其他数据的渲染 , 也可以进行字符串拼接等等 -->
<h4>{{ mes + '!!' }}<span>这里的内容不影响</span></h4>
</div>
</body>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
message: '行间设置,全部覆盖',
info: '字符串拼接',
mes: '插值表达式'
}
})
// v-text指令的总结:
// 作用是 设置标签的内容 textContent
// 默认写法会替换全部内容,使用差值表达式 {{}} 可以替换指定内容
// 内部支持写表达式
</script>
</html>
十、v-if 指令(操作元素的增删,性能影响较大。应用于不常用的操作。)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<!-- v-if 是操作的元素增删,应用于不常用的操作 -->
<p v-if='isShow'>小黑黑</p>
<!-- v-show 操作的是 display样式,常用的元素操作使用,性能影响较小 -->
<p v-show='isShow'>小baibai</p>
<button @click='changeIsShow'>切换</button>
<!-- 可以使用逻辑表达式进行判断 -->
<h2 v-if="temp>=35">好热</h2>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data:{
isShow: false,
temp: 20,
},
methods: {
changeIsShow:function(){
this.isShow = !this.isShow
}
},
})
</script>
<!--
v-if 总结:
1. 作用: 根据表达式的真假切换元素的显示状态
2.本事是通过操纵 dom 元素来切换显示状态
3. 表达式的值为true ,元素存在与dom树中,为 false 从dom树中移除
4. 频繁切换状态的使用 v-show,反之使用 v-if, 前者的切换对性能影响较小
-->
</html>
十一、v-show指令(通过控制器style的display来控制元素的显示状态,常用操作状态使用v-show)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>v-show</title>
</head>
<body>
<div id="app">
<img src="./222.PNG" v-show='isFalse' alt="">
<button @click='changeisShow'>点击切换</button>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
isFalse: true, // 如果是 false 那么元素就会隐藏
},
methods: {
changeisShow: function(){
this.isFalse = !this.isFalse // 取反 !来切换元素的真假
}
}
})
</script>
<!--
v-show 总结:
1. 作用: 根据真假来切换元素的显示状态
2. 原理就是通过修改元素的display状态来实现元素的隐藏
3. 指令后面的内容,最后会被解析成 布尔值
4. 值为 true 元素显示, 值为 false 元素隐藏
5. 数据改变之后,对应元素的显示状态会同步更新
-->
</html>
十二、v-html指令(动态解析data数据中的html文本,渲染到页面上)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<!-- v-text 只能解析成文本格式 -->
<h3 v-text="content"></h3>
<!-- v-html 可以将html文本解析成 html结构 -->
<h4 v-html='content'></h4>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
// content: '小黑黑'
content: "<a href='#'>百度哈哈</a>"
}
})
</script>
<!--
v-html指令总结:
1.设置元素的 innerHtml
2.内容中有html结构会被解析成标签
3.v-text指令无论内容是什么,只会解析成文本
4.解析文本使用 v-text,需要解析 html结构使用 v-html
-->
</html>