1、Vue.js 是什么
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
2、引入Vue.js
初学,所以直通过CDN服务器引入vue库
<!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>vue1</title> <!-- 通过CDN服务器引入vue库 --> <script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script> </head>
3、vue在js中语法
<script>
var vm = new Vue({
el : "#app",
data : {
msg : "hello world!!!",
age : 30,
lastName:"wang",
firstName : "zhenling",
fullName : "zhenling wang"
},
//方法
methods : {
getFullName : function(){
return this.firstName + " " + this.lastName
// 必须用this,这里this指vm这个实例
}
}
})
</script>
注意: Vue本身是一个构造函数,new Vue实例化,el指element,通过css选择器选出id为app的元素,data定义内容。最后用{{ msg }}的语法在div里调用,methods定义方法
4、vue在html中的语法一:双括号
<!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>vue1</title>
<!-- 通过CDN服务器引入vue库 -->
<script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{ msg }}
</div>
<script>
new Vue({
el : "#app",
data : {
msg : "hello world!!!",
}
})
</script>
</body>
</html>
②简单表达式
<!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>vue1</title>
<!-- 通过CDN服务器引入vue库 -->
<script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 例如:三目运算符 -->
{{ age > 60 ? "老人" : "青年"}}</br>
<!-- 例如:普通表达式 -->
{{firstName + " " + lastName}}</br>
</div>
<script>
var vm = new Vue({
el : "#app",
data : {
msg : "hello world!!!",
age : 30,
lastName:"wang",
firstName : "zhenling"
}
</script>
</body>
</html>
③函数(即方法)
<!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>vue1</title>
<!-- 通过CDN服务器引入vue库 -->
<script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{ fullName}}</br>
<!-- 例如分别取姓和名,结果[ "zhenling", "wang" ] -->
{{fullName.split(" ")}}</br>
<!-- 例如只取名,结果zhenling-->
{{fullName.split(" ")[0]}}</br>
<!-- 例如只取姓,结果wang-->
{{fullName.split(" ")[1]}}</br>
<!-- 例如:函数执行,不带参数-->
{{ getFullName()}}</br>
<!-- 例如:函数执行,带参数-->
{{ getFullName(firstName,lastName)}}
</div>
<script>
var vm = new Vue({
el : "#app",
data : {
msg : "hello world!!!",
age : 30,
lastName:"wang",
firstName : "zhenling",
fullName : "zhenling wang"
},
//不带参数写法
methods : {
getFullName : function(){
return this.firstName + " " + this.lastName
// 必须用this,这里this指vm这个实例
}
}
//带参数写法
// methods : {
// getFullName : function(first,last){
// return first + " " + last
// }
// }
})
</script>
</body>
</html>
5、Vue在html中的语法二:指令
5.1 v-bind指令
vue指令语法: v-指令名字 + :+ 指令的参数 = 指令的表达式
<!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>Vue</title>
<script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 此处用vue的指令v-bind,绑定href这个属性 -->
<a v-bind:href="url">百度一下</a>
</div>
<script>
//vue指令语法: v-指令名字 + :+ 指令的参数 = 指令的表达式
new Vue({
el : "#app",
data : {
url : "http://www.baidu.com"
}
})
</script>
</body>
</html>
相关练习:
<!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>练习</title>
<script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 输出一个电影的名字和上映日期 -->
电影名:{{movieTitle}}
上映日期:{{movieDate}}
<!-- 判断一部电影是否是新电影,>2000年新,否则老电影 -->
这部电影是 {{getMovie()}} 电影
<!-- title的绑定 -->
<div v-bind:title = "movieTitle">
hover me!!!!
</div>
</div>
<script>
new Vue({
el : "#app",
data :{
movieTitle :"妖猫传",
movieDate : "1999"
},
methods :{
getMovie :function(){
return this.movieDate > 2000 ? "新" : "旧"
}
}
})
</script>
</body>
</html>
5.2 v-on指令
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 普通写法 -->
<!-- <button v-on:click = "showsome">click me!!!</button> -->
<!-- 默认事件 -->
<!-- <button v-on:click = "showsome($event)">click me!!!</button> -->
<!-- 传参写法 -->
<!-- <button v-on:click = "showsome(123123,$event)">click me!!!</button> -->
</div>
<script>
new Vue({
el : "#app",
// 普通写法
// methods : {
// showsome :function(){
// alert("show something")
// }
// }
// 默认事件
// methods : {
// showsome :function(event){
// console.log(event)
// alert("show something")
// }
// }
// 传参写法
methods : {
showsome :function(msg,event){
console.log(msg)
alert("show something")
}
}
})
</script>
</body>
</html>
5.3 修饰符-阻止冒泡.stop
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 阻止冒泡,用事件修饰符.stop -->
<div v-on:click = "showsome(1,$event)">
<button v-on:click.stop = "showsome(123123,$event)">click me!!!</button>
</div>
</div>
<script>
new Vue({
el : "#app",
methods : {
showsome :function(msg,event){
console.log(msg)
alert("show something")
}
}
})
</script>
</body>
</html>
5.4 修饰符-阻止默认事件.prevent
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 阻止默认事件 下例阻止a标签点击跳转的默认事件-->
<a href="http://www.baidu.com" v-on:click.prevent>link me!!</a>
<a href="http://www.baidu.com" v-on:click.prevent="showsome">link me!!</a>
</div>
<script>
new Vue({
el : "#app",
methods : {
showsome :function(msg,event){
console.log(msg)
alert("show something")
}
}
})
</script>
</body>
</html>
5.5 v-on指令的按键修饰符
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-on:keyup.enter = "keyup">
<!-- 按enter时弹出框 -->
<input type="text" v-on:keyup.enter.space = "keyup">
<!-- 按enter或者space时弹出框 -->
</div>
<script>
new Vue({
el : "#app",
methods :{
keyup :function(event){
// if(event.which == 13){
// // 回车键的which属性是13
alert("you pressed enter!!");
// }用按键修饰符,解放以上代码
}
}
})
</script>
</body>
</html>
5.6 v-on指令的系统修饰符
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 系统修饰符shift,和shift同时按下才能触发 -->
<input type="text" v-on:keyup.shift = "keyup">
<button type="text" v-on:click.shift = "keyup">click</button>
<!-- 系统修饰符meta,和window或mac键同时按下才能触发 -->
<button type="text" v-on:click.meta = "keyup">click</button>
</div>
<script>
new Vue({
el : "#app",
methods :{
keyup :function(event){
alert("you pressed enter!!");
}
}
})
</script>
</body>
</html>
5.7 相关练习
<!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>练习</title>
<script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!--通过输入框内容改变输出内容 -->
<input type="text" v-on:keyup = "changeName">
output : {{name}}
<!--通过输入框内容改变输出内容,必须同时按住shift键-->
<!-- 以下两种写法 -->
<input type="text" v-on:keyup.shift = "name = $event.target.value"> <!-- 此处必须用$event -->
output : {{name}}
<input type="text" v-on:keyup.shift = "changeName">
output : {{name}}
<!--阻止action提交内容默认事件-->
<form action="" v-on:submit.prevent>
<input type="submit">
</form>
</div>
<script>
new Vue({
el : "#app",
data :{
name : "hello"
},
methods :{
changeName:function(event){
this.name = event.target.value
}
}
})
</script>
</body>
</html>
5.8 双向数据绑定v-model
复杂写法:v-on+v-bind
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{ value }}
<input type="text" v-bind:value = "value" v-on:input = "input">
<!-- 此处v-bind将js和html里面的数据绑定,js改变html里面的数据 -->
<!-- 此处v-on将html和js里面的数据绑定,改变html的dom节点的数据,就会改变js里面的数据 -->
</div>
<script>
new Vue({
el: "#app",
data: {
value: "wangzhenling",
},
methods:{
input : function(event){
this.value = event.target.value
}
}
})
</script>
</body>
</html>
简单写法:v-model
注意:双向数据绑定简单写法 v-model:实现两步v-bind和v-on
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{ name }}
<input type="text" v-model = "name">
</div>
<script>
new Vue({
el: "#app",
data: {
name:"wangzhenling"
}
</script>
</body>
</html>
5.9 v-model修饰符
①.trim
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{ name }}
<input type="text" v-model.trim = "name">
</div>
<script>
new Vue({
el: "#app",
data: {
name: "wangzhenling"
}
</script>
</body>
</html>
②.number
.number转换成数字类型修饰符
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{ name }}
<input type="text" v-model.number = "name">
</div>
<script>
new Vue({
el: "#app",
data: {
name: "wangzhenling"
}
</script>
</body>
</html>
③.lazy
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{ name }}
<input type="text" v-model.lazy = "name">
</div>
<script>
new Vue({
el: "#app",
data: {
name: "wangzhenling"
}
</script>
</body>
</html>
5.10 v-html指令
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 下面语法输出内容为<h1>hello</h1>-->
{{ html }}
<!-- v-html指令 输出内容为 hello-->
<div v-html = "html"></div>
</div>
<script>
new Vue({
el: "#app",
data: {
html :"<h1>hello</h1>",
message : "wangzhenling"
}
})
</script>
</body>
</html>
5.11 v-once指令
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<div v-once>
<!--有v-once指令,只渲染一次,希望数据有一个初始化值,不希望随着message改变而改变 -->
{{ message }}
</div>
<!-- 此时没有v-once指令,当点击,message值变成123 -->
{{ message }}
<button v-on:click = "message = '123'">click me!!</button>
</div>
<script>
new Vue({
el: "#app",
data: {
html :"<h1>hello</h1>",
message : "wangzhenling"
}
})
</script>
</body>
</html>
5.12 v-if指令
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<p v-if = "items > 10">{{ items }} 个,有现货</p>
<p v-else-if = "items > 1">所剩不多了,快点买吧</p>
<p v-else>没有库存了,请耐心等待</p>
<!-- 同一个条件判断多个语句用templete包裹,且template不会被渲染 ,是html5标签 -->
<template v-if = "items > 50">
<p>注意事项</p>
<p>因为还有很多,现在购买打8折</p>
</template>
</div>
<script>
new Vue({
el: "#app",
data :{
items : 52,
}
})
</script>
</body>
</html>
5.13 v-show指令
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<P v-show = "skill">我发射了技能</P>
<P v-show = "!skill">我不能发射技能</P>
<button v-on:click = "skill = !skill">发射技能</button>
</div>
<script>
new Vue({
el: "#app",
data :{
items : 52,
skill : true
// 或者 skill : false
}
})
</script>
</body>
</html>
5.14 v-cloak指令
<!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>
<style>
/* 当vue库还没加载出来,不显示元素,当vue显示出来,v-cloak会自动消失,以下代码也就不会生效 */
[v-cloak]{
display: none;
}
</style>
</head>
<body>
<div id="app">
<!-- 加入网速很慢,html渲染完,vue.js还没加载完,就会显示不完全,此时需要用v-cloak ,全部加载完,v-cloak消失-->
<div v-cloak>
{{ message }}
</div>
</div>
<script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
<script>
setInterval(function () {
new Vue({
el: "#app",
data: {
message: "wangzhenling"
}
})
}, 3000)
// 借助定时器来看v-cloak的效果
</script>
</body>
</html>
5.15 v-for指令在数组中应用
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h1>电影列表</h1>
<ul>
<!-- 数组 -->
<!-- v-for语法:别名 in 表达式 -->
<li v-for = "title in movies"> {{ title }}</li>
<!-- 带索引 -->
<li v-for = "(title , index) in movies"> {{ title }}({{ index }})</li>
<!-- 下面写法也可以 -->
<li v-for = "(t , i) in movies"> {{ t }}({{ i }})</li>
</ul>
</div>
<script>
new Vue({
el : "#app",
data :{
// 数组
movies : ["妖猫传","芳华","至暗时刻"],
}
})
</script>
</body>
</html>
5.16 v-for指令在对象中应用
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 对象 -->
<table>
<thead>
<td>姓名</td>
<td>教授课程</td>
<td>水平</td>
<td>公司</td>
</thead>
<tbody>
<tr v-for = "person in persons">
<td>{{ person.name }}</td>
<td>{{ person.title }}</td>
<td>{{ person.level }}</td>
<td>{{ company }}</td>
</tr>
</tbody>
</table>
<!-- 对象,带有索引 -->
<table>
<thead>
<td>姓名</td>
<td>教授课程</td>
<td>水平</td>
<td>索引</td>
</thead>
<tbody>
<tr v-for = "(person,index) in persons">
<td>{{ person.name }}</td>
<td>{{ person.title }}</td>
<td>{{ person.level }}</td>
<td>{{ index }}</td>
</tr>
</tbody>
</table>
</div>
<script>
new Vue({
el : "#app",
data :{
// 对象
persons :[{
name : "liu",
title:"vue",
level:3
},
{
name:"cheng",
title:"javascript",
level:4
},
{
name:"wang",
title:"both",
level:10
}],
company:"duyi",
}
})
</script>
</body>
</html>
5.17 v-for指令遍历对象
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- v-for特殊用法 遍历对象的属性值-->
<div v-for = "name in person">
{{ name }}
</div>
<!-- v-for特殊用法 遍历对象的属性值和属性名-->
<div v-for = "(name,prop) in person">
{{ prop }}:{{ name }}
</div>
<!-- v-for特殊用法 遍历对象的属性值和名,带有索引-->
<div v-for = "(name,prop,index) in person">
{{ prop }}:{{ name }}({{ index }})
</div>
</div>
<script>
new Vue({
el : "#app",
data :{
person:{
lastname:"wang",
fastname:"zhenling",
age:10
}
}
})
</script>
</body>
</html>
5.18 v-for指令遍历数字
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 其他用法:遍历数字 -->
<div v-for = "n in 50">
{{ n }}
</div>
<!-- 遍历数字,带索引 -->
<div v-for = "(n,index) in 50">
{{ n }}|{{ index }}
</div>
</div>
<script>
new Vue({
el : "#app"
})
</script>
</body>
</html>
5.19 v-for指令遍历字符串
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 其他用法:遍历字符串 -->
<div v-for = "s in 'wangzhenling'">
{{ s }}
</div>
<!-- 其他用法:遍历字符串,带索引 -->
<div v-for = "(s,index) in 'wangzhenling'">
{{ s }}|{{ index }}
</div>
</div>
<script>
new Vue({
el : "#app"
})
</script>
</body>
</html>
5.20 v-for指令注意事项
①vue.set
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for = "n in numbers">{{ n }}</li>
<button v-on:click= "changeNumber">click me!!</button>
</ul>
</div>
<script>
new Vue({
el : "#app",
data : {
numbers:[1,2,3,4,5]
},
methods :{
changeNumber:function(){
// this.numbers[1] = 10;
// 这种做法不会重新渲染dom节点,因为索引不变,内存地址不会变,原数组不变,是一个js的缺陷
// 下述写法可以重新渲染dom节点,加上索引值,改变了地址,用Vue.set
Vue.set(this.numbers,1,10)
alert(this.numbers[1]);
}
}
})
</script>
</body>
</html>
①push,pop,shift,unshift,reverse,sort,splice,vue进行了重写,可以渲染dom
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<div v-for = "item in persons" v-bind:key = "item.id">
{{ item.name }} {{ item.id }}<input type="text">需
<!-- 加上input框,想要input框和前面的内容一起变化,要绑定一个key值,绑定一个独一无二的值,说明是一一对应的-->
</div>
<button v-on:click = "add">click me!!</button>
<button v-on:click ="reverse" >reverse</button>
</div>
<script>
new Vue({
el : "#app",
data : {
persons:[{
id : 1,
name : "wang"
},{
id : 2,
name : "zhen"
},{
id : 3,
name : "ling"
}]
},
methods :{
add : function(){
// 此时push可以渲染dom,是因为vue底层重写了push方法,模板复用,但是有bug,加上一个input框,input里面的内容不会跟着其他内容一起改变,此时需要要绑定一个key值,
// 重写的方法还包括:push,pop,reverse,sort,shif,unshift,splice
this.persons.push({
id:4,
name: "123"
})
},
reverse:function(){
this.persons.reverse()
}
}
})
</script>
</body>
</html>
5.21 相关练习
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 双向数据绑定 -->
<input type="password" v-model = "passward">
<!-- v-if应用 -->
<p v-if = "chars > 8">你的字符大于8个</p>
<p v-else-if = "chars > 0">你有{{ chars }}个字符</p>
<p v-else>你没有字符</p>
<!-- 列表循环 -->
<ol>
<li v-for = "sub in subs">
{{ sub.name }}
<ul>
<li v-for = "item in sub.sub">
{{ item }}
</li>
</ul>
</li>
</ol>
</div>
<script>
new Vue({
el : "#app",
data : {
password:"",
chars :7,
subs :[{
name : "javascript",sub:["vue","react","angular"]
},{
name : "database",sub :["mysql","mongodb","sqlsever"]
},
{
name:"system",sub:["macOS","linux","windows"]
}]
}
})
</script>
</body>
</html>
6 vue属性
6.1 el属性
6.2 data属性
6.3 methods属性
6.4 计算属性 computed
计算属性computed两个特点:
①vue会检测里面的代码,只要检测到计算属性依赖的数据发生变化时,才会执行代码,下例依赖lastName或者firstName,其中一个变化,都会执行代码
②计算属性执行一次后,会有缓存,再次执行计算属性,直接走缓存,不执行代码
③conputed是一个同步的操作
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<div>{{ num }}</div>
<!-- getFullName()改成fullName,当成属性,不当成方法-->
<div>{{ fullName }}</div>
<div>{{ fullName }}</div>
<button v-on:click = "num++">add</button>
<button v-on:click = "changeName">改变名字</button>
</div>
<script>
new Vue({
el : "#app",
data: {
num:0,
firstName : "zhenling",
lastName : "wang"
},
// 此时点击add,会执行console.log("我执行了"),但是没有改变lastname和firstname值,所以不需要执行,所以用computed计算属性, 代替methods
// methods :{
// getFullName : function(){
// return this.lastName + this.firstName
// }
// }
computed :{
// getFullName变成fullName,当成属性,不当成方法
fullName : function(){
alert("我执行了");
return this.lastName + this.firstName;
}
},
// 验证,当改变fullname值时,执行console.log
methods : {
changeName : function(){
this.lastName = "ming"
// this.firstName = "xiao"
}
}
})
</script>
</body>
</html>
6.5 计算属性 get 、set属性
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<div>{{ num }}</div>
<div>{{ fullName }}</div>
<button v-on:click = "num++">add</button>
<button v-on:click = "changeName">改变名字</button>
<button v-on:click = "changeFullName">改变fullname值</button>
</div>
<script>
new Vue({
el : "#app",
data: {
num:0,
firstName : "zhenling",
lastName : "wang"
},
// get,set属性,当获取fullname值时,走get函数,当设置fullname值时,走set函数
computed :{
fullName :{
get:function(){
// 如果想让fullName依赖其他数据的时候,就把操作代码写进get里
alert("我执行了get");
return this.lastName + this.firstName;
},
set:function(newName){
// 如果想让fullName发生改变,从而引发其他数据发生改变,就把操作代码写进set里
var arr = newName.split(" ");
this.lastName = arr[0];
this.firstName = arr[1];
}
}
},
methods : {
changeName : function(){
this.lastName = "ming"
},
changeFullName :function(){
this.fullName = "xiao hong"
}
}
})
</script>
</body>
</html>
6.6 计算属性 watch属性
computed和watch都是监听数据变化用,根据实际情况决定用哪个
watch两个特点:
①没有return的返回值
②可以是异步操作
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model = "searchInfo">
<div v-if = "shoeSearching">正在搜索</div>
<ul>
<li v-for = "item in result">{{ item }}</li>
</ul>
</div>
<script>
new Vue({
el : "#app",
data: {
searchInfo :"",
shoeSearching :false,
result : []
},
// watch监听数据变化,监听searchInfo
watch:{
searchInfo :function(query){
this.shoeSearching = true;
var vm = this;
// 模拟监听
setTimeout(function(){
vm.result = ["js","css","html"]
vm.shoeSearching = false;
},500)
}
}
})
</script>
</body>
</html>
6.7 相关练习
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 1、将电影写入ul li 格式:捉妖记2 (2018)-->
<ul>
<li v-for = "movie in formateMovie">{{ movie }}</li>
</ul>
<!-- 2、添加电影 -->
<button v-on:click = "addMovie">添加电影</button>
<!-- 3、当添加电影时,watch监测到,会弹出框提示,添加了什么电影 -->
</div>
<script>
new Vue({
el: "#app",
data: {
movies: [{
name: "捉妖记2",
year: 2018
},
{
name: "星球大战8",
year: 2018
},
{
name: "谭仁杰探案",
year: 2018
}]
},
methods :{
addMovie :function(){
this.movies.push({
name:"祖宗十九代",
year :2018
})
}
},
// movies变化,watch会监测到,然后执行watch里面的代码
watch :{
movies : function(newValue){
alert("我添加了" + newValue[newValue.length - 1].name);
}
},
// movies变化,computed会监测到,然后formateMovie也会执行,改变数组格式
computed: {
// 改变数组格式 这里的map()是一种遍历方法
formateMovie :function(){
return this.movies.map(function(movie){
return movie.name + " (" + movie.year + ")"
})
}
}
})
</script>
</body>
</html>
7 filter过滤器(筛选)及样式转换
7.1 filter过滤器
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 简单应用 ,转换成大写-->
<!-- {{ msg | upperCase}} -->
<!-- 复杂应用 ,首字母大写,true指第二个参数存在-->
{{ msg | upperCase(true) }}
</div>
<script>
new Vue({
el: "#app",
data: {
msg :"hello world!!"
},
// uppercase简单应用
// filters:{
// upperCase : function(val){
// return val.toString().toUpperCase();
// }
// }
// uppercase复杂应用
filters :{
upperCase : function(val,isFirstLetter){
val = val.toString();
if(isFirstLetter){
return val.charAt(0).toUpperCase() + val.slice(1);
}else{
return val.toUpperCase();
}
}
}
})
</script>
</body>
</html>
7.2 相关练习
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 1、写出Hello World-->
<div v-bind:title="msg|firstLetterUp">{{ msg|firstLetterUp }}</div>
<!-- 2、不要空格-->
<div v-bind:title="msg|firstLetterUp|removeSpace">{{ msg|firstLetterUp|removeSpace }}</div>
<!-- 3、改变顺序 -->
<div v-bind:title="msg|removeSpace|firstLetterUp">{{ msg|removeSpace|firstLetterUp }}</div>
</div>
<script>
new Vue({
el: "#app",
data: {
msg :"hello world!!"
},
filters :{
// 1、写出Hello World
firstLetterUp :function(val){
val = val.toString();
var arr = val.split(" ");
var newarr = arr.map(function(value){
return value.charAt(0).toUpperCase() + value.slice(1);
})
return newarr.join(" ");
},
// 1、去掉空格
removeSpace :function(val){
return val.toString().replace(/ /g,'');
}
}
})
</script>
</body>
</html>
8 样式变换 style
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="app">
<div style="width:200px;" v-bind:style = "[styles1,styles2,{height:'200px'}]"></div>
<button v-on:click = "change">change</button>
</div>
<script>
new Vue({
el: "#app",
data: {
color:"yellow",
styles :{
backgroundColor : this.color
},
styles2:{
'border-radius':"20px"
}
},
computed:{
styles1 :function(){
return{
backgroundColor:this.color
}
}
},
methods:{
change:function(){
if(this.color == "yellow"){
this.color = "red";
}else{
this.color = "yellow";
}
}
}
})
</script>
</body>
</html>
9 样式变换 class
<!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="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
<style>
.shape{
height: 150px;
width:150px;
float: left;
margin: 10px;
}
.circle{
background:red;
border-radius: 50%;
}
.square{
background-color:blue;
}
.triangle{
width: 0;
height: 0;
}
/* 上三角 */
.up{
border-left: 100px solid transparent;
border-right: 100px solid transparent;
border-bottom: 150px solid orange;
}
/* 下三角 */
.down{
border-left: 100px solid transparent;
border-right: 100px solid transparent;
border-top: 150px solid green;
}
.animation{
animation: strentch 1.0s ease-out;
}
@keyframes strentch{
0%{
transform: scale(0.3);
}
100%{
transform: scale(1)
}
}
</style>
</head>
<body>
<div id="app">
<!-- 通过显示隐藏class切换效果 -->
<!-- <div v-for = "shape in shapes" class = "shape" v-bind:class = "{circle:shape.isRound,square:!shape.isRound}"></div> -->
<!-- 通过改变类名切换效果 -->
<div v-for = "shape in shapes" class = "shape" v-bind:class = "[shape.shape,shape.direction?shape.direction:'',{animation:shape.animation}]"></div>
<!-- v-bind:class 可以简写为:class -->
<!-- v-on:click 可以简写为@click -->
</div>
<script>
new Vue({
el: "#app",
data: {
// 显示隐藏class
// shapes:[
// {isRound:true},
// {isRound:false}
// ]
// 通过类名显示
shapes:[
{shape:'circle',animation:true},
{shape:'square'},
{shape:'triangle',direction:"up",animation:true},
{shape:'triangle',direction:"down"}
]
}
})
</script>
</body>
</html>
来源:https://www.cnblogs.com/wangzhenling/p/8670853.html