摘要:
通过对vue的基础语法系列示例,对初学者来说,放到浏览器中直接运行,可得到直观的认识和理解。
生产环境:
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
vue指南官网地址:https://cn.vuejs.org/v2/guide/
1、构造函数体\变量 基础操作
小节笔记说明
模板语法:
(1)插值
a. 文本:{{}}
b. 纯HTML
v-html 防止XSS
c. 表达式
(2)指令:是带有 v- 前缀的
v-bind
v-if
v-on:click
(3)缩写
v-bind:src => :src
v-on:click => @click
示例输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_构造函数体\变量</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
{{name}}
<span>{{age}}</span>
<p v-html="hname"></p>
<!-- 输出html:<p><b>xiaoming</b></p> -->
<p>{{10+20}}</p>
<!-- //输出:30 -->
<p>{{10>20?'大于':"小于"}}</p>
<!-- //输出:小于 -->
<p>{{age + "xiaoming的年龄"}}</p>
<!-- //输出 18xiaoming的年龄 -->
<p v-if="isShow">我是动态创建和删除</p>
<!-- //输出:(空) -->
<p v-show="isShow">我是动态隐藏和显示</p>
<!-- //输出:<p style="display:none;">我是动态隐藏和显示</p> -->
<p><button v-on:click="handleClick">click</button></p>
<!-- //简写: -->
<button @click="handleClick">click 简写</button>
<p>//bind 绑定某个属性名,控制属性值</p>
<p v-bind:class=" isShow ? 'aa' : 'bb' ">class是bb</p>
//简写:
<p :class=" isShow ? 'aa' : 'bb' ">class是bb</p>
</div>
<script type="text/javascript">
var vue = new Vue({
el:"#box",
data:{
name:"xiaoming",
age:18,
hname:"<b>xiaoming</b>",
isShow: false
},
methods:{
handleClick:function(){
this.name="aa";
this.isShow = !this.isShow;
// this.isShow = true; 和 this.isShow = false; 相互切换
}
}
})
</script>
</body>
</html>
输出:
Tips:console 控制台测试,直接输入vm对象名找到下面的name,还可以直接对其赋值操作:
2、计算属性和观察者
小节笔记说明
计算属性-复杂逻辑
(1)基础例子
(2)计算缓存 VS methods
- 计算属性是基于它们的依赖进行缓存的。
- 计算属性只有在它的相关依赖发生改变时才会重置。
总结,计算属性没有methods那么灵活,可以通过传参做各种改变;
计算属性主要的用法是“getter方法”获取“参数”进行计算
(3)计算属性 VS watch
总结,计算属性
(4)计算setter
计算属性主要的用法是“getter方法”获取“参数”进行计算。同时,他也有setter的方法,但是不常用。
(1)基础例子
(2)计算缓存 VS methods
示例输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_计算属性 vs methods</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<!-- //将姓名的首字母大写 -->
{{name.substring(0,1).toUpperCase()+name.substring(1)}}
<p>我是计算属性{{changeword}}</p>
<p>我是计算属性{{changeword}} 只执行一次,优秀</p>
<p>我是普通方法{{changewordMethod()}}</p>
<p>我是普通方法{{changewordMethod()}} 调用一次,就执行一次,冗余</p>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
name:"xiaoming"
},
// 普通方法
methods:{
changewordMethod:function(){
console.log("普通方法,执行了!")
return this.name.substring(0,1).toUpperCase()+this.name.substring(1)
}
},
//计算属性
computed:{
changeword:function(){
console.log("计算属性,执行了!")
return this.name.substring(0,1).toUpperCase() + this.name.substring(1)
}
}
})
</script>
</body>
</html>
输出:
(3)计算属性 VS watch
示例输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_计算属性 VS watch</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<p>模拟一个购物车的计算 </p>
<p>单价:<input type="text" v-model="price" /></p>
<p>数量:<input type="text" v-model="number" /></p>
<p>sum总额:{{sum}}</p>
<p>computedsum总额:{{computedsum}}</p>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
price:100,
number:0,
sum:0
},
//观察者方法 watch,通过观察price和number的变化,去计算总价
watch:{
price:function(newvalue){
console.log("执行了price监测")
this.sum = newvalue*this.number
},
number:function(newvalue){
console.log("执行了number监测")
this.sum = newvalue*this.price
}
},
//计算属性
computed:{
computedsum:function(){
console.log("执行了计算属性")
return this.number * this.price
}
}
})
</script>
</body>
</html>
输出:
Tips:初始加载时,立即执行了计算属性。
(4)计算setter
示例输入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_计算属性的setter用法</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
{{getData}}
</div>
<script>
var vm = new Vue({
el:"#box",
//计算属性
computed:{
getData:{
get:function(){
return "xiaoming"
},
set:function(value){
console.log(value)
}
}
}
})
</script>
</body>
</html>
输出:
3、class和style绑定用法
(1)绑定HTML Class & 绑定内联样式:
- 对象语法
- 数组语法
(1)绑定HTML Class & 绑定内联样式
示例输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_class与style</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<p class="default" :class="isShow?'aa':'bb'">
class样式,三元判断式
</p>
<p class="default" :class="{active:isShow}">
class样式,对象语法单个
</p>
<p class="default" :class="{active:isShow,show:isShow2}">
class样式,对象语法多个
</p>
<p class="default" :class="['active','show']">
class样式,数组式
</p>
<p class="default" :class="[obj,'show']">
class样式,数组式,用参数化写入,例:obj变量,obj="active"
</p>
<p class="default" :style="{background:color}">
style样式,数组式,用参数化写入,例:color变量,color="#ccc"
</p>
<p class="default" :style="objstyle">
style样式,数组式,数组写入。
</p>
<p class="default" :style="[objs1,objs2]">
style样式,数组式,分开数组写入。
</p>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
isShow:false,
isShow2:true,
obj:"active",
color:"#ccc",
objstyle:{
background:"red",
fontSize:"30px" //font-size 需要写成 fontSize
},
objs1:{
background:"red",
},
objs2:{
fontSize:"30px"
}
},
})
</script>
</body>
</html>
输出:
4、条件渲染
(1)v-if
(2)v-else
(3)template v-if
(4)v-show
(1)v-if
(2)v-else
(3)template v-if
(4)v-show
示例输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_条件渲染</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<p v-if="isCreated">我是高级渲染,为否的时候,就连html都不显示</p>
<p v-else>我的else</p>
<template v-if="isCreated">
<div>hello</div>
<div>hello</div>
<div>hello</div>
</template>
<p v-show="isShow">我是动态隐藏和显示,style=“display:none”的那种</p>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
isCreated:true,
isShow:false
},
})
</script>
</body>
</html>
输出:
5、列表渲染
小节笔记说明
(1)v-for
a. in
b. of
(1)v-for
示例输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_列表渲染</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<ul>
<li v-for="item in datalist">
{{item}}
</li>
</ul>
<ul>
<li v-for="(item,index) in datalist">
索引为{{index}},内容为{{item}}
</li>
</ul>
<ul>
<li v-for="(item,index) of datalist">
of写法,一样渲染。
索引为{{index}},内容为{{item}}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
datalist:["aa","bb","cc"]
},
})
</script>
</body>
</html>
输出:
(2)key
*跟踪每个节点的身份,从而重用和重新排序现有元素
*理想的 key 值是每项都有的且唯一的 id。
示例输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_列表渲染</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<ul>
<li>
<p>v-bind:key可以定义key,但是不建议用index索引来做id(key)</p>
</li>
<li v-for="(item,index) of datalist" v-bind:key="index">
索引为{{index}},内容为{{item}}
</li>
<li>
<p>可简写为 => :key="index" ,效果一致:</p>
</li>
<li v-for="(item,index) of datalist" :key="index">
索引为{{index}},内容为{{item}}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
datalist:["aa","bb","cc"]
},
})
</script>
</body>
</html>
输出:
(3)数组更新检测
a. 使用以下方法操作数组,可以检测变动
push() 追加,返回值:长度
pop() 删除并返回数组的最后一个元素
shift() 删除并返回数组的第一个元素。
unshift() 向数组的开头添加一个或更多元素,返回新的长度
splice() 插入/替换
sort() 排序
reverse() 倒序
vue中,push()示例
输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_列表渲染</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<p>数组更新显示法:</p>
<p></p>
<p>push() 向数组末尾添加一个或N个元素,并<b>返回新的长度</b>。</p>
<p>例:datalist:["aa","bb","cc"]</p>
<p>示例1:return this.datalist.push("dd")</p>
<ul>
<li v-for="item in push_computed_datalist1">{{item}}</li>
</ul>
<p>示例2:先执行push(),然后 return this.datalist2</p>
<ul>
<li v-for="item in push_computed_datalist2">{{item}}</li>
</ul>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
datalist:["aa","bb","cc"],
datalist2:["aa","bb","cc"],
},
computed:{
push_computed_datalist1:function(){
return this.datalist.push("dd")
},
push_computed_datalist2:function(){
this.datalist2.push("ff","gg")
return this.datalist2
}
}
})
</script>
</body>
</html>
输出:
vue中,pop()示例
输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_列表渲染</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<p>数组更新显示法:</p>
<p></p>
<p>pop() 删除并返回数组的最后一个元素,长度减少。</p>
<p>例:datalist:["aa","bb","css"]</p>
<p>示例1:return this.datalist.pop()</p>
<ul>
<li v-for="item in pop_computed_datalist1">{{item}}</li>
</ul>
<p>示例2:先执行pop(),return this.datalist2</p>
<ul>
<li v-for="item in pop_computed_datalist2">{{item}}</li>
</ul>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
datalist:["aa","bb","css"],
datalist2:["aa","bb","css"]
},
computed:{
pop_computed_datalist1:function(){
return this.datalist.pop()
},
pop_computed_datalist2:function(){
this.datalist2.pop()
return this.datalist2
},
}
})
</script>
</body>
</html>
输出:
vue中,shift()示例
输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_列表渲染</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<p>数组更新显示法:</p>
<p></p>
<p>shift() 删除并返回数组的第一个元素。</p>
<p>例:datalist:["aa","bb","css"]</p>
<p>示例1:return this.datalist.shift()</p>
<ul>
<li v-for="item in shift_computed_datalist1">{{item}}</li>
<li>shift_computed_datalist1 计算属性:{{shift_computed_datalist1}}</li>
</ul>
<p>示例2:先执行shift(),return this.datalist2</p>
<ul>
<li v-for="item in shift_computed_datalist2">{{item}}</li>
</ul>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
datalist:["aa","bb","css"],
datalist2:["aa","bb","css"]
},
computed:{
shift_computed_datalist1:function(){
return this.datalist.shift()
},
shift_computed_datalist2:function(){
this.datalist2.shift()
return this.datalist2
},
}
})
</script>
</body>
</html>
输出:
vue中,unshift()示例
输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_列表渲染</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<p>数组更新显示法:</p>
<p></p>
<p>unshift() 向数组的开头添加一个或更多元素,并返回新的长度。。</p>
<p>例:datalist:["aa","bb","css"]</p>
<p>示例1:return this.datalist.unshift()</p>
<ul>
<li>unshift_computed_datalist1 计算属性:{{unshift_computed_datalist1}}</li>
</ul>
<p>示例2:先执行unshift(),return this.datalist2</p>
<ul>
<li v-for="item in unshift_computed_datalist2">{{item}}</li>
</ul>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
datalist:["aa","bb","css"],
datalist2:["aa","bb","css"]
},
computed:{
unshift_computed_datalist1:function(){
return this.datalist.unshift("haha")
},
unshift_computed_datalist2:function(){
this.datalist2.unshift("haha")
return this.datalist2
},
}
})
</script>
</body>
</html>
输出:
vue中,splice()示例
输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_列表渲染</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<p>数组更新显示法:</p>
<p></p>
<p>splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。</p>
<p>语法:arrayObject.splice(index,howmany,item1,.....,itemX)</p>
1、index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。<br />
2、howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。<br />
3、item1, ..., itemX 可选。向数组添加的新项目。<br />
<p>
示例1:插入<br />
arr.splice(2,0,z)<br />
[a,b,c] => [a,b,z,c]
</p>
<ul>
<li v-for="item in splice_computed_datalist1">{{item}}</li>
</ul>
<p>
示例2:替换<br />
arr.splice(2,1,z)<br />
[a,b,c] => [a,b,z]
</p>
<ul>
<li v-for="item in splice_computed_datalist2">{{item}}</li>
</ul>
<p>
示例3:替换多个<br />
arr.splice(1,2,z)<br />
[a,b,c] => [a,z]
</p>
<ul>
<li v-for="item in splice_computed_datalist3">{{item}}</li>
</ul>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
datalist:["aa","bb","cc"],
datalist2:["aa","bb","cc"],
datalist3:["aa","bb","cc"],
},
computed:{
splice_computed_datalist1:function(){
this.datalist.splice(2,0,"~zz~")
return this.datalist
},
splice_computed_datalist2:function(){
this.datalist2.splice(2,1,"~zz~")
return this.datalist2
},
splice_computed_datalist3:function(){
this.datalist3.splice(1,2,"~zz~")
return this.datalist3
}
}
})
</script>
</body>
</html>
输出:
vue中,sort()示例
输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_列表渲染</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<p>数组更新显示法:</p>
<p></p>
<p>sort() 对数组的元素进行排序。</p>
<p>例1:字母排序。例:datalist:["sa","bb","cc","aa"]</p>
<ul>
<li v-for="item in sort_computed_datalist1">{{item}}</li>
</ul>
<p>例2:数字排序需要一个"排序函数"。例:datalist1:[1,100,6,55]</p>
<ul>
<li v-for="item in sort_computed_datalist2">{{item}}</li>
</ul>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
datalist:["sa","bb","cc","aa"],
datalist1:[1,100,6,55],
},
methods:{
//排序函数
sortNumber:function (a,b){
return a - b
}
},
computed:{
sort_computed_datalist1:function(){
this.datalist.sort()
return this.datalist
},
sort_computed_datalist2:function(){
this.datalist1.sort(this.sortNumber) //调用排序函数
return this.datalist1
},
}
})
</script>
</body>
</html>
输出:
vue中,reverse()示例
输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_列表渲染</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<p>数组更新显示法:</p>
<p></p>
<p>reverse() 颠倒数组中元素的顺序。</p>
<p>例1:字母排序。例:datalist:["bb","cc","aa","zz"]</p>
<ul>
<li v-for="item in reverse_computed_datalist1">{{item}}</li>
</ul>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
datalist:["bb","cc","aa","zz"]
},
computed:{
reverse_computed_datalist1:function(){
this.datalist.reverse()
return this.datalist
}
}
})
</script>
</body>
</html>
输出:
(4)应用:显示过滤结果,使用计算属性
示例输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01 模板语法_列表渲染</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="box">
<p><input type="text" v-model="mytext" /></p>
<ul>
<li v-for="data in cmputeddatalist">{{data}}</li>
</ul>
</div>
<script>
var vm = new Vue({
el:"#box",
data:{
mytext:"",
datalist:["aa","bb","cc","dd"]
},
computed:{
cmputeddatalist:function(){
return this.datalist.filter(item=>item.indexOf(this.mytext)>-1)
}
}
})
</script>
</body>
</html>
输出:
综上所述
通过对vue的基础语法系列示例,对初学者来说,放到浏览器中直接运行,可得到直观的认识和理解。
后续笔记示例:
(二).vue 结尾的单体页面示例。
(三)路由示例。
(四)api接口数据接入,并部署上线示例。