Vue学习笔记
Vue学习
视频地址:https://www.bilibili.com/video/BV12J411m7MG
1. Vue基础
Vue简介
- JavaScript框架
- 简化Dom操作
- 响应式数据驱动
Vue官方文档:
Demo1:第一个程序,初步学会使用Vue。
<!DOCTYPE html>
<html lang="en">
<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>Vue基础</title>
<!-- 导入Vue.js文件 -->
<script src="vue.js"></script>
</head>
<body>
<div id="app">
{{ message }}
</div>
<script>
var app = new Vue({
el:'#app',
data:{
message:"Hello Vue!"
}
})
</script>
</body>
</html>
Demo2:认识Vue实例——el挂载点
<!DOCTYPE html>
<html lang="en">
<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>
<!-- Vue实例的作用范围是什么? -->
<!-- Vue会管理el选项命中元素以及其内部的后代元素。 -->
app元素外部:{{ message }}
<div id="app_1">
app元素内部:{{ message }}
<br>
<span>app元素内部的sapn标签下:{{ message }}</span>
</div>
<script>
var app = new Vue({
el:'#app_1',
data:{
message:"Hello Vue!"
}
})
</script>
<br>
<!-- 是否可以使用其他的选择器? -->
<!-- 可以,但是推荐使用id选择器,因为其他选择器都不唯一。 -->
<div class="app_2">
{{ message }}
</div>
<script>
var app = new Vue({
el:'.app_2',
data:{
message:"现在使用的class选择器"
}
})
</script>
<br>
<!-- 是否可以设置其他的DOM元素呢? -->
<!-- 可以,可以使用其他饿的双标签,单标签不能、html和body之上也不能挂载。 -->
<h2 id="app_3">
{{ message }}
</h2>
<script>
var app = new Vue({
el: '#app_3',
data:{
message:"这是H2元素"
}
})
</script>
</body>
</html>
Demo3:认识Vue实例——data数据对象
<!DOCTYPE html>
<html lang="en">
<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">
{{ message }}
<h2>{{ school.name }} {{ school.mobile }}</h2>
<ul>
<li>{{ campus[0] }}</li>
<li>{{ campus[1] }}</li>
<li>{{ campus[2] }}</li>
<li>{{ campus[3] }}</li>
</ul>
</div>
<!-- data:数据对象
Vue中用到的数据定义在data中;
data中可以写复杂类型的数据;
渲染复杂类型数据时,遵循js的语法即可。
-->
<script>
var app = new Vue({
el: '#app',
data:{
message:"你好,小黑。",
school:{
name:"黑马程序员",
mobile:"400-618-9090"
},
campus:["北京校区","上海校区","广州校区","深圳校区"]
}
})
</script>
</body>
</html>
2. Vue本地应用
通过Vue实现常见的网页效果
Vue指令
内容绑定,事件绑定。
显示切换,属性绑定。
列表循环,表单元素绑定。
Vue指令 | 作用 |
---|---|
v-text | 设置标签的内容(textContent) |
v-html | 设置元素的innerHTML |
v-on | 为元素绑定事件 |
v-show | 根据真假切换元素的显示状态 |
v-if | 根据表达式的真假切换元素的显示状态 |
v-bind | 为元素绑定属性 |
v-for | 根据数据生成列表结构 |
v-model | 便捷的设置和获取表单元素的值 |
v-text
Demo_v-text指令
<!DOCTYPE html>
<html lang="en">
<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>
<!-- v-text
v-text指令的作用是:设置标签的内容(textContent)
默认写法会替换全部内容,使用差值表达式{{}},可以替换指定内容
-->
<div id="app">
<h2 v-text="message"></h2>
<h2 v-text="info"></h2>
<h2>{{ message }}</h2>
<h2 v-text="message">深圳</h2>
<h2>{{ message }}深圳</h2>
<h2 v-text="message + '!!'"></h2>
<h2>{{ message + '!!'}}深圳</h2>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
message:"黑马程序员",
info:"前端与移动教研部"
}
})
</script>
</body>
</html>
v-html
Demo_v-html指令
<!DOCTYPE html>
<html lang="en">
<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>
<!-- v-html
v-html指令的作用是:设置元素的innerHTML;
内容中有html结构会被解析为标签;
v-text指令无论内容是什么,只会解析为文本。
-->
<div id="app">
<p v-html="content"></p>
<p v-text="content"></p>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
// content:"黑马程序员"
content: "<a href='http://www.itheima.com'>黑马程序员</a>"
}
})
</script>
</body>
</html>
v-on
Demo_v-on指令
<!DOCTYPE html>
<html lang="en">
<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>
<!-- v-on指令
v-on指令的作用是:为元素绑定事件
事件名不需要写on
指令可以简写为@
绑定的方法定义在methods属性中
方法内部通过this关键字可以访问定义在data中数据
-->
<div id="app">
<input type="button" value="事件绑定-点击" v-on:click="dolt">
<input type="button" value="事件绑定-双击" v-on:dblclick="dolt">
<!-- 简写 -->
<input type="button" value="事件绑定-简写点击" @click="dolt">
<h2 @click="change">{{ food }}</h2>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
food:"西蓝花炒鸡蛋"
},
methods:{
dolt:function(){
alert("做IT");
},
change:function(){
// console.log(this.food);
this.food += "好好吃!"
}
}
})
</script>
</body>
</html>
Demo_v-on指令补充
<!DOCTYPE html>
<html lang="en">
<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>
<!--
事件绑定的方法写成函数调用的形式,可以传入自定义参数
定义方法时需要定义形参来接受传入的实参
事件的后面跟上.修饰符可以对事件进行限制,例如.enter可以限制触发的按键为回车
-->
<div id="app">
<input type="button" value="点击" @click="doIt(666)">
<input type="text" @keyup.enter="sayHi">
</div>
<script>
var app = new Vue({
el:'#app',
methods:{
doIt:function(p1){
console.log("做It");
console.log(p1);
},
sayHi:function(){
alert("吃了没");
}
}
})
</script>
</body>
</html>
v-show
Demo_v-show指令
<!DOCTYPE html>
<html lang="en">
<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>
<!-- v-show
v-show指令的作用是:根据真假切换元素的显示状态
原理是修改元素的display,实现显示隐藏
指令后面的内容,最终都会解析为布尔值
值为true元素显示,值为false元素为隐藏
-->
<div id="app">
<input type="button" value="切换显示状态" @click="changeIsShow">
<img v-show="IsShow" src="1.png" alt="">
<br>
<span>{{ age }}</span>
<input type="button" value="年龄age增加" @click="changeAge">
<img v-show="age >= 18" src="1.png" alt="">
</div>
<script>
var app = new Vue({
el:'#app',
data:{
IsShow:false,
age:17
},
methods:{
changeIsShow:function(){
this.IsShow = ! this.IsShow;
},
changeAge:function(){
this.age++;
}
}
});
</script>
</body>
</html>
v-if
Demo_v-if指令
<!DOCTYPE html>
<html lang="en">
<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>
<!-- v-if指令
v-if指令的作用是根据表达式的真假切换元素的显示状态
本质是通过操纵dom元素来切换显示状态
表达式的值为true,元素存在于dom树中;表达式的值为false,从dom树中移除。
-->
<div id="app">
<button @click="ChangeShow">切换状态</button>
<p v-if="IsShow">我是一个p标签,由v-if控制</p>
<p v-show="IsShow">我是一个p标签,由v-show控制</p>
<p v-if="temperature >= 35">热死了!</p>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
IsShow:true,
temperature:40
},
methods:{
ChangeShow:function(){
this.IsShow = !this.IsShow;
}
}
});
</script>
</body>
</html>
v-bind
Demo_v-bind指令
<!DOCTYPE html>
<html lang="en">
<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>
<style>
.active{
border: 1px solid red;
}
</style>
</head>
<body>
<!-- v-bind指令
v-bind指令的作用是为元素绑定属性
完整写法是v-bind:属性名
简写的话可以直接省略v-bind,只保留 :属性名
-->
<div id="app">
全写:v-bind:src
<img v-bind:src="imgSrc" v-bind:title="imgTitle" alt="">
<br>
简写 :src
<img :src="imgSrc" :title="imgTitle + '!!!!'" alt="">
<br>
添加类_三元表达式
<button @click="toggleActive">点击我改变class属性</button>
<img :src="imgSrc" :title="imgTitle + '!!!!'" :class="isActive?'active':''" alt="">
<br>
添加类_对象方式
<button @click="toggleActive">点击我改变class属性</button>
<img :src="imgSrc" :title="imgTitle + '!!!!'" :class="{active:isActive}" alt="">
</div>
<script>
var app = new Vue({
el:'#app',
data:{
imgSrc:"http://www.itheima.com/images/logo.png",
imgTitle:"黑马程序员",
isActive:false
},
methods:{
toggleActive:function(){
this.isActive = !this.isActive;
}
}
});
</script>
</body>
</html>
v-for
Demo_v-for指令
<!DOCTYPE html>
<html lang="en">
<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>
<!--
v-for指令的作用是根据数据生成列表结构
数组经常和v-for结合使用
语法是(item,index) in 数据
item和index可以结合其他指令一起使用
数组长度的更新会同步到页面上,是响应式的
-->
<div id="app">
<ul>
<li v-for="item in Array">你好,{{ item }}</li>
</ul>
<h2 v-for="item in vegetables" :title="item.name">{{ item.name }}</h2>
<button @click="add">点我添加</button>
<button @click="remove">点我移除</button>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
Array:["张三","李四","王五","马六","二蛋"],
vegetables:[
{name:"葱花炒蛋"},
{name:"番茄炒蛋"}
]
},
methods:{
add:function(){
this.vegetables.push({ name:"韭菜炒蛋"});
},
remove:function(){
// 移除最左边的一个
this.vegetables.shift();
}
}
})
</script>
</body>
</html>
v-model
Demo_v-model指令
<!DOCTYPE html>
<html lang="en">
<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>
<!--
v-model指令的作用是便捷的设置和获取表单元素的值
绑定的数据会和表单元素值相关联
-->
<div id="app">
<input type="text" v-model="message" @keyup.enter="getMessage">
<h2>{{ message }}</h2>
<input type="button" value="点我修改" @click="setMessage">
</div>
<script>
var app = new Vue({
el:'#app',
data:{
message:"黑马程序员"
},
methods:{
getMessage:function(){
alert(this.message);
},
setMessage:function(){
this.message = "111";
}
}
});
</script>
</body>
</html>
案例1 计数器
<!DOCTYPE html>
<html lang="en">
<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>
<!-- 计数器
创建Vue示例时:el(挂载点)、data(数据)、methods(方法)
v-on指令的作用是绑定事件,简写为@
方法中通过this关键字获取data中的数据
v-text指令的作用是设置元素的文本值,简写为{{}}
-->
<div class="input-num" id="app">
<button @click='reduce'>-</button>
<span>{{ num }}</span>
<button @click='add'>+</button>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
num:1
},
methods:{
reduce:function(){
console.log("reduce")
if(this.num == 1){
alert("不能为0")
}
else{
this.num--;
}
},
add:function(){
console.log("add")
if(this.num>=9){
alert("不能超过10个")
}
else{
this.num++;
}
}
}
});
</script>
</body>
</html>
案例2 图片切换
<!DOCTYPE html>
<html lang="en">
<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>
<!-- 图片切换
列表数据使用数组保存
v-bind指令可以设置元素属性,比如src
v-show和v-if都可以切换元素的显示状态,频繁切换用v-show
-->
<div id="app">
<img :src="imgArray[index]" alt="">
<a href="#" @click="prev" v-show="index>0">上一张</a>
<a href="#" @click="next" v-show="index<imgArray.length-1">下一张</a>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
imgArray:["https://img20.360buyimg.com/pop/s590x470_jfs/t1/222408/26/6055/99082/61b997c0Ead36013d/9b2da06b3f438624.jpg.webp",
"https://img14.360buyimg.com/pop/s590x470_jfs/t1/208171/7/13900/69634/61c96765E6e65374c/642ed952f9778144.jpg.webp",
"https://imgcps.jd.com/ling4/100012043978/5Lqs6YCJ5aW96LSn/5L2g5YC85b6X5oul5pyJ/p-5f3a47329785549f6bc7a6f4/a10ab487/cr/s/q.jpg",
"https://img12.360buyimg.com/pop/s590x470_jfs/t1/205354/16/17988/82004/61b1dc96Ee600f3f3/9ffa616349105df0.png.webp"
],
index:0,
},
methods:{
prev:function(){
this.index--;
},
next:function(){
this.index++;
}
}
});
</script>
</body>
</html>
案例3 小黑记事本
<!--
列表结构可以通过v-for指令结合数据生成
v-on结合事件修饰符可以对事件进行限制,比如.enter
v-on在绑定事件时可以传递自定义参数
通过v-model可以快速的设置和获取表单元素的值
基于数据的开发方式
-->
<!DOCTYPE html>
<html lang="en">
<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>
<!-- 主体区域 -->
<section id="todoapp">
<!-- 输入框 -->
<header class="header">
<h1>小黑笔记本</h1>
<input v-model="inputValue" @keyup.enter="add" type="text" autofocus="autofocus" autocomplete="off" placeholder="请输入任务" class="new_todo">
</header>
<!-- 列表区域 -->
<section class="main">
<ul class="to_list">
<li class="todo" v-for="(item,index) in list">
<div class="view">
<span class="index">{{ index+1 }}</span>
<label>{{ item }}</label>
<button @click="remove(index)" class="destory">×</button>
</div>
</li>
</ul>
</section>
<!-- 统计和清空 -->
<footer class="footer">
<span class="todo_count" v-if="list.length!=0">
<strong>{{ list.length }}</strong>
items left
</span>
<button @click="clear" class="clear_completed" v-show="list.length!=0">Clear</button>
</footer>
</section>
<!-- 底部 -->
<footer class="info">
</footer>
<!-- JS -->
<script>
var app = new Vue({
el:'#todoapp',
data:{
list:["写代码","吃饭饭","睡觉觉"],
inputValue:"好好学习", //用来获取用户输入的内容
},
methods:{
add:function(){
this.list.push(this.inputValue);
},
remove:function(index){
console.log("1")
this.list.splice(index,1);
},
clear:function(){
this.list = [];
}
}
})
</script>
</body>
</html>
3. Vue网络应用
axios的使用
<!--
axios在线地址:
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
随机获取笑话的接口
请求地址: https://autumnfish.cn/api/joke/list
请求方法:get
请求参数:num
num——笑话条数——类型为数字
响应内容:随机笑话
用户注册接口1
请求地址: https://autumnfish.cn/api/user/reg
请求方法:post
请求参数:usename
num——用户名——不能为空
响应内容:注册成功或者失败 -->
<!--
axios必须先导入才可以使用
使用get或者post方法即可发送对应的请求
then方法中的回调函数会在请求成功或者失败时触发
通过回调函数的形参可以获取响应内容或者错误信息
-->
<!DOCTYPE html>
<html lang="en">
<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>
<!-- 官网提供的axios在线地址 -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<input type="button" value="get请求" class="get">
<input type="button" value="post请求" class="post">
<!-- 随机获取笑话接口 -->
<script>
document.querySelector(".get").onclick = function(){
axios.get("https://autumnfish.cn/api/joke/list?num=3")
.then(function(response){
console.log(response);
},function(err){
console.log(err);
})
}
</script>
<!-- 用户注册接口 -->
<script>
document.querySelector(".post").onclick = function(){
//post的数据是放到第二个参数里面写的
axios.post("https://autumnfish.cn/api/user/reg",{username:"张三aichidoya"})
.then(function(response){
console.log(response);
}),function(err){
console.log(err)
}
}
</script>
</body>
</html>
axios + vue 的使用
<!--
axios回调函数中的this已经改变,无法访问到data中数据,
把this保存起来,回调函数中直接使用保存的this的变量即可。
-->
<!DOCTYPE html>
<html lang="en">
<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>
<!-- 官网提供的axios在线地址 -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="vue.js"></script>
</head>
<body>
<div id="app">
<input type="button" value="获取笑话" @click="getjoke">
<p>{{ joke }}</p>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
joke:"笑话"
},
methods:{
getjoke:function(){
// this会变,所以我们现在外边获取到this赋值到that。
var that = this;
axios.get("https://autumnfish.cn/api/joke")
.then(
function(response){
that.joke = response.data;
},
function(err){
console.log(err);
that.joke = "获取笑话失败哦"
}
)
}
}
})
</script>
</body>
</html>
案例4 天知道
<!-- 查询天气的应用 -->
<!--
回车查询
按下回车(v-on .enter)
查询数据(axios接口 v-model)
渲染数据(v-for 数组 that)
天气接口:
请求地址:http://wthrcdn.etouch.cn/weather_mini
请求方法:get
请求参数:city(查询城市名)
响应内容:天气信息
点击查询
点击城市(v-on 自定义参数)
查询数据(this关键字)
渲染数据
-->
<!--
应用的逻辑代码建议和页面分离,使用单独的js文件编写
axios回调函数中this指向改变了,需要额外的保存一份
-->
<!--
自定义参数可以让代码的复用性更高
methods中定义的方法内部,可以通过this关键字点出其他的方法
-->
<!DOCTYPE html>
<html lang="en">
<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>天知道</title>
<link rel="stylesheet" href="快速入门Vue.js资料\04-源代码\demo-天知道\css\index.css">
<link rel="stylesheet" href="快速入门Vue.js资料\04-源代码\demo-天知道\css\reset.css" />
</head>
<body>
<div class="wrap" id="app">
<div class="search_form">
<div class="logo"><img src="快速入门Vue.js资料\04-源代码\demo-天知道\img\logo.png" alt="logo" /></div>
<div class="form_group">
<input type="text" v-model="city" @keyup.enter="searchWeather" class="input_txt" placeholder="请输入查询的天气"/>
<button class="input_sub" @click="searchWeather">
搜 索
</button>
</div>
<div class="hotkey">
<a href="javascript:;" @click="changeCity('北京')">北京</a>
<a href="javascript:;" @click="changeCity('上海')">上海</a>
<a href="javascript:;" @click="changeCity('广州')">广州</a>
<a href="javascript:;" @click="changeCity('深圳')">深圳</a>
</div>
</div>
<ul class="weather_list">
<li v-for="item in weatherList">
<!-- 天气类型 -->
<div class="info_type">
<span class="iconfont">{{ item.type }}</span>
</div>
<!-- 天气温度 -->
<div class="info_temp">
<b>{{ item.low }}</b>
~
<b>{{ item.high }}</b>
</div>
<!-- 日期 -->
<div class="info_date">
<span>{{ item.date }}</span>
</div>
</li>
</ul>
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 官网提供的 axios 在线地址 -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<!-- 自己的js -->
<script>
var app = new Vue({
el:'#app',
data:{
city:"",
weatherList:[]
},
methods:{
searchWeather:function(){
var that = this;
axios.get("http://wthrcdn.etouch.cn/weather_mini?city="+this.city)
.then(
function(response){
console.log(response.data.data.forecast);
that.weatherList = response.data.data.forecast;
},
function(err){
console.log(err);
}
)
},
changeCity:function(city){
this.city = city;
this.searchWeather();
}
}
})
</script>
</body>
</html>
4. Vue综合应用
案例5 音乐播放器
本篇文章用于作者本人学习回顾时使用。