03 vue相关问题
第一步:引入框架
< script src=“js/vue.js”></ script>第二步:body中写入元素
< div id=‘app’>{{msg}}</ div>第三步:实例化对象
new Vue({
el:’#app’ //绑定元素
data:{
msg:‘Hello Vue!’
}
})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>体验vue</title>
</head>
<body>
<!-- 在MVVM中指的是V(view) -->
<div id="app">
<!-- 插值表达式:{{数据}}-->
{{msg}}
<!-- 绑定父级,子级不再绑定 -->
<!-- <div id="wrap">-->
<!-- {{msg1}}-->
<!-- </div>-->
</div>
<!-- 绑定元素之外,解析不了插值表达式 -->
{{msg}}
<!-- 同级可以绑定多次,一般不推荐,后期模块化开发的时候,没有必要-->
<div id="wrap">
{{msg1}}
</div>
</body>
<!--第一步:引入框架-->
<script src="js/vue.js"></script>
<script>
// <!-- Vue开发模式是MVVM -->
//new Vue代表的是MVVM中的VM
//实例化对象
new Vue({
//绑定的元素,可以是标签名(但不能是html或者body),是类名、id名
//一般使用的id名,id名唯一可以避免重复绑定。后期开发项目的时候,一般一个模块绑定一次,一般该模块有id名
//绑定元素
el:'#app',
//data数据只能作用在绑定元素内部
//在vue中代表的是MVVM中的M(model)
//数据
data:{
msg:'hello vue!',
msg1:'welcome'
}
})
//绑定父级,子级不再绑定
new Vue({
el:'#wrap',
data:{
msg1:'wrap'
}
})
</script>
<!--vue中,有需求,操作数据-->
</html>
总结:
1.插值表达式:{{数据}}
2.绑定父级,自己不再绑定
3.绑定元素之外,解析不了插值表达式(< div id=‘app’></ div>之外的东东)
4.同级可以绑定多次,一般不推荐,后期模块化开发的时候实现,没有必要
5.< div id=‘app’></ div>在MVVM里指的是V(view);
new Vue({})代表的是MVVM中的VM
6.绑定的元素,可以是标签名(但不能是html或者body),是类名、id名
04插值表达式({变量/函数/表达式})
v-html的优先级比较高,如果有这个的话,div里面的内容就不会显示了,显示的是v-html='变量名’里变量名的内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- <div id="app" v-html="msg">优先级比较高,如果有这个的话,div里面的内容不会显示-->
<!-- 插值表达式({变量/函数/表达式})-->
{{msg}};
{{1+88}};
{{add()}};
{{Math.floor(Math.random())}};
{{1>2?'true':'false'}}
</div>
<script src="js/vue.js"></script>
<script>
new Vue({
el:'#app',
//数据类的放置在data内部
data:{
msg:'hello'
},
// 方法类的放置在methods内部
methods:{
add(){
return 3;
}
}
})
</script>
</body>
</html>
05 v-cloak
v-cloak保持在元素身上,直到编译结束;
可以解决中间闪烁问题,会出现的中间代码问题
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style>
/*<!--v-cloak保持在元素身上,直到编译结束-->*/
[v-cloak]{
display: none;
}
/* 解决了中间的闪烁问题,会出现中间代码的问题*/
</style>
<body>
<div id="app" v-cloak>
{{msg}}
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{
msg:'hello'
}
})
</script>
</html>
06 v-on:事件名=“方法名”
事件结构: v-on:事件名字=“方法名”
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 事件结构:v-on:事件名字="方法名"-->
<button v-on:click="add()">按钮</button>
{{num}}
</div>
</body>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el:'#app',
data:{
num:0
},
methods:{
add(){
// this代表的是new Vue({})实例对象
this.num++;
// console.log(this);
}
}
})
</script>
</html>
07 v-on事件
1.事件结构:v-on:事件名字=“方法名”;
2.事件名字:click mouseenter(效率更高一点,mouseover会触发子元素)mouseleave keydown keyup之前的事件在此处仍可以使用;
3.Vue里面没有直接的this代表事件源,通过$event获取,指的是事件对象,相当于之前事件的event
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style>
p{
background: aqua;
width: 100px;
height: 100px;
border-radius: 50%;
}
</style>
<body>
<div id="app">
<!-- 事件结构:v-on:事件名字=”方法名“-->
<!-- 事件名字 click mouseenter(效率更高一点,mouseover会触发子元素) mouseleave keydown keyup之前的事件在此处同样可以使用-->
<button v-on:click="add()">按钮</button>
<!-- Vue里面没有直接的this代表事件源,通过$event获取,指的是事件对象,相当于之前事件的event-->
<p v-on:mouseenter="bg($event)"></p>
{{num}}
</div>
</body>
<script src="js/vue.js"></script>
<script>
var vm=new Vue({
el:'#app',
data:{
num:0
},
methods:{
add(){
// this代表的是new Vue({})实例对象
this.num++;
},
bg(a){
// $event.target代表的是事件源
a.target.style.background='red';
console.log(a.target);
}
}
})
</script>
</html>
08 event(回顾)
event事件对象 和 事件相关的信息
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button id="btn">按钮</button>
<!--event事件对象 和 事件相关的信息-->
<script>
btn.onclick=function(event){
console.log(event.target);
}
</script>
</body>
</html>
09 冒泡和默认行为
1.return false既能阻止冒泡又能阻止默认行为
冒泡:触发子级的时候,把父级同样的事件也会触发;
默认行为:a标签的跳转,表单的提交;
2.Vue中:
阻止默认行为 v-on:click.prevent=" ";
阻止冒泡 v-on:事件类型.stop
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style>
div>div{
width: 100px;
height: 100px;
background-color: red;
}
p{
width: 50px;
height: 50px;
background-color: aquamarine;
}
</style>
<body>
<!--return false既能阻止冒泡又能阻止默认行为-->
<!--之前的写法-->
<form action="" method="get" onsubmit="return false">
<input type="text" name="user">
<input type="submit">
</form>
<a href="06.html" onclick="return false">百度</a>
<!--return false
冒泡:触发子级的时候,把父级同样的事件也会触发
默认行为:a标签的跳转,表单的提交
vue中
阻止默认行为 v-on:click.prevent=""
阻滞冒泡 v-on:事件类型.stop
-->
<div id="app">
<a href="06.html" v-on:click.prevent="">百度</a>
<div v-on:click.stop="change($event)">
<!-- 如果第一二条事件不一样就不需要委托了,如果事件是一样的,就可以用父级事件委托-->
<p v-on:click.stop="change($event)"></p>
<span>asdfgb</span>
</div>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el:'#app',
methods:{
change(a){
console.log(a.target);
}
}
})
</script>
<!--事件委托(事件代理):利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件
程序中现有的dom节点是由事件的,新添加的dom节点也是有事件的
-->
</html>
10 keydown
keydown:键盘按下的时候触发,限制为某些按键的时候才触发方法
v-on:keydown,键盘直接名字a/b/c键盘码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- keydown键盘按下的时候触发,限制为某些按键的时候才触发方法
v-on:keydown,键盘直接名字a/b/c/键盘码
-->
<!-- 不加$event打印出来的就是undefined-->
<input type="text" v-on:keydown.up="change()" v-on:keydown.down="change()">
<input type="text" v-on:keydown="change($event)">
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{
num:0
},
methods:{
change(a){
// a.keycode键盘码
console.log(a);
}
}
})
</script>
</html>
11 v-once和v-pre
v-once:只渲染一次,后期数据变化也不再渲染;
v-pre:不渲染,以插值表达式的形式表示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--v-once:只渲染一次,后期数据变化也不再渲染
v-pre:不渲染,以插值表达式的形式表示
-->
<div id="app">
<button v-on:click="add()">按钮</button>
<p v-once>once:{{msg}}</p>
<p v-pre>pre:{{msg}}</p>
{{msg}}
</div>
<script src="js/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{
msg:0
},
methods:{
add(){
// console.log(111);
this.msg++
}
}
})
</script>
</body>
</html>
12 v-model:实现双向数据绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--v-model:实现双向数据绑定-->
<div id="app">
<input type="text" v-model="msg">
{{msg}}
<button v-on:click="add()">按钮</button>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{
msg:0
},
methods:{
add(){
this.msg=this.msg+1;
}
}
})
</script>
</html>
13 v-if 和 v-show
1.v-if控制标签是否存在;
2.v-show控制标签显示隐藏;
3.v-if/show=“表达式/变量”
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style>
p{
width: 100px;
height: 100px;
background-color: aquamarine;
}
/*消除闪烁*/
[v-cloak]{
display: none;
}
</style>
<body>
<div id="app" v-cloak>
<button v-on:click="change()">按钮</button>
<!-- v-if控制标签是否存在
v-show控制标签显示隐藏
v-if/show=”表达式/变量“
-->
<p v-if="msg==1">1</p>
<p v-show="msg==2">2</p>
</div>
<script src="js/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{
msg:1
},
methods:{
change(){
if (this.msg==1){
this.msg=2;
}else {
this.msg=1;
}
}
}
})
</script>
</body>
</html>
14 v-for循环遍历
v-for循环 item数组元素 index数组下标 list数组;
遍历哪一个标签,就for哪一个标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<ul>
<!-- v-for循环 item数组元素 index数组下标 list数组
遍历哪一个标签,就for哪一个标签
-->
<li v-for="(item,index) in list">
<h1>{{item.con}}</h1>
<p>{{item.date}}</p>
<span v-on:click="del(index)">X</span>
</li>
</ul>
</div>
<!--vue项目,首先操作数据-->
<script src="js/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{
list:[
{
con:'今日下雨',
date:'2020-03-20'
},
{
con:'今日下雨',
date:'2020-04-20'
},
{
con:'今日下雨',
date:'2020-05-20'
},
{
con:'今日下雨',
date:'2020-06-20'
},
]
},
methods:{
del(index){
console.log(index);
//splice(要操作的位置,删除标签的数量,插入的元素)
this.list.splice(index,1);
}
}
})
</script>
</body>
</html>
点击可以删除:
15 v-bind
如果属性是变量:
1.如果只有一个变量:
v-bind:属性=“变量”2.如果多个变量:
v-bind:属性="[变量,变量]"3.如果属性值有的不确定有的确定:
v-bind:属性:"{k:v,k:v}" k代表的是属性值
v是true,属性存在,否则不存在
v的值可以是表达式,也可以是变量
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box{
width: 100px;
height: 100px;
margin-top: 10px;
background-color: lime;
}
.current{
display: none;
}
</style>
</head>
<body>
<div id="app">
<button v-on:click="change()">按钮</button>
<!-- 如果属性是变量
如果只有一个变量
v-bind:属性=“变量”
如果多个变量
v-bind:属性="[变量,变量]"
如果属性值有的不确定有的确定
v-bind:属性:"{k:v,k:v}" k代表的是属性值
v是true,属性存在,否则不存在
v的值可以是表达式,也可以是变量
-->
<div v-bind:class="{box:true,current:msg==false}"></div>
</div>
<script src="js/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{
msg:true
},
methods:{
change(){
this.msg=!this.msg;
}
}
})
</script>
</body>
</html>
16 发微博
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style>
*{
list-style: none;
}
li{
background-color: antiquewhite;
}
</style>
<body>
<div id="app">
<ul>
<!-- v-for循环 item数组元素 index数组下标
list数组
遍历哪一个标签,就for哪一个标签
-->
<li v-for="(item,index) in list">
<h1>{{item.con}}</h1>
<p>{{item.date}}</p>
<span v-on:click="del(index)">X</span>
</li>
</ul>
<button v-on:click="add()">发微博</button>
<textarea name="" id="" cols="30" rows="10" v-model="msg"></textarea>
</div>
<!--vue项目,首先操作数据-->
<script src="js/vue.js"></script>
<script>
var date = new Date();
var finaldate=date.getFullYear()+'年'+(date.getMonth()+1)+'月'+date.getDate()+'日';
new Vue({
el:'#app',
data:{
list:[
{
con:'今日下雨',
date:'2020-03-20'
},
{
con:'今日下雨',
date:'2020-04-20'
},
{
con:'今日下雨',
date:'2020-05-20'
},
{
con:'今日下雨',
date:'2020-06-20'
},
],
msg:null
},
methods:{
add(){
// this.list.push(cont.innerHTML);
// console.log(this.msg);
this.list.push({con:this.msg,date:finaldate});
console.log(this.list);
},
del(index){
console.log(index);
this.list.splice(index,1);
}
}
})
</script>
</body>
</html>
17 实现tab栏
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style>
*{
padding: 0;
margin: 0;
list-style: none;
}
#wrap>ul{
overflow: hidden;
}
#wrap li{
float: left;
border:1px solid red;
}
section div{
width: 169px;
height: 169px;
border:1px solid green;
margin-bottom: 10px;
font-size: 12px;
}
.current{
background-color: antiquewhite;
}
</style>
<body>
<div id="wrap">
<ul>
<li v-bind:class="{current:index==msg}" v-for="(item,index) in list" v-on:mouseenter="cl(index)">
{{item.title}}
</li>
</ul>
<section>
<div v-show="index==msg" v-for="(item,index) in list">
{{item.con1}}<br>
{{item.con2}}<br>
{{item.con3}}<br>
{{item.con4}}
</div>
</section>
</div>
</body>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el:'#wrap',
data:{
msg:0,
list:[
{
title:'公告',
con1:'95公益周阿里、腾讯等六家公司同台联合做公益',
con2:'淘宝造物节之城市秘密',
con3:'聚划算88红包省钱卡',
con4: ''
},
{
title:'规则',
con1:'新增《淘宝网汽配行业管理规范》公示通知',
con2:'《淘宝网区域零售服务说明》变更公示通知',
con3:'《淘宝网票务行业管理规范》变更公示通知',
con4:'《淘宝网数字娱乐市场须提供官方授权的商品目录》变更公示通知'
},
{
title:'论坛',
con1:'淘宝618大促报名',
con2:'金牌卖家志愿者招募',
con3:'618大促报名激励',
con4:'运营神器年中大促'
},
{
title:'安全',
con1:'魔豆妈妈公益项目',
con2:'让母爱永不打烊!',
con3:'卖家注意:风险通报!',
con4:'售假获刑又起诉!'
},
{
title:'公益',
con1:'淘宝公益平台正式更名',
con2:'益起来商家招募即将截止',
con3:'卖家如何设置公益宝贝',
con4:'公益机构开店全攻略'
}
]
},
methods:{
cl(index) {
this.msg=index;
console.log(this.msg);
}
}
})
</script>
</html>