目录
Vue介绍
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。
所谓渐进式框架,就是把框架分层。
最核心的部分是是图层渲染,然后往外是组建机制,在这个基础上再加入路由机制,再加入状态管理,最外层是构建工具。
Vue基础
v-once
v-once 只执行一次,后面没有表达式
<div id="app">
<div>{{ message }}</div>
<div v-once>{{ message}}</div>
</div>
<script>
const vm = new Vue({
el: '#app',
data:{
message:'hello world'
}
})
</script>
在console中改变vm.message的值,有v-once的不发生改变。效果如图:
v-html
v-html 可以解析HTML标签
<div id="app">
<div>{{ url }}</div>
<div v-html="url"></div>
</div>
<script>
const vm = new Vue({
el: '#app',
data:{
url:'<a href="https://www.baidu.com">百度一下</a>',
}
})
</script>
效果如图:
v-text
v-text 不想用{{大括号}}的时候,可以用v-text(一般不用),缺点是不够灵活。
<div id="app">
<div>{{ message }}</div>
<div v-text="message"></div>
</div>
<script>
const vm = new Vue({
el: '#app',
data:{
message:'肖申克的救赎'
}
})
</script>
效果如图:
v-pre
v-pre 类似于<pre>标签,当只想显示 {{ message }} ,而不想显示其内容的时候用
<div id="app">
<div>{{ message }}</div>
<div v-pre>{{message}}</div>
</div>
<script>
const vm = new Vue({
el: '#app',
data:{
message:'肖申克的救赎'
}
})
</script>
效果如图:
v-cloak
v-cloak 用得很少。
闪动(抖动),网络慢的时候,开始会显示 {{ msg }} ,解析以后才显示其内容,
在div上加v-cloak,并设置[v-cloak] { display: none; }可以避免闪动
<div id="app">
<div v-cloak>{{ message }}</div>
</div>
<script>
const vm = new Vue({
el: '#app',
data:{
message:'肖申克的救赎'
}
})
</script>
先把网络设置成3G的,再看效果,效果如图:
v-bind
v-bind 动态绑定属性 ,可以简写成“:”,例如:<img v-bind:src="imgUrl" />可以简写成<img :src="imgUrl" />
<div id="app">
<img src="https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2775457732,1676441877&fm=11&gp=0.jpg" />
<img v-bind:src="imgUrl" />
<img :src="imgUrl"/>
</div>
<script>
const vm = new Vue({
el: '#app',
data:{
imgUrl:'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2775457732,1676441877&fm=11&gp=0.jpg',
}
})
</script>
效果图如下:
class 也可以用v-bind进行动态绑定,
一个class可以用[className]来表示【注意:因为只有一个class,可以去掉[] 】,
两个或多个就需要用[ className, className2 ]来表示
<style>
.red{ color:red }
.blue{ color:blue }
.f20{ font-size:20px }
</style>
<div id="app">
<p :class="[color1]">优快云 专业开发者社区</p>
<p :class="color1">优快云 专业开发者社区</p>
<p :class="[color2, fontSize]">优快云 专业开发者社区</p>
<p :class="[color2, {fontSize:false}]">优快云 专业开发者社区</p>
</div>
<script>
const vm = new Vue({
el: '#app',
data:{
color1: 'red',
color2: 'blue',
fontSize: 'f20',
}
})
</script>
效果图如下:
class 可以用在三目运算符中,例如上边的代码写成这样:
<p :class=" color1=='red' ? fontSize : '' ">优快云 专业开发者工具</p>
效果如下图:
style 也可以用v-bind进行动态绑定,
一个内部样式可以写成{attribute属性: styleName}【注意:如果没有属性,只有一个内部样式,可以把{}去掉】,
两个或者多个内部样式,就需要写成数组的样子了 { attribute: styleName, attribute: styleName }
<style>
.red{ color:red }
.blue{ color:blue }
.f20{ font-size:20px }
</style>
<div id="app">
<p :style="{color:color2}">优快云 专业开发者社区</p>
<p :style="red">优快云 专业开发者社区</p>
<p :style="{color:color2, fontSize:fontSize}">优快云 专业开发者社区</p>
<p :style="[pstyle,pstyle2]">优快云 专业开发者社区</p>
</div>
<script>
const vm = new Vue({
el: '#app',
data:{
red: 'color:red',
color2: 'blue',
fontSize: 'f20',
pstyle: { width:'200px', border:'5px solid red'},
pstyle2: { color:'red', fontSize:'20px'},
}
})
</script>
效果图如下:
v-if
v-if 控制dom的移除和添加
注意:v-if 和 v-else 中间不能加东西,加了以后,v-else就不起作用了
v-if / v-else-if / v-else
v-else-if 可以有,可以没有,可以写多个
v-show 控制dom的显示和隐藏
但是v-show的隐藏是把 display的值设置成none,也就是渲染的时候是加载的,只是隐藏了,
v-if的移除是移除这个元素,就是渲染的时候不加载,需要显示的时候,重新添加。
所以,频繁使用显示和隐藏的时候,用v-show
注意:v-show 在template上不起作用,所以最好不要在template上写v-show
v-on
v-on:xxx 事件,简写“@”
<style>
.box{ width:100px; height:100px; }
.bred{ background:red; }
.bblue{ background:blue; }
</style>
<div id="app">
<h4 :class="colors[index]">优快云 专业开发者社区</h4>
<div v-show="show" class="orange">是否展示这句话 优快云 专业开发者社区</div>
<template v-if="show">
<div class="box bred"></div>
<div class="box bblue"></div>
</template>
<button v-on:click="changecolor()">点击换颜色</button>
<button @click="togglehide">{{txt}}</button>
</div>
<script>
const vm = new Vue({
el: '#app',
data:{
colors: ['red' , 'yellow', 'orange', 'green', 'blue','purple'],
index: 0,
count: 0,
txt: '隐藏',
show: true,
},
// 在 methods 中使用 data 里面的数据的时候,要加 this 指向该Vue实例对象
methods:{
changecolor(){
this.index = ++this.count % (this.colors.length);
},
togglehide(){
if(this.show == true){
this.show = false;
this.txt = "显示";
} else {
this.show = true;
this.txt = "隐藏";
}
},
},
})
</script>
最开始的样子:
每个按钮 点击一次 的样子:
剩下的自己试一试吧
v-on 事件修饰符:
.stop 阻止事件冒泡
.self 只有当事件在该元素本身触发时才触发事件
.capture 添加事件侦听器是,使用事件捕获模式
.prevent 阻止默认行为,例如a标签的跳转默认行为
.once 事件只触发一次
.native 监听组件根元素的原生事件
按键修饰符
按键别名:
.enter
.tab
.delete (捕获 "删除" 和 "退格" 键)
.esc
.space
.up
.down
.left
.right
.ctrl
.alt
.shift
.meta
事件修饰符
.stop
<div id="app">
<div class="outer" @click="outerClick">
<div class="inner" @click="innerClick">
<button @click.stop="btnClick">阻止事件冒泡</button>
</div>
</div>
</div>
<script>
const vm = new Vue({
el: '#app',
methods: {
outerClick () {
console.log("触发了outer点击事件")
},
innerClick () {
console.log("触发了inner点击事件")
},
btnClick () {
console.log("触发了按钮点击事件")
},
}
})
</script>
当点击按钮的时候,只触发按钮点击事件,阻止了事件冒泡(不触发 inner事件 和 outer事件)
.self
<style>
.outer{ width:500px; border:1px solid red; }
.inner{ width:300px; border:1px solid blue; }
</style>
<div id="app">
<div class="outer" @click="outerClick">
<div class="inner" @click.self="innerClick">
<button @click="btnClick">self效果</button>
</div>
</div>
</div>
<script>
const vm = new Vue({
el: '#app',
methods: {
outerClick () {
console.log("触发了outer点击事件")
},
innerClick () {
console.log("触发了inner点击事件")
},
btnClick () {
console.log("触发了按钮点击事件")
},
}
})
</script>
第一次点击按钮,第二次点击蓝色的框,不在按钮的位置点击,第三次点击红色的框,不在按钮的位置点击,也不再蓝框的位置点击,后台的结果如下图:
.capture
<style>
.outer{ width:500px; border:1px solid red; }
.inner{ width:300px; border:1px solid blue; }
</style>
<div id="app">
<div class="outer" @click="outerClick">
<div class="inner" @click.capture="innerClick">
<button @click="btnClick">self效果</button>
</div>
</div>
</div>
<script>
const vm = new Vue({
el: '#app',
methods: {
outerClick () {
console.log("触发了outer点击事件")
},
innerClick () {
console.log("触发了inner点击事件")
},
btnClick () {
console.log("触发了按钮点击事件")
},
}
})
</script>
当点击按钮的时候,会从外到里依次触发outer点击事件、inner点击事件、按钮点击事件
当点击inner div时,会从外到里依次触发outer点击事件、inner点击事件
当点击outer div时,只触发outer点击事件
.prevent
<div id="app">
<a href="http://www.baidu.com" @click.prevent="preventClick">百度一下 你就知道</a>
</div>
<script>
const vm = new Vue({
el: '#app',
methods: {
preventClick () {
console.log("阻止了a标签的默认点击跳转事件")
},
}
})
</script>
点击只会触发preventClick事件,不会跳转页面,阻止了a标签的默认跳转
.once
<div id="app">
<input type="button" value="只触发一次" @click.once="onceClick">
</div>
<script>
const vm = new Vue({
el: '#app',
methods: {
onceClick () {
console.log("事件只触发一次,点击再多次按钮,也只输出一次")
},
}
})
</script>
once 顾名思义,就是只有一次,也就是点击再多次也不执行
按键修饰符
<div id="app">
// Enter键触发submit事件 下面两种写法都对
<input type="text" @keyup.enter="submit" />
<input type="text" @keyup.13="submit" />
</div>
<script>
const vm = new Vue({
el: '#app',
methods: {
submit() {
console.log("enter键触发事件");
}
}
})
</script>
修饰符可以串联
<div id="app">
<div class="outer" @click="outerClick">
<div class="inner" @click="innerClick">
<!-- 既阻止了默认事件,又阻止了事件冒泡 -->
<a href="http://www.baidu.com" @click.stop.prevent="btnClick">修饰符串联</a>
</div>
</div>
</div>
<script>
const vm = new Vue({
el: '#app',
methods: {
outerClick() {
console.log("触发了outer点击事件")
},
innerClick() {
console.log("触发了inner点击事件")
},
btnClick() {
console.log("触发了按钮点击事件")
},
}
})
</script>
【注意】使用修饰符时,顺序很重要。相应的代码会以同样的顺序产生。
v-on:click.prevent.self //会阻止所有的点击的默认事件
v-on:click.self.prevent //只会阻止元素自身点击的默认事件
v-model
v-model 双向数据绑定(只用于表单元素)
常见的表单元素包括:input(radio,text,address,email...)、select、checkbox、textarea
v-bind:只能实现数据的单向绑定,从M绑定到V
v-model:可以实现双向绑定
<div id="app">
<input type="text" v-model="value"/><span>{{value}}</span>
<p><input type="checkbox" v-model="checked"/>{{checked}}</p>
<div>爱好 多选:
<label for="sing"><input type="checkbox" id="sing" value="sing" v-model="checkedList" />sing</label>
<label for="dance"><input type="checkbox" id="dance" value="dance" v-model="checkedList" />dance</label>
<label for="read"><input type="checkbox" id="read" value="read" v-model="checkedList" />read</label>
<p>{{checkedList}}</p>
</div>
<div>爱好 单选:
<label for="sing1"><input type="radio" id="sing1" value="sing" v-model="picked" />sing</label>
<label for="dance1"><input type="radio" id="dance1" value="dance" v-model="picked" />dance</label>
<label for="read1"><input type="radio" id="read1" value="read" v-model="picked" />read</label>
<p>{{picked}}</p>
</div>
<select name="" id="" v-model="selected" multiple>
<option value="" disabled>请选择</option>
<option value="sing2">sing2</option>
<option value="dance2">dance2</option>
<option value="read2">read2</option>
</select>
<p>select选择的是:{{selected}}</p>
</div>
<script>
const vm = new Vue({
el: '#app',
data:{
value:'杉杉',
checked:true,
checkedList:[],
picked:'',
selected:[],
},
})
</script>
效果如下图:
做个简易计算器
<div id="app">
<input type="text" v-model="input1"/>
<select id="opt" name="opt" v-model="opt">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="text" v-model="input2"/>
<button @click="jisuan"> = </button>
<span>{{result2}}</span>
</div>
<script>
const vm = new Vue({
el: '#app',
data:{
input1: 0,
input2: 0,
opt: '+',
result2: 0
},
methods: {
jisuan(){
this.result2 = eval( 'parseFloat(this.input1)' + this.opt + 'parseFloat(this.input2)' )
},
}
})
</script>
渲染出来以后,将第一个input框输入5,计算符号选择 * ,第二个input 框输入6 ,点击“=”,结果会自动显示出来
v-for
v-for 循环,循环数组,循环对象,循环数字,循环字符串
v-for 要给key值,必须是数字类型或者string,必须是唯一的。
不用key值的话,未来脚手架搭建项目时会报警告。key可以提升页面的性能。
不建议用index下标作为key的值,因为下标会因为重新排序而从新排序,内部会做更改dom的操作,浪费性能
1、不能通过索引的方式去更改数组,这样不会渲染
2、不能通过更改长度的方式去更改数组,这样不会渲染
3、数组变异方法(更改数组)只要执行这七个方法,就会进行渲染:
pop、shift、unshift、splice、sort、reverse、push
<div id="app">
<div v-for="(n,index) in m" :key="n">{{index}}--{{n}}</div>
<div v-for="(value, key) in obj" >{{key}} : {{value}}</div>
<div v-for="(num,indexs) in 10">{{indexs}} -- {{num}}</div>
<div v-for="item in '优快云' ">{{item}}</div>
<button @click="handleclick">第一组数组重新排序 reverse 回改变原数组</button>
</div>
<script>
const vm = new Vue({
el:'#app',
data:{
m:['html','css','js','ajax'],
obj:{'name':'shanshan','age':18,'heihgt':170},
},
methods:{
handleclick(){
this.m.reverse();
},
},
})
</script>
渲染出来以后的效果如下:
点击按钮一次 的效果如下: