vue实例
1.创建vue实例:
(1)引入vue
(2)定义作用范围
(3)实例化vue
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 1、引入vue:
注意:引入vue有三种方式:
1)、CDN方式
2)、本地方式
3)、npm命令安装vue: npm i vue@2
-->
<script src="../../vue.js"></script>
</head>
<body>
<!-- 2、定义vue的作用范围 -->
<div id="app">
<div>电话: {{tel}}</div>
<div>商品价格:<input v-model="price" type="text"></div>
<div>商品数量:<input v-model="num" type="text"></div>
<div>总价:{{price*num}}</div>
</div>
<p>{{tel}}</p>
<!-- 3、创建vue实例 -->
<script>
new Vue({
el: '#app', //挂载点
data: { //定义数据:这里的数据通常是ajax请求返回的接口数据
tel: 10086,
price: 99,
num: 2
}
});
</script>
</body>
2.el:挂载点
(1)如果定义了多个vue实例的使用范围则默认只有第一个使用范围有效。
(2)不能将vue实例挂载到body或html标签上。
(3)一个页面最好只定义一个vue实例。
3.data和methods
data:数据,这里的数据通常是通过ajax请求的服务端的接口数据;
methods:方法,这里用来定义事件的方法
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 1、引入vue:
注意:引入vue有三种方式:
1)、CDN方式
2)、本地方式
3)、npm命令安装vue: npm i vue@2
-->
<script src="../../vue.js"></script>
</head>
<body>
<!-- 2、定义vue的作用范围 -->
<div id="app">
<!-- <div class="app"> -->
<div>电话: {{tel}}</div>
<div>商品价格:<input v-model="price" type="text"></div>
<div>商品数量:<input v-model="num" type="text"></div>
<div>总价:{{price*num}}</div>
<hr>
<p>{{goodsArr}}</p>
<div>商品名称:{{goodsArr[1].gname}}</div>
<!-- 调用方法时如果没有传参则可以省略圆括号 -->
<div><button v-on:click="mydemo">请单击我</button></div>
<div><button v-on:click="test(30)">请再单击我</button></div>
</div>
<p>{{tel}}</p>
<!--
<div id="app2">
<div>姓名:{{usr}}</div>
</div> -->
<!-- <div class="app">
<div>电话:{{tel}}</div>
</div> -->
<!-- 3、创建vue实例 -->
<script>
// new Vue({
// el: '#app2',
// data: {
// usr: '老六'
// }
// });
new Vue({
//注意:
//1)如果定义了多个vue实例的使用范围则默认只有第一个使用范围有效;
//2)不能将vue实例挂载到body或html标签上
el: '#app', //挂载点
//el: '.app', //挂载点
// el: 'body',
methods: { //定义方法
// mydemo: function() {
mydemo() { //es6的简写形式
alert('hello');
},
test(n) {
alert(100 + n);
}
},
data: { //定义数据:这里的数据通常是ajax请求返回的接口数据
tel: 110,
price: 38,
num: 3,
goodsArr: [{
id: 1,
gname: '华为手机',
price: 3000
}, {
id: 2,
gname: '笔记本电脑',
price: 6600
}]
}
});
</script>
</body>
4.{{}} 模板语法
{{}} 可以用来解析数据、调用函数、运算。
注意:{{}}中的语法要遵守javascript代码语法、{{}}只能使用于非表单元素,如:div、p、h1-h6 、ul li等。
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 1、引入vue -->
<script src="./vue.js"></script>
</head>
<body>
<!-- 2、定义vue的使用范围 -->
<div id="app">
<div>姓名为:{{uname}}</div>
<div>{{'姓名:'+uname}}</div>
<div>手机号码:{{mobile.slice(0,3)+'****'+mobile.slice(7)}}</div>
</div>
<script>
//3、创建vue实例
new Vue({
el: '#app',
data: {
uname: '老六',
mobile: '13688889999'
}
});
</script>
</body>
vue指令
标签属性以v-开头的称为指令
非表单元素绑定数据:
非表单元素是指:div标签、p标签、span标签、ul/li标签、ol/li标签等
{{}}: 优点:使用简单 缺点:不能解析html代码、会出现闪屏问题
v-text: 优点: 不会出现闪屏问题 缺点:不能解析html代码
v-html: 优点:可以解析html代码、不会出现闪屏问题
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!--
闪屏问题:是指当vue.js文件因为网络慢或服务器卡的时候导致vue.js文件不能加载到用户本地,这时使用{{}}解析的数据会原样出现到屏幕上,如果vue.js文件后来又成功加载到用户本地时使用{{}}解析的数据则会正常解析了
-->
<!-- <script src="./vue.js"></script> -->
</head>
<body>
<div id="app">
<h4>{{}}</h4>
<div>姓名为:{{uname}}</div>
<p>{{desc}}</p>
<h4>v-text</h4>
<p v-text="'姓名为:'+uname"></p>
<div v-text="desc"></div>
<h4>v-html</h4>
<div v-html="'姓名:'+uname"></div>
<div v-html="desc"></div>
</div>
<script>
new Vue({
el: '#app',
data: {
uname: '小明',
}
});
</script>
表单元素绑定数据:
表单元素是指:输入框、密码框、单/复选框、下拉列表、文本域。
v-mode
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./vue.js"></script>
</head>
<body>
<div id="app">
<h3>修改用户信息</h3>
<div>昵称:<input v-model="userObj.nicheng" type="text"></div>
<p>{{userObj.nicheng}}</p>
<div>邮箱:<input v-model="userObj.email" type="text"></div>
<div>电话:<input v-model="userObj.tel" type="text"></div>
<div><button v-on:click="modify">修改</button></div>
</div>
<script>
new Vue({
el: '#app',
methods: {
modify() {
console.log(this.userObj, 11111);
// alert('修改');
// $.ajax({
// url: '',
// data: this.userObj,
// // data: {
// // nicheng: this.nicheng ,
// // email: this.email ,
// // tel: this.tel
// // },
// dataType: 'json',
// success() {}
// });
}
},
data: {
// nicheng: 'demo',
// email: 'demo@qq.com',
// tel: 110
userObj: {
nicheng: 'demo',
email: 'demo@qq.com',
tel: 110
}
}
});
</script>
</body>
属性绑定
v-bind可以简写为冒号(:)。
v-bind指令既可以给预定义的属性绑定数据也可以给自定义的属性绑定数据。
v-bind
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./vue.js"></script>
</head>
<body>
<div id="app">
<p><a xy="100" v-bind:href="urls">跳转</a></p>
<!-- v-bind可以简写为冒号 -->
<div><img :curuid="uid" v-bind:src="imgurl" alt=""></div>
<!-- v-bind也可以给自定义的属性绑定数据 -->
<div><img v-bind:curuid="uid" v-bind:src="imgurl" alt=""></div>
</div>
<script>
new Vue({
el: '#app',
data: {
uid: 321, //用户id
urls: 'https://www.baidu.com',
},
methods: {
}
});
</script>
</body>
一次性绑定
当数据只想在界面中渲染一次时可以使用一次性绑定。
v-once
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="../../vue.js"></script>
</head>
<body>
<div id="app">
<div>电话:<input v-model="tel" type="text"></div>
<p>{{tel}}</p>
<!-- 一次绑定 -->
<div v-once>{{tel}}</div>
</div>
<script>
//创建Vue实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
tel: 110
},
methods: {}
});
</script>
</body>
事件绑定
v-on的语法:v-on:事件名="方法名"
v-on的简写形式为:@事件名
v-on
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="../../vue.js"></script>
</head>
<body>
<div id="app">
<!-- v-on的简写形式为:@事件名 -->
<div><button @click="mytest">单击我111</button></div>
<div><button v-on:click="mytest">单击我</button></div>
<div><input v-on:keydown="demo" type="text" placeholder="请输入邮箱"></div>
</div>
<script>
//创建Vue实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {},
methods: {
demo() {
console.log('按键了...');
},
mytest() {
alert('Hello...');
}
}
});
</script>
</body>
条件渲染
v-if与v-show的区别:
1)、v-if如果有多个分支判断时代码之间要连续、中间不能有其他代码;
2)、如果v-if的条件值为false时则DOM元素直接消失,而v-show是通过display:none来控制DOM元素不显示/显示;
v-if v-else-if v-else
v-show
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="../../vue.js"></script>
<style>
.box {
width: 200px;
height: 200px;
border: 1px solid blue;
margin: 10px;
}
.box2 {
width: 200px;
height: 200px;
border: 1px solid red;
margin: 10px;
}
</style>
</head>
<body>
<div id="app">
<p v-if="score>=80">优秀</p>
<!-- 注意: v-if如果有多个分支判断时代码之间要连续、中间不能有其他代码 -->
<!-- <span>测试一下</span> -->
<p v-else-if="score>=60">一般</p>
<p v-else>不及格</p>
<!-- <div><button @click="toggles">切换</button></div> -->
<div><button @click="isShow=!isShow">切换</button></div>
<div><button @click="isShow2=!isShow2">切换2</button></div>
<div v-if="isShow" class="box"></div>
<div v-show="isShow2" class="box2"></div>
</div>
<script>
//创建Vue实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
score:78,
isShow: true,
isShow2: true
},
methods: {
toggles() { //
//this指向当前Vue实例
// console.log(this);
//console.log(this.isShow, 999);
this.isShow = !this.isShow;
}
}
});
</script>
</body>
列表渲染
v-for可以遍历对象或数组,在使用v-for时要定义key属性并且要保证key属性的属性值为唯一的,这样可以提高渲染效率。
v-for key
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="../../vue.js"></script>
</head>
<body>
<div id="app">
<table border="1" cellspacing="0" width="40%">
<tr>
<td>序号</td>
<td>姓名</td>
<td>邮箱</td>
<td>电话</td>
<td>操作</td>
</tr>
<!-- <tr v-for="item in stuArr"> -->
<tr v-for="(item,ind) in stuArr" :key="item.id">
<td>{{ind+1}}</td>
<td>{{item.xingming}}</td>
<td>{{item.email}}</td>
<td>{{item.tel}}</td>
<td><button @click="changname(ind)">将姓名改为小明</button> <button @click="delone(ind)">删除</button></td>
</tr>
</table>
<p>商品名称:{{goodsObj.gname}}</p>
<div v-text="'商品名称为:'+goodsObj.gname"></div>
<!-- v-for:遍历对象 -->
<p v-for="x in goodsObj">{{x}}</p>
<p v-for="(item,key) in goodsObj" :key="key">{{item}}|{{key}}</p>
</div>
<script>
//创建Vue实例,得到 ViewModel
var vm = new Vue({
el: '#app',
methods: {
delone(n) { //删除一个学生
this.stuArr.splice(n, 1);
},
changname(n) { //修改姓名
this.stuArr[n].xingming = '小明';
// console.log(this.stuArr[n], n);
}
},
data: {
stuArr: [{
id: 11,
xingming: "老六",
email: "liu@qq.com",
tel: 110
}, {
id: 12,
xingming: "八戒",
email: "qi@163.com",
tel: 119
}, {
id: 16,
xingming: "唐僧",
email: "tangseng@qq.com",
tel: 123
}],
goodsObj: {
id: 1,
gname: '华为手机',
price: 4000
}
}
});
</script>
</body>
动态类名
:class="变量"
:class="三目运算符"
:class="{类名1:true,类名2:false,... }"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="../../vue.js"></script>
<style>
.trbg {
background-color: aquamarine;
}
.box1 {
float: left;
width: 150px;
height: 150px;
border: 1px solid red;
margin: 10px;
background-color: blueviolet;
}
.box2 {
float: left;
width: 150px;
height: 150px;
border: 1px solid blue;
margin: 10px;
background-color: green;
}
.box3 {
float: left;
width: 150px;
height: 150px;
border: 1px solid blue;
margin: 10px;
background-color: yellow;
}
</style>
</head>
<body>
<div id="app">
<p><button @click="changclass">切换样式</button></p>
<div :class="classname"></div>
<div :class="{box1:ind%3==0,box2:ind%3==1,box3:ind%3==2}" v-for="(item,ind) in goodsArr" :key="item.id">
<h3>商品名称:{{item.gname}}</h3>
<div>价格:{{item.price}}</div>
</div>
<table border="1" width="30%" cellspacing="0">
<tr>
<td>充号</td>
<td>商品名称</td>
<td>价格</td>
</tr>
<tr :class="ind%2==1?'trbg':''" v-for="(item,ind) in goodsArr" :key="item.id">
<td>{{ind+1}}</td>
<td>{{item.gname}}</td>
<td>{{item.price}}</td>
</tr>
</table>
</div>
<script>
//创建Vue实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
classname: 'box1',
goodsArr: [{
id: 1,
gname: '苹果',
price: 5000
}, {
id: 2,
gname: '梨',
price: 6
}, {
id: 3,
gname: '香蕉',
price: 10
}, {
id: 4,
gname: '西瓜',
price: 7
}, {
id: 5,
gname: '西瓜',
price: 7
}, {
id: 6,
gname: '西瓜',
price: 7
}]
},
methods: {
changclass() {
this.classname = 'box2';
}
}
});
</script>
</body>
</html>
单页面(SPA)和多页面(MPA)的区别
单页面(SPA) | 多页面(MPA) | |
刷新方式 | 页面局部刷新或更改 | 整页刷新 |
url 模式 | ||
用户体验 | 页面片段间的切换快,用户体验良好 | 页面切换加载缓慢,流畅度不够,用户体验比较差 |
转场动画 | 容易实现 | 无法实现 |
数据传递 | 容易 | 依赖 url传参、或者cookie 、localStorage等 |
搜索引擎优化(SEO) | 需要单独方案、实现较为困难、不利于SEO检索 ,可利用服务器端渲染(SSR)优化 | 实现方法简易 |
适用范围 | 高要求的体验度、追求界面流畅的应用 | 适用于追求高度支持搜索引擎的应用 |
开发成本 | 较高,常需借助专业的框架 | 较低 ,但页面重复代码多 |
维护成本 | 相对容易 | 相对复杂 |