VUE基础
VUE入门
VUE
核心概念,不让用户操作DOM元素,让程序员可以更多的关注业务逻辑!(能帮我们减少不必要的DOM操作,提高渲染效率,双向数据绑定)
MVVM
M是界面的数据 V就是前端界面 VM是一个调度者,调度M和V之间的数据交换
<!DOCTYPE html>
<html>
<head>
<title>VUE入门</title>
<script src="vue.js"></script>
</head>
<body>
<div id="zx125"></div>
<script type="text/javascript">
new Vue({
el:"#zx125",
template:'<p>{{zx}}</p>',
data:{
zx:"HELLO VUE"
}
})
</script>
</body>
</html>
渐进式
Vue可以根据开发者的实际需求来不断渐进,而不是一口气全部用上
挂载点
1.挂载点只检索页面中第一个匹配到的结果,所以挂载点一般都才有id选择器
2.html与body标签不可以作为挂载点
创建vue实例(new Vue)传进去的字典(对象)的key,称之为vue实例成员(变量)
访问实例成员,用 vue实例.$成员名, eg:app.$el
默认.取值,取得就是data里面的值
console.log(zx.$data.zx);
console.log(zx.zx);
$el为html的元素
let zx = new Vue({
el: '#app',
data:{
zx:'zx125'
}
});
console.log(zx);
console.log(zx.zx);
console.log(zx.$el);
console.log(zx.$data);
console.log(zx.$data.zx);
vue事件
methods就是vue实例提供的事件函数,函数里面的this就是vue实例(注意是methods里面的this)
let zx = new Vue({
el: '#app',
data:{
zx:'zx125'
},
methods:{
fn:function () {
this.zx='点击'
},
fn1:function () {
this.zx='移到button'
},
fn2:function () {
this.zx='移出button'
}
}
});
事件指令
事件可以简写成事件指令
v-on:事件名:"事件函数" = @事件名=“事件函数”
<!--绑定的事件函数如果没有传递参数,默认传入 事件对象 -->
<p @click="z1">1</p>
如果指定了参数,事件对象要要手动传入
<p @click="z2(100)">2</p>
手动传入
<p @click="z3(100,$event)">3</p>
z1:function(ev){
console.log(ev)
},
z2:function(num,){
console.log(num);
},
z3:function(num,ev){
console.log(num);
console.log(ev);
},
文本指令
{{}},变量由data提供
{{msg}}
{{msg + "文本拼接"}}
{{msg[1]}} 索引取值
{{msg.slice(2,4)}}切片取值
<!-- v-text:将所有内容做文本渲染 -->
<p v-text="msg + '拼接内容'"></p>
<!-- v-html:可以解析html语法标签的文本 -->
<p v-text="'<b>' + msg + '</b>'"></p> = <b>文本信息</b>
<p v-html="'<b>' + msg + '</b>'"></p> = 加粗 文本信息
#注意这里使用的是反的单引号
<p v-text="`<b>${msg}</b>`"></p> = <b>文本信息</b>
<p v-html="`<b>${msg}</b>`"></p> = 加粗 文本信息
属性指令
1.标签
2.样式(style)
<div id="app">
#属性指令:v-bind:属性名="变量",简写方式 :属性名="变量"
<div class="b1" id="b1" v-bind:title="title" :abc="xyz"></div>
#属性指令操作 style 属性
<div style="width: 200px;height: 200px;background-color: greenyellow"></div>
#通常:变量值为字典
<div :style="mys1"></div>
了解:{中可以用多个变量控制多个属性细节}
<div :style="{width: w,height: '200px',backgroundColor: 'deeppink'}"></div>
#重点:一般vue都是结合原生css来完成样式控制
<!--<div :class="c1"></div>-->
<!--class可以写两份,一份写死,一份有vue控制-->
<div class="box1" :class="c2"></div>
<!--{}控制类名,key为类名,key对应的值为bool类型,决定该类名是否起作用-->
<div :class="{box2:true, circle:cable}" @mouseover="changeCable(1)" @mouseout="changeCable(0)"></div>
<!--[]控制多个类名-->
<div :class="[c3, c4]"></div>
</div>
过滤器
可以对变量进行过滤,可以过滤多次该可以同时过滤多个变量,并传递变量
<div id="app">
<p>{{ zx }}</p>
<p>{{ msg }}</p>
<button v-on:click="fn" v-on:mouseover="fn1" v-on:mouseout="fn2">按钮</button>
<p>{{ wl | f1 }}</p>
<p>{{ wl | f1 | f2}}</p>
<p>{{ wl,zx| f3}}</p>
<p>{{ wl,zx | f4(100,200) }}</p>
</div>
filters:{
f1(num){
return num*2
},
f2(num){
return num/99
},
f3(num1,num2){
return num1+num2
},
f4(num1,num2,num3,num4){
return num1+num2+num3+num4
}
},
198
2
99zx125
99zx125100200
表单指令
主要是关联表单的数据,如果是单选,多选的话关联表单的选中状态(通过标签的value来关联)
<div id="app">
#普通表单
<input type="text" v-model="zx1">
#单选
<input type="checkbox" name="agree" v-model="zx2">
#复选
<input type="checkbox" name="hobby" value="paly" v-model="zx3">
<input type="checkbox" name="hobby" value="eat" v-model="zx3">
#多项单选
<input type="radio" name="sex" value="man" v-model="zx4">
<input type="radio" name="sex" value="women" v-model="zx4">
</div>
<script>
new Vue({
el:'#app',
data:{
zx1:'我是数据',
zx2:true,
zx3:['eat','paly'],
zx4:'man'
}
})
</script>
斗篷指令
其实就是防止,界面出现的时候,页面的模板出现还没有被渲染的模板语法,其实也可以把vue.js的引入放到顶上解决这个问题
<style>
[v-cloak] {
display: none;
}
</style>
<div id="app" v-cloak>
<p>{{ msg }}</p>
</div>
条件指令
注意
1.if和show的区别,为false,if标签是不会再前端渲染的,但是show的话,是在前端渲染的,只是样式为display:none,只是不显示而已
2.if和elseif,else联用的话,当上面有满足条件的的时候,就不会渲染下面分支的内容,当上面所有的分支都不满足,才会满足else分支而且else分支不需要条件的
<div id="app">
<p v-if="false">我是if指令</p>
<p v-show="false">我是show指令</p>
<p v-if="true">我是if指令</p>
<p v-show="true">我是show指令</p>
<p v-if="zx == '1' ">我是if指令</p>
<p v-show="zx === '1' ">我是show指令</p>
<p v-if="zx === '1'">if分支</p>
<p v-else-if="zx === '2'">elif分支1</p>
<p v-else-if="zx === '3'">elif分支2</p>
<p v-else>else分支</p>
</div>
new Vue({
el: '#app',
data: {
zx: '1',
}
})
案例
功能:点击显示不同的颜色块,点击的按钮显示点击的状态,刷新不重置(保存显示状态)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<style>
.box {
width: 400px;
height: 200px;
}
.r {
background-color: red
}
.y {
background-color: yellow
}
.g {
background-color: green
}
.action {
background-color: pink;
}
span{
width: 30px;
height: 30px;
}
</style>
</head>
<body>
<div id="app">
<p>
<span @click="changeC('red')" :class="{action: c === 'red'}">红</span>
<span @click="changeC('yellow')" :class="{action: c === 'yellow'}">黄</span>
<span @click="changeC('green')" :class="{action: c === 'green'}">绿</span>
</p>
<div class="wrap">
<div class="box r" v-if="c === 'red'"></div>
<div class="box y" v-else-if="c === 'yellow'"></div>
<div class="box g" v-else></div>
</div>
</div>
</body>
<script>
new Vue({
el: '#app',
data: {
c: localStorage.c ? localStorage.c : 'red',
},
methods: {
changeC(color) {
this.c = color;
// 每一次改变c的值,将值同步到前台数据库
localStorage.c = color; // 存
}
}
})
</script>
</html>
解析
#action类,满足条件才有
<button @click="changeC('red')" :class="{action: c === 'red'}">红</button>
#浏览器的本地数据库,需要手动才能删除
localStorage
#每次点击先改变vue的c值,然后在本地保存一个c=color的值
this.c = color;
localStorage.c = color;
#首先取本地存的c,如果c为空取红色
c: localStorage.c ? localStorage.c : 'red',
循环指令
就是循环拿数据,并且渲染界面
<div id="app">
#字符串
<p><span v-for="v in name">{{ v }}</span></p>
<p><span v-for="(v,i) in name">{{ v }}{{ i }}</span></p>
#对象数据
<p><span v-for="v in zx">{{ v }}</span></p>
<p><span v-for="(v,k) in zx">{{ v }}{{ k }}</span></p>
<p><span v-for="(v,k,i) in zx">{{ v }}{{ k }}{{ i }}</span></p>
#数组对象
<div v-for="(peo,i) in student">
<hr v-if="i != 0">
<p><span v-for="(v,k,i) in peo">{{ v }}{{ k }}{{ i }}</span></p>
</div>
</div>
new Vue({
el: '#app',
data: {
name: '阿萨德',
zx: {
name: 'zx',
age: 18,
sex: 'man'
},
student: [
{
name: 'zx',
age: 18,
sex: 'man'
},
{
name: 'wl',
age: 18,
sex: 'women'
},
{
name: 'zx125',
age: 18,
sex: 'man'
}
]
},
})
案例
输入框提交,动态调加留言,点击留言可以删除
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<style>
</style>
</head>
<body>
<div id="app">
<input type="text" v-model="msg">
<button @click="sub">添加留言</button>
<ul>
<li v-for="(v,i) in comments" @click="del(i)">{{ v }}</li>
</ul>
</div>
</body>
<script>
new Vue({
el: '#app',
data: {
msg:'',
comments:[]
},
methods:{
sub(){
if(this.msg){
//添加留言
this.comments.push(this.msg);
//添加后情况输入框
this.msg = '';
}
},
del(i){
this.comments.splice(i,1)
}
}
})
</script>
</html>
解析
push是在数组后面插入数据
unshift是在数组前面插入数据
// 数组操作万能方法,可以完成增删改
let arr = [1, 2, 3];
// 参数:开始索引,操作长度,操作的结果们
arr.splice(2, 0, 100);[1,2,100,3]
arr.splice(1, 1);[1,100,3]
分隔符成员
可以用来替换默认的表达式符号
<p>{ num ]}</p>
delimiters: ['{', ']}'],
计算属性成员
1、computed中定义的是方法属性,data中定义的也是属性,所以不需要重复定义(省略data中的)
2、方法属性的值来源于绑定的方法的返回值
3、方法属性必须在页面中渲染后,绑定的方法才会被启用(调用)
4、方法中出现的所有变量都会被监听,任何变量发生值更新都会调用一次绑定的方法,重新更新一下方法属性的值
5、方法属性值不能手动设置,必须通过绑定的方法进行设置
<div id="app">
<input type="text" v-model="num1">
+
<input type="text" v-model="num2">
=
<input type="text" v-model="res">
</div>
new Vue({
el: '#app',
data: {
num1:'',
num2:'',
},
computed:{
res(){
//如果num1,num2都有值计算,否则显示提示
return this.num1 && this.num2 ? +this.num1 + +this.num2 : "请填写所有参数"
}
}
})
属性的监听
1、watch中给已有的属性设置监听方法
2、监听的属性值一旦发生更新,就会调用监听方法,在方法中完成相应逻辑
3、监听方法不需要返回值(返回值只有主动结束方法的作用)
<div id="app">
<input type="text" v-model="num1">
<input type="text" v-model="res">
</div>
new Vue({
el: '#app',
data: {
num1:'',
res:''
},
watch:{
num1(){
this.res = this.num1
}
}
})
js的类
es5函数可以作为类使用,es6加入了class来规范类
this哪个对象调用就代表谁
let sex = '女';
let wl = {
name:'wl',
age:22,
#相当于sex=sex
sex
};
console.log(wl);
function Student(name,age) {
this.name = name;
this.age = age;
this.eat = function () {
alert("吃饭饭了");
return '吃完了'
}
}
let zx =new Student('zx125','18');
console.log(zx.name);
console.log(zx.age);