接下来咱门班的web项目阶段,由我带领大家去学习。
vue.js是目前前端web开发最流行的工具库,由尤雨溪在2014年2月发布的。
另外几个常见的工具库:react.js /angular.js/jQuery
官方网站:
中文:https://cn.vuejs.org/
英文:https://vuejs.org/
官方文档:https://cn.vuejs.org/v2/guide/
vue.js目前有1.x、2.x和3.x 版本,我们学习2.x版本的。
在github下载:
在官网下载地址: https://cn.vuejs.org/v2/guide/installation.html
vue的引入类似于jQuery,开发中可以使用开发版本vue-x.x.x.js,产品上线要换成vue.min.js。
下图是github网站下载的vue.js目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ismu0G2b-1595157631722)(E:/python八期/北京python27期荏苒项目/day104/assets/1544363032042.png)]
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script src="js/vue.js">script>
<script>
window.onload = function(){
// vue.js的代码开始于一个Vue对象。所以每次操作数据都要声明Vue对象开始。
var vm = new Vue({
el:'#app', // 设置当前vue对象要控制的标签范围。
data:{
// data是将要展示到HTML标签元素中的数据。
message: 'hello world!',
}
});
}
script>
head>
<body>
<div id="app">
<p>{
{ message }}p>
div>
body>
html>
总结:
1. vue的使用要从创建Vue对象开始
var vm = new Vue();
2. 创建vue对象的时候,需要传递参数,是json对象,json对象对象必须至少有两个属性成员
var vm = new Vue({
el:"#app",
data: {
数据变量:"变量值",
数据变量:"变量值",
数据变量:"变量值",
},
});
el:设置vue可以操作的html内容范围,值一般就是css的id选择器。
data: 保存vue.js中要显示到html页面的数据。
3. vue.js要控制器的内容范围,必须先通过id来设置。
<div id="app">
<h1>{
{message}}h1>
<p>{
{message}}p>
div>
MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式。
Model
指代的就是vue对象的data属性里面的数据。这里的数据要显示到页面中。
View
指代的就是vue中数据要显示的HTML页面,在vue中,也称之为“视图模板” 。
ViewModel
指代的是vue.js中我们编写代码时的vm对象了,它是vue.js的核心,负责连接 View 和 Model,保证视图和数据的一致性,所以前面代码中,data里面的数据被显示中p标签中就是vm对象自动完成的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kXJ3wZgN-1595157631725)(E:/python八期/北京python27期荏苒项目/day104/assets/201105031754285061.png)]
编写代码,让我们更加清晰的了解MVVM:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="js/vue.min.js">script>
<script>
window.onload = function(){
// 创建vm对象
var vm = new Vue({
el: "#app",
data: {
name:"大标题",
age:16,
},
})
}
script>
head>
<body>
<div id="app">
<h1>{
{name}}h1>
<p>{
{age}}p>
<input type="text" v-model="name">
div>
body>
html>
在浏览器中可以在 console.log通过 vm对象可以直接访问el和data属性,甚至可以访问data里面的数据
console.log(vm.$el) # #box vm对象可以控制的范围
console.log(vm.$data); # vm对象要显示到页面中的数据
console.log(vm.$data.message); # 访问data里面的数据
console.log(vm.message);# 这个 message就是data里面声明的数据,也可以使用 vm.变量名显示其他数据,message只是举例.
总结:
1. 如果要输出data里面的数据作为普通标签的内容,需要使用{
{ }}
用法:
vue对象的data属性:
data:{
name:"小明",
}
标签元素:
{
{ name }}
2. 如果要输出data里面的数据作为表单元素的值,需要使用vue.js提供的元素属性v-model
用法:
vue对象的data属性:
data:{
name:"小明",
}
表单元素:
使用v-model把data里面的数据显示到表单元素以后,一旦用户修改表单元素的值,则data里面对应数据的值也会随之发生改变,甚至,页面中凡是使用了这个数据都会发生变化。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="js/vue.min.js">script>
<script>
window.onload = function(){
var vm = new Vue({
el:"#app",
data:{
str1: "hello",
num: 20,
price: 7.1,
url1: "http://www.baidu.com",
url2: "http://www.taobao.com"
}
})
}
script>
head>
<body>
<p>{
{ str1 }}p>
<p>{
{ str1.split("").reverse().join("") }}p>
<p>num和num2中比较大的数是:{
{ num>num2? num:num2 }}p>
<input type="text" v-model="name">
<p>{
{(price+0.8).toFixed(2)}}p>
body>
html>
双花括号仅用输出文本内容,如果要输出html代码,则不能使用这个.要使用v-html来输出.
v-html必须在html标签里面作为属性写出来.
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="js/vue.js">script>
head>
<body>
<div class="app">
<h1>{
{title}}h1>
<h3>{
{url1}}h3>
{
{img}}<br>
<span v-html="img">span>
div>
<script>
let vm = new Vue({
el:".app",
data:{
title:"我的vue",
url1:"我的收获地址",
img:'',
}
})
script>
body>
html>
总结:
1. 可以在普通标签中使用{
{ }} 或者 v-html 来输出data里面的数据
{
{message}}
2. 可以在表单标签中使用v-model属性来输出data里面的数据,同时还可以修改data里面的数据
在输出内容到普通标签的使用{ { }}
v-model或者v-html等vue提供的属性,或者 { {}} 都支持js代码。
<h1>{
{str1.split("").reverse().join("")}}h1>
<h1>{
{num1+3}}h1>
<h1>num1和num2之间进行比较,最大值:{
{ num2>num1?num2:num1 }}h1>
例子:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue的快速使用title>
<script src="js/vue.js">script>
head>
<body>
<div id="app">
<p>{
{url}}p>
<div>{
{text}}div>
<div v-html="text">div>
<input v-model="url">
<div>num是{
{num%2==0?'偶数':'奇数'}}div>
<div>num的下一个数字:{
{num-0+1}}div>
<input type="text" v-model="num">
<div>{
{message.split("").reverse().join("")}}div>
<input type="text" v-model="message">
div>
<script>
var vm = new Vue({
el:"#app", // 设置vue对象控制的标签范围
data:{
// vue要操作的数据
url:"http://www.luffycity.com",
text:"大标题
",
num: 100,
message:"abcdef",
},
})
script>
body>
html>
vue中提供了两个指令可以用于判断是否要显示元素,分别是v-if和v-show。
标签元素:
<h1 v-if="ok">Yesh1>
data数据:
data:{
ok:false // true则是显示,false是隐藏
}
v-else指令来表示 v-if 的“else 块”,v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。
标签元素:
<h1 v-if="ok">Yesh1>
<h1 v-else>Noh1>
data数据:
data:{
ok:false // true则是显示,false是隐藏
}
可以出现多个v-else-if语句,但是v-else-if之前必须有一个v-if开头。后面可以跟着v-else,也可以没有。
标签元素:
<h1 v-if="num==1">num的值为1h1>
<h1 v-else-if="num==2">num的值为2h1>
<h1 v-else>num的值是{
{num}}h1>
data数据:
data:{
num:2
}
用法和v-if大致一样,区别在于2点:
标签元素:
<h1 v-show="ok">Hello!h1>
data数据:
data:{
ok:false // true则是显示,false是隐藏
}
在vue中,可以通过v-for指令可以将一组数据渲染到页面中,数据可以是数组或者对象。
数据是数组:
<ul>
<li v-for="book in book_list">{
{book.title}}li>
ul>
<ul>
<li v-for="(book, index) in book_list">第{
{ index+1}}本图书:{
{book.title}}li>
ul>
<script>
var vm1 = new Vue({
el:"#app",
data:{
book_list:[
{
"id":1,"title":"图书名称1","price":200},
{
"id":2,"title":"图书名称2","price":200},
{
"id":3,"title":"图书名称3","price":200},
{
"id":4,"title":"图书名称4","price":200},
]
}
})
script>
数据是对象:
<ul>
<li v-for="value in book">{
{value}}li>
ul>
<ul>
<li v-for="attr, value in book">{
{attr}}:{
{value}}li>
ul>
<script>
var vm1 = new Vue({
el:"#app",
data:{
book: {
// "attr":"value"
"id":11,
"title":"图书名称1",
"price":200
},
},
})
script>
完成练习:
goods:[
{"name":"python入门","price":150},
{"name":"python进阶","price":100},
{"name":"python高级","price":75},
{"name":"python研究","price":60},
{"name":"python放弃","price":110},
]
# 把上面的数据采用table表格输出到页面,价格大于60的数据需要添加背景色橙色[orange]
过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中。
定义过滤器的方式有两种。
Vue.filter("RMB1", function(v){
//就是来格式化(处理)v这个数据的
if(v==0){
return v
}
return v+"元";
})
var vm = new Vue({
el:"#app",
data:{
},
filters:{
RMB2:function(value){
if(value==''){
return;
}else{
return '¥ '+value;
}
}
}
});
代码演示:
js/filter.js,代码:
// 1. 全局过滤器
/* Vue.filter("过滤器名称", function(data){
// 过滤的代码编写到这里
});
*/
Vue.filter("RMB", function(data){
return "¥"+data;
});
Vue.filter("dot", function(data,digit){
// digit 保留小数位
return data.toFixed(digit);
});
过滤器.html,代码:
Title
标题
价格
{
{item.name}}
{
{item.price|dot(3)|RMB|total}}
我们之前学习过字符串反转,如果直接把反转的代码写在元素中,则会使得其他同事在开发时时不易发现数据被调整了,所以vue提供了一个计算属性(computed),可以让我们把调整data数据的代码存在在该属性中。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="js/vue.min.js">script>
<script>
window.onload = function(){
var vm = new Vue({
el:"#app",
data:{
str1: "abcdefgh"
},
computed:{
//计算属性:里面的函数都必须有返回值
strRevs: function(){
var ret = this.str1.split("").reverse().join("");
return ret
}
}
});
}
script>
head>
<body>
<div id="app">
<p>{
{ str1 }}p>
<p>{
{ strRevs }}p>
div>
body>
html>
侦听属性,可以帮助我们侦听data某个数据的变化,从而做相应的自定义操作。
侦听属性是一个对象,它的键是要监听的对象或者变量,值一般是函数,当侦听的data数据发生变化时,会自定执行的对应函数,这个函数在被调用时,vue会传入两个形参,第一个是变化前的数据值,第二个是变化后的数据值。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="js/vue.min.js">script>
<script>
window.onload = function(){
var vm = new Vue({
el:"#app",
data:{
num:20
},
watch:{
num:function(newval,oldval){
//num发生变化的时候,要执行的代码
console.log("num已经发生了变化!");
}
}
})
}
script>
head>
<body>
<div id="app">
<p>{
{ num }}p>
<button @click="num++">按钮button>
div>
body>
html>
每个Vue对象在创建时都要经过一系列的初始化过程。在这个过程中Vue.js会自动运行一些叫做生命周期的的钩子函数,我们可以使用这些函数,在对象创建的不同阶段加上我们需要的代码,实现特定的功能。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="js/vue.min.js">script>
<script>
window.onload = function(){
var vm = new Vue({
el:"#app",
data:{
num:0
},
beforeCreate:function(){
console.log("beforeCreate,vm对象尚未创建,num="+ this.num); //undefined
this.name=10; // 此时没有this对象呢,所以设置的name无效,被在创建对象的时候被覆盖为0
},
created:function(){
console.log("created,vm对象创建完成,设置好了要控制的元素范围,num="+this.num ); // 0
this.num = 20;
},
beforeMount:function(){
console.log( this.$el.innerHTML ); // {
{num}}
console.log("beforeMount,vm对象尚未把data数据显示到页面中,num="+this.num ); // 20
this.num = 30;
},
mounted:function(){
console.log( this.$el.innerHTML ); // 30
console.log("mounted,vm对象已经把data数据显示到页面中,num="+this.num); // 30
},
beforeUpdate:function(){
// this.$el 就是我们上面的el属性了,$el表示当前vue.js所控制的元素#app
console.log( this.$el.innerHTML ); // 30
console.log("beforeUpdate,vm对象尚未把更新后的data数据显示到页面中,num="+this.num); // beforeUpdate----31
},
updated:function(){
console.log( this.$el.innerHTML ); // 31
console.log("updated,vm对象已经把过呢更新后的data数据显示到页面中,num=" + this.num ); // updated----31
},
});
}
script>
head>
<body>
<div id="app">
<p>{
{num}}p>
<button @click="num++">按钮button>
div>
body>
html>
总结:
在vue使用的过程中,如果要初始化操作,把初始化操作的代码放在 mounted 中执行。
mounted阶段就是在vm对象已经把data数据实现到页面以后。一般页面初始化使用。例如,用户访问页面加载成功以后,就要执行的ajax请求。
另一个就是created,这个阶段就是在 vue对象创建以后,把ajax请求后端数据的代码放进 created
在vue的视图模板中,除了提供了大量的指令以外,还提供了一些指令的修饰符。让更好的使用事件指令。
.stop # 阻止事件冒泡
.prevent # 阻止页面刷新,常用于阻止a标签点击刷新页面和submit提交刷新页面
.once # 设置当前事件只能执行一遍
使用.stop和.prevent
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<style>
.box1{
width: 200px;
height: 200px;
background: #ccc;
}
.box2{
width: 100px;
height: 100px;
background: pink;
}
style>
<script src="js/vue.min.js">script>
<script>
window.onload = function(){
var vm = new Vue({
el:"#app",
data:{
}
})
}
script>
head>
<body>
<div id="app">
<div class="box1" @click="alert('box1')">
<div class="box2" @click.stop.prevent="alert('box2')">div>
div>
<form action="#">
<input type="text">
<input type="submit">
<input type="submit" value="提交02" @click.prevent="">
form>
div>
body>
html>
我的计划列表
html代码:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>todolisttitle>
<style type="text/css">
.list_con{
width:600px;
margin:50px auto 0;
}
.inputtxt{
width:550px;
height:30px;
border:1px solid #ccc;
padding:0px;
text-indent:10px;
}
.inputbtn{
width:40px;
height:32px;
padding:0px;
border:1px solid #ccc;
}
.list{
margin:0;
padding:0;
list-style:none;
margin-top:20px;
}
.list li{
height:40px;
line-height:40px;
border-bottom:1px solid #ccc;
}
.list li span{
float:left;
}
.list li a{
float:right;
text-decoration:none;
margin:0 10px;
}
style>
head>
<body>
<div class="list_con">
<h2>To do listh2>
<input type="text" name="" id="txt1" class="inputtxt">
<input type="button" name="" value="增加" id="btn1" class="inputbtn">
<ul id="list" class="list">
<li>
<span>学习htmlspan>
<a href="javascript:;" class="up"> ↑ a>
<a href="javascript:;" class="down"> ↓ a>
<a href="javascript:;" class="del">删除a>
li>
<li><span>学习cssspan><a href="javascript:;" class="up"> ↑ a><a href="javascript:;" class="down"> ↓ a><a href="javascript:;" class="del">删除a>li>
<li><span>学习javascriptspan><a href="javascript:;" class="up"> ↑ a><a href="javascript:;" class="down"> ↓ a><a href="javascript:;" class="del">删除a>li>
ul>
div>
body>
html>
特效实现效果:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>todolisttitle>
<style type="text/css">
.list_con{
width:600px;
margin:50px auto 0;
}
.inputtxt{
width:550px;
height:30px;
border:1px solid #ccc;
padding:0px;
text-indent:10px;
}
.inputbtn{
width:40px;
height:32px;
padding:0px;
border:1px solid #ccc;
}
.list{
margin:0;
padding:0;
list-style:none;
margin-top:20px;
}
.list li{
height:40px;
line-height:40px;
border-bottom:1px solid #ccc;
}
.list li span{
float:left;
}
.list li a{
float:right;
text-decoration:none;
margin:0 10px;
}
style>
<script src="js/vue.js">script>
head>
<body>
<div id="todolist" class="list_con">
<h2>To do listh2>
<input type="text" v-model="message" class="inputtxt">
<input type="button" @click="addItem" value="增加" class="inputbtn">
<ul id="list" class="list">
<li v-for="item,key in dolist">
<span>{
{item}}span>
<a @click="upItem(key)" class="up" > ↑ a>
<a @click="downItem(key)" class="down"> ↓ a>
<a @click="delItem(key)" class="del">删除a>
li>
ul>
div>
<script>
// 计划列表代码
let vm = new Vue({
el:"#todolist",
data:{
message:"",
dolist:[
"学习html",
"学习css",
"学习javascript",
]
},
methods:{
addItem(){
if(this.messsage==""){
return false;
}
this.dolist.push(this.message);
this.message = ""
},
delItem(key){
// 删除和替换
// 参数1: 开始下表
// 参数2: 元素长度,如果不填默认删除到最后
// 参数3: 表示使用当前参数替换已经删除内容的位置
this.dolist.splice(key, 1);
},
upItem(key){
if(key==0){
return false;
}
// 向上移动
let result = this.dolist.splice(key,1);
this.dolist.splice(key-1,0,result[0]);
},
downItem(key){
// 向下移动
let result = this.dolist.splice(key, 1);
console.log(result);
this.dolist.splice(key+1,0,result[0]);
}
}
})
script>
body>
html>
vue.js默认没有提供ajax功能的。
所以使用vue的时候,一般都会使用axios的插件来实现ajax与后端服务器的数据交互。
注意,axios本质上就是javascript的ajax封装,所以会被同源策略限制。
下载地址:
https://unpkg.com/[email protected]/dist/axios.js
https://unpkg.com/[email protected]/dist/axios.min.js
使用文档:https://www.kancloud.cn/yunye/axios/234845
axios提供发送http请求的常用方法有两个:axios.get() 和 axios.post() 。
增 post
删 delete
改 put/patch
查 get
// 发送get请求
// 参数1: 必填,字符串,请求的数据接口的url地址,例如请求地址:http://www.baidu.com?id=200
// 参数2:可选,请求参数和请求头内容,json对象,要提供给数据接口的参数
axios.get('服务器的资源地址',{
// http://www.baidu.com
params:{
参数名:'参数值', // id: 200,
},
headers:{
选项名:'选项值', // 请求头
}
}).then(function (response) {
// 请求成功以后的回调函数
console.log("请求成功");
console.log(response.data); // 获取服务端提供的数据
}).catch(function (error) {
// 请求失败以后的回调函数
console.log("请求失败");
console.log(error.response); // 获取错误信息
});
// 发送post请求,参数和使用和axios.get()类似。
// 参数1: 必填,字符串,请求的数据接口的url地址
// 参数2:必填,json对象,要提供给数据接口的参数,如果没有参数,则必须使用{}
// 参数3:可选,json对象,请求头信息
axios.put('服务器的资源地址',{
username: 'xiaoming',
password: '123456'
},{
headers:{
选项名:"选项值",
}
})
.then(function (response) {
// 请求成功以后的回调函数
console.log(response);
})
.catch(function (error) {
// 请求失败以后的回调函数
console.log(error);
});
// b'firstName=Fred&lastName=Flintstone'
json是 JavaScript Object Notation 的首字母缩写,单词的意思是javascript对象表示法,这里说的json指的是类似于javascript对象的一种数据格式。
json的作用:在不同的系统平台,或不同编程语言之间传递数据。
json数据对象类似于JavaScript中的对象,但是它的键对应的值里面是没有函数方法的,值可以是普通变量,不支持undefined,值还可以是数组或者json对象。
// 原生的js的json对象
var obj = {
age:10,
sex: '女',
work:function(){
return "好好学习",
}
}
// json数据的对象格式,json数据格式,是没有方法的,只有属性,属性值:字符串,数值(整数,浮点数,布尔值), json,
{
"name":"tom",
"age":18
}
// json数据的数组格式:
["tom",18,"programmer"]
复杂的json格式数据可以包含对象和数组的写法。
{
"name":"小明",
"age":200,
"is_delete": false,
"fav":["code","eat","swim","read"],
"son":{
"name":"小小明",
"age":100,
"lve":["code","eat"]
}
}
// 数组结构也可以作为json传输数据。
json数据可以保存在.json文件中,一般里面就只有一个json对象。
总结:
1. json文件的后缀是.json
2. json文件一般保存一个单一的json数据
3. json数据的属性不能是方法或者undefined,属性值只能:数值[整数,小数,布尔值]、字符串、json和数组
4. json数据只使用双引号、每一个属性成员之间使用逗号隔开,并且最后一个成员没有逗号。
{
"name":"小明",
"age":200,
"fav":["code","eat","swim","read"],
"son":{
"name":"小小明",
"age":100
}
}
工具:postman可以用于测试开发的数据接口。
javascript提供了一个JSON对象来操作json数据的数据转换.
方法 | 参数 | 返回值 | 描述 |
---|---|---|---|
stringify | json对象 | 字符串 | json对象转成字符串 |
parse | 字符串 | json对象 | 字符串格式的json数据转成json对象 |
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<script>
// json语法
let humen = {
"username":"xiaohui",
"password":"1234567",
"age":20
};
console.log(humen);
console.log(typeof humen);
// JSON对象提供对json格式数据的转换功能
// stringify(json对象) # 用于把json转换成字符串
let result = JSON.stringify(humen);
console.log(result);
console.log(typeof result);
// parse(字符串类型的json数据) # 用于把字符串转成json对象
let json_str = '{"password":"1123","age":20,"name":"xiaobai"}';
console.log(json_str)
console.log(typeof json_str)
let json_obj = JSON.parse(json_str);
console.log(json_obj);
console.log(typeof json_obj)
console.log(json_obj.age)
script>
body>
html>
ajax,一般中文称之为:“阿贾克斯”,是英文 “Async Javascript And Xml”的简写,译作:异步js和xml数据传输数据。
ajax的作用: ajax可以让js代替浏览器向后端程序发送http请求,与后端通信,在用户不知道的情况下操作数据和信息,从而实现页面局部刷新数据/无刷新更新数据。
所以开发中ajax是很常用的技术,主要用于操作后端提供的数据接口
,从而实现网站的前后端分离
。
ajax技术的原理是实例化js的XMLHttpRequest对象,使用此对象提供的内置方法就可以与后端进行数据通信。
数据接口,也叫api接口,表示后端提供
操作数据/功能的url地址给客户端使用。
客户端通过发起请求向服务端提供的url地址申请操作数据【操作一般:增删查改】
同时在工作中,大部分数据接口都不是手写,而是通过函数库/框架来生成。
ajax的使用必须与服务端程序配合使用,但是目前我们先学习ajax的使用,所以暂时先不涉及到服务端python代码的编写。因此,我们可以使用别人写好的数据接口进行调用。
jQuery将ajax封装成了一个函数$.ajax(),我们可以直接用这个函数来执行ajax请求。
接口 | 地址 |
---|---|
天气接口 | http://wthrcdn.etouch.cn/weather_mini?city=城市名称 |
音乐接口搜索 | http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.catalogSug&query=歌曲标题 |
音乐信息接口 | http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.song.play&songid=音乐ID |
编写代码获取接口提供的数据:
jQ版本
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="js/jquery-1.12.4.js">script>
<script>
$(function(){
$("#btn").on("click",function(){
$.ajax({
// 后端程序的url地址
url: 'http://wthrcdn.etouch.cn/weather_mini',
// 也可以使用method,提交数据的方式,默认是'GET',常用的还有'POST'
type: 'get',
dataType: 'json', // 返回的数据格式,常用的有是'json','html',"jsonp"
data:{
// 设置发送给服务器的数据,如果是get请求,也可以写在url地址的?后面
"city":'北京'
}
})
.done(function(resp) {
// 请求成功以后的操作
console.log(resp);
})
.fail(function(error) {
// 请求失败以后的操作
console.log(error);
});
});
})
script>
head>
<body>
<button id="btn">点击获取数据button>
body>
html>
vue版本:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="js/vue.js">script>
<script src="js/axios.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="city">
<button @click="get_weather">点击获取天气button>
div>
<script>
let vm = new Vue({
el:"#app",
data:{
city:"",
},
methods:{
get_weather(){
// http://wthrcdn.etouch.cn/weather_mini?city=城市名称
axios.get("http://wthrcdn.etouch.cn/weather_mini?city="+this.city)
.then(response=>{
console.log(response);
}).catch(error=>{
console.log(error.response)
});
// 上面的参数写法,也可以是下面这种格式:
// axios.get("http://wthrcdn.etouch.cn/weather_mini",{
// // get请求的附带参数
// params:{
// "city":"广州",
// }
// }).then(response=>{
// console.log(response.data); // 获取接口数据
// }).catch(error=>{
// console.log(error.response); // 获取错误信息
// })
}
}
})
script>
body>
html>
同源策略,是浏览器为了保护用户信息安全的一种安全机制。所谓的同源就是指代通信的两个地址(例如服务端接口地址与浏览器客户端页面地址)之间比较,是否协议、域名(IP)和端口相同。不同源的客户端脚本[javascript]在没有得到服务端的明确授权的情况下,浏览器会拒绝显示服务端信息提供给前端ajax。
ajax本质上还是javascript,是运行在浏览器中的脚本语言,所以会被受到浏览器的同源策略所限制。
前端地址:http://www.oldboy.cn/index.html |
是否同源 | 原因 |
---|---|---|
http://www.oldboy.cn/user/login.html |
是 | 协议、域名、端口相同 |
http://www.oldboy.cn/about.html |
是 | 协议、域名、端口相同 |
https://www.oldboy.cn:443/user/login.html |
否 | 协议不同 ( https和http ) |
http:/www.oldboy.cn:5000/user/login.html |
否 | 端口 不同( 5000和80) |
http://bbs.oldboy.cn/user/login.html |
否 | 域名不同 ( bbs和www ) |
同源策略针对ajax的拦截,代码:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="js/vue.js">script>
<script src="js/axios.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="music"><button @click="get_music">查询歌曲button>
div>
<script>
var vm = new Vue({
el:"#app",
data:{
music:"", // 歌曲标题
},
methods:{
get_music(){
axios.get(`http://tingapi.ting.baidu.com/v1/restserver/ting`,{
params:{
method:"baidu.ting.search.catalogSug",
query:this.music,
}
}).then(response=>{
console.log("查询数据成功!");
}).catch(error=>{
console.log("查询数据失败!");
})
}
}
})
script>
body>
html>
上面代码运行错误如下:
Access to XMLHttpRequest at 'http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.catalogSug&query=%E6%88%91%E7%9A%84%E4%B8%AD%E5%9B%BD%E5%BF%83' from origin 'http://localhost:63342' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
上面错误,关键词:Access-Control-Allow-Origin
只要出现这个关键词,就是访问受限。出现同源策略的拦截问题。
ajax跨域(跨源)方案:服务端授权[CORS],jsonp,服务端代理
CORS是一个W3C标准,全称是"跨域资源共享",它允许浏览器向跨源的后端服务器发出ajax请求,从而克服了AJAX只能同源使用的限制。
实现CORS主要依靠后端服务器中响应数据中设置响应头信息返回的。
django的视图[伪代码]
def post(request):
response = new Response()
response .set_header(“Access-Control-Allow-Origin”,“http://localhost:63342”)
return response;
// 在响应行信息里面设置以下内容:
Access-Control-Allow-Origin: ajax所在的域名地址
Access-Control-Allow-Origin: www.oldboy.cn # 表示只允许www.oldboy.cn域名的客户端的ajax跨域访问
// * 表示任意源,表示允许任意源下的客户端的ajax都可以访问当前服务端信息
Access-Control-Allow-Origin: *
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Apwqp7af-1595157631729)(E:/python八期/北京python27期荏苒项目/day106/assets/1556074087897.png)]
总结:
0. 同源策略:浏览器的一种保护用户数据的一种安全机制。
浏览器会限制ajax不能跨源访问其他源的数据地址。
同源:判断两个通信的地址之间,是否协议,域名[IP],端口一致。
ajax: http://127.0.0.1/index.html
api数据接口: http://localhost/index
这两个是同源么?不是同源的。是否同源的判断依据不会根据电脑来判断,而是通过协议、域名、端口的字符串是否来判断。
1. ajax默认情况下会受到同源策略的影响,一旦受到影响会报错误如下:
No 'Access-Control-Allow-Origin' header is present on the requested resource
2. 解决ajax只能同源访问数据接口的方式:
1. CORS,跨域资源共享,在服务端的响应行中设置:
Access-Control-Allow-Origin: 允许访问的域名地址
2. jsonp
3. 是否服务端代理
思路:通过python来请求对应的服务器接口,获取到数据以后,
组件(Component)是自定义封装的功能。在前端开发过程中,经常出现多个网页的功能是重复的,而且很多不同的页面之间,也存在同样的功能。
而在网页中实现一个功能,需要使用html定义功能的内容结构,使用css声明功能的外观样式,还要使用js来定义功能的特效,因此就产生了把一个功能相关的[HTML、css和javascript]代码封装在一起组成一个整体的代码块封装模式,我们称之为“组件”。
所以,组件就是一个html网页中的功能,一般就是一个标签,标签中有自己的html内容结构,css样式和js特效。
这样,前端人员就可以在组件化开发时,只需要书写一次代码,随处引入即可使用。
vue的组件有两种:默认组件[全局组件] 和 单文件组件
<div id="app">
<addnum>addnum>
<addnum>addnum>
<addnum>addnum>
<addnum>addnum>
<addnum>addnum>
div>
<script>
Vue.component("addnum",{
template:'',
data: function(){
// 写在这里的数据只有当前组件可以使用
return {
num:1,
}
}
});
var vm = new Vue({
el:"#app",
// 这里写的数据是全局公用的,整个文件共享
data:{
}
})
script>
前面学习了普通组件以后,接下来我们继续学习单文件组件则需要提前先安装准备一些组件开发工具。否则无法使用和学习单文件组件。
一般情况下,单文件组件,我们运行在 自动化工具vue-CLI中,可以帮我们编译单文件组件。所以我们需要在系统中先搭建vue-CLI工具,
官网:https://cli.vuejs.org/zh/
Vue CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11.0+)。
你可以直接在官网选择一个稳定的node.js偶数版本点击下载安装。【选择这个,则不需要看关于nvm的步骤,直接到6.1】
也可以使用 nvm 或 nvm-windows在同一台电脑中管理多个 Node 版本[方便切换node版本]。
nvm工具的下载和安装: https://www.jianshu.com/p/d0e0935b150a
https://www.jianshu.com/p/622ad36ee020
安装记录:
打开:https://github.com/coreybutler/nvm-windows/releases
安装完成以后,先查看环境变量是否设置好了.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v9QIJnvH-1595157631730)(E:/python八期/北京python27期荏苒项目/day107/assets/1552357036022.png)]
常用的nvm命令
nvm list # 列出目前在nvm里面安装的所有node版本
nvm install node版本号 # 安装指定版本的node.js
nvm uninstall node版本号 # 卸载指定版本的node.js
nvm use node版本号 # 切换当前使用的node.js版本
如果使用nvm工具,则直接可以不用自己手动下载,如果使用nvm下载安装 node的npm比较慢的时候,可以修改nvm的配置文件(在安装根目录下)
# settings.txt
root: C:\tool\nvm [这里的目录地址是安装nvm时自己设置的地址,要根据实际修改]
path: C:\tool\nodejs
arch: 64
proxy: none
node_mirror: http://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/
Node.js是一个新的后端(后台)语言,它的语法和JavaScript类似,所以可以说它是属于前端的后端语言,后端语言和前端语言的区别:
我们一般安装LTS(长线支持版本 Long-Time Support):
下载地址:https://nodejs.org/en/download/【上面已经安装了nvm,那么这里不用手动安装了】
node.js的版本有两大分支:
官方发布的node.js版本:0.xx.xx 这种版本号就是官方发布的版本
社区发布的node.js版本:xx.xx.x 就是社区开发的版本
Node.js如果安装成功,可以查看Node.js的版本,在终端输入如下命令:
node -v
在安装node.js完成后,在node.js中会同时帮我们安装一个npm包管理器npm。我们可以借助npm命令来安装node.js的包。这个工具相当于python的pip管理器。
npm install -g 包名 # 安装模块 -g表示全局安装,如果没有-g,则表示在当前项目安装
npm list # 查看当前目录下已安装的node包
npm view 包名 engines # 查看包所依赖的Node的版本
npm outdated # 检查包是否已经过时,命令会列出所有已过时的包
npm update 包名 # 更新node包
npm uninstall 包名 # 卸载node包
npm 命令 -h # 查看指定命令的帮助文档
补充:
默认的npm是默认下载国外的软件包来使用的。所以相对于我们当前的国内网络环境并不会友好。所以可以自己调整下npm的包服务器地址或者直接使用cnpm来管理包。
npm install -g cnpm --registry=https://registry.npm.taobao.org
执行上面命令以后,后面所有npm自己替换成cnpm
npm install -g vue-cli
如果安装速度过慢,一直超时,可以考虑切换npm镜像源:http://npm.taobao.org/
cnpm install -g vue-cli
使用vue自动化工具可以快速搭建单页应用项目目录。
该工具为现代化的前端开发工作流提供了开箱即用的构建配置。只需几分钟即可创建并启动一个带热重载、保存时静态检查以及可用于生产环境的构建配置的项目:
// 生成一个基于 webpack 模板的新项目
vue init webpack 项目目录名
例如:
vue init webpack myproject
// 启动开发服务器 ctrl+c 停止服务
cd myproject
npm run dev # 运行这个命令就可以启动node提供的测试http服务器
运行了上面代码以后,终端下会出现以下效果提示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tGPX8zie-1595157631731)(E:/python八期/北京python27期荏苒项目/day107/assets/1552187745456.png)]
那么访问:http://localhost:8080/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Pm0SlMN-1595157631733)(E:/python八期/北京python27期荏苒项目/day107/assets/1552187794989.png)]
.
├── build/ # 编译执行目录
├── dist/ # 一开始没有这个目录,将来项目开发完成部署项目时,
│ # 会使用npm build打包整个项目会生成一个结果,保存到这里
├── config/ # 项目运行配置目录,提供给测试服务器使用的。
│ ├── dev.env.js
│ ├── index.js
│ └── prod.env.js
├── node_modules/ # 项目的包存储目录,通过npm install安装的包都会被放到这个目录存储
├── index.html # 站点访问入口,整个项目所有的页面内容最终都会被加载到这个页面中进行展示
├── package.json # 整个项目的包列表记录文件
├── src/ # 主开发目录,将来客户端向的所有源代码全部在这个目录下
│ ├── App.vue # 根组件,这个组件将来会被main.js加载,由App.vue进行路由分发。【需要配置】
│ ├── components/ # 组件存储目录
│ ├── router/ # 路由目录[在安装了vue-router会自动生成]
│ └── main.js # 核心入口js文件,这里会被index.html加载,将来对项目进行初始化的代码都写在这
└── static/ # 静态文件存储目录[项目中的css/js/image]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mStvu2P9-1595157631733)(E:/python八期/北京python27期荏苒项目/day107/assets/page_structrue.png)]
整个项目是一个主文件index.html,index.html中会引入src文件夹中的main.js,main.js中会导入顶级单文件组件App.vue,App.vue中会通过组件嵌套或者路由来引用components文件夹中的其他单文件组件。
组件有两种:普通组件、单文件组件
普通组件的缺点:
将一个组件相关的html结构,css样式,以及交互的JavaScript代码从html文件中剥离出来,合成一个文件,这种文件就是单文件组件,相当于一个组件具有了结构、表现和行为的完整功能,方便组件之间随意组合以及组件的重用,这种文件的扩展名为“.vue”,比如:“Home.vue”。
在组件中编辑三个标签,编写视图、vm对象和css样式代码。
-
+
创建Home.vue
在App.vue组件中调用上面的组件
App.vue的内容
在开发vue项目之前,需要手动把 App.vue的HelloWorld组件代码以及默认的css样式,清楚。
上面的代码效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ux9oEKeE-1595157631734)(E:/python八期/北京python27期荏苒项目/day107/assets/1585022020667.png)]
有时候开发vue项目时,页面也可以算是一个大组件,同时页面也可以分成多个子组件.
因为,产生了父组件调用子组件的情况.
例如,我们可以声明一个组件,作为父组件
在components/创建一个保存子组件的目录HomeSon
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52SGqmhC-1595157631735)(E:/python八期/北京python27期荏苒项目/day107/assets/1552363669256.png)]
在HomeSon目录下,可以创建当前页面的子组件,例如,是Menu.vue
// 组件中代码必须写在同一个标签中
然后,在父组件中调用上面声明的子组件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HRmWblvr-1595157631735)(E:/python八期/北京python27期荏苒项目/day107/assets/1552363770013.png)]
最后,父组件被App.vue调用.就可以看到页面效果.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OVpGW28Y-1595157631737)(E:/python八期/北京python27期荏苒项目/day107/assets/1552363834171.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ksOaVxMD-1595157631738)(E:/python八期/北京python27期荏苒项目/day107/assets/1552363849977.png)]
效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QtMrDCwG-1595157631738)(E:/python八期/北京python27期荏苒项目/day107/assets/1552363702858.png)]
例如,我们希望把父组件的数据传递给子组件.
可以通过props属性来进行数据传递.
传递数据三个步骤:
在父组件中,调用子组件的组名处,使用属性值的方式往下传递数据
# 上面表示在父组件调用Menu子组件的时候传递了2个数据:
如果要传递变量[变量可以各种类型的数据],属性名左边必须加上冒号:,同时,属性名是自定义的,会在子组件中使用。
如果要传递普通字符串数据,则不需要加上冒号:
在子组件中接受上面父组件传递的数据,需要在vm组件对象中,使用props属性类接受。
// 上面 props属性中表示接受了两个数据。
在子组件中的template中使用父组件传递过来的数据.
效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WnWgEnz2-1595157631739)(E:/python八期/北京python27期荏苒项目/day107/assets/1552364511546.png)]
步骤流程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kDGll1jI-1595157631740)(E:/python八期/北京python27期荏苒项目/day107/assets/1552364590540.png)]
使用父组件传递数据给子组件时, 注意一下几点:
传递数据是变量,则需要在属性左边添加冒号.
传递数据是变量,这种数据称之为"动态数据传递"
传递数据不是变量,这种数据称之为"静态数据传递"
父组件中修改了数据,在子组件中会被同步修改,但是,子组件中的数据修改了,是不是影响到父组件中的数据.
这种情况,在开发时,也被称为"单向数据流"
在子组件中,通过this.$emit()
来调用父组件中定义的事件.
Post的子组件
{
{fnum}}
data={
{data}}
fnum={
{fnum}}
父组件中声明一个和子组件中this.$emit("自定义事件名称")
对应的事件属性。
num={
{num}}
父组件中,声明一个自定义方法,在事件被调用时,执行的。
作业:
使用组件化开发,完成之前的选项卡练习功能
使用组件化开发,完成之前的todolist功能
使用组件化开发,完成table表格[商品管理]的增删查改作业
补充:有余力的同学,可以采用组件嵌套的方式,把添加商品的弹窗作为子组件搭配使用。
默认情况下,我们的项目中并没有对axios包的支持,所以我们需要下载安装。
在项目根目录中使用 npm安装包
npm install axios
接着在main.js文件中,导入axios并把axios对象 挂载到vue属性中多为一个子对象,这样我们才能在组件中使用。
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App' // 这里表示从别的目录下导入 单文件组件
import axios from 'axios'; // 从node_modules目录中导入包
Vue.config.productionTip = false
Vue.prototype.$axios = axios; // 把对象挂载vue中
/* eslint-disable no-new */
new Vue({
el: '#app',
components: {
App },
template: ' '
});
<script>
export default{
。。。
methods:{
get_data:function(){
// 使用axios请求数据
this.$axios.get("http://wthrcdn.etouch.cn/weather_mini?city=深圳").then((response)=>{
console.log(response);
}).catch(error=>{
console.log(error);
})
}
}
}
</script>
效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jH4OmIu7-1595157631740)(E:/python八期/北京python27期荏苒项目/day107/assets/1552202922168.png)]
使用的时候,因为本质上来说,我们还是原来的axios,所以也会收到同源策略的影响。
cd 项目目录[荏苒资讯]
vue init webpack renran
例如,我要把项目保存在桌面下的子目录renran ~/Desktop/renran,可以如下操作:
cd Desktop/renran
vue init webpack renran_pc
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y468B87y-1595157631741)(E:/python八期/北京python27期荏苒项目/day108/assets/1581901045861.png)]
打开项目已经,在pycharm的终端下运行vue项目,查看效果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cRN1Acl6-1595157631743)(E:/python八期/北京python27期荏苒项目/day108/assets/1581901177538.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VfWPUyoc-1595157631744)(E:/python八期/北京python27期荏苒项目/day108/assets/1581901225429.png)]
上面的操作步骤,等同于执行了下面这句命令。
npm run dev
接下来,我们根据终端上效果显示的对应地址来访问项目(如果有多个vue项目在运行,8080端口被占据了,服务器会自动改端口,所以根据自己实际在操作中看到的地址来访问。)
访问:http://localost:8080
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sBb5XCX1-1595157631744)(E:/python八期/北京python27期荏苒项目/day108/assets/1581901294089.png)]
清除默认的HelloWorld.vue组件和APP.vue中的默认模板代码和默认css样式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s0hMKaHg-1595157631745)(E:/python八期/北京python27期荏苒项目/day108/assets/1581901419680.png)]
接下来,我们可以查看效果了,一张白纸~
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UnxEL78U-1595157631746)(E:/python八期/北京python27期荏苒项目/day108/assets/1556414476287.png)]
官方文档:https://router.vuejs.org/zh/
npm i vue-router -S
# npm install vue-router --save
在src目录下创建routes路由目录,在router目录下创建index.js路由文件
index.js路由文件中,编写初始化路由对象的代码 .
// 1. 引入vue和vue-router组件核心对象,并在vue中通过use注册vue-router组件
import Vue from "vue";
import Router from "vue-router";
Vue.use(Router);
// 2. 暴露vue-router对象,并在vue-router里面编写路由,提供给main.js调用
export default new Router({
// 设置路由模式为‘history’,去掉默认的#
mode: "history",
routes:[
// 路由列表
]
})
打开main.js文件,把router路由规则对象注册到vue中,代码:
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router/index';
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
components: {
App },
template: ' '
});
在App.vue组件中,添加显示路由对应的内容。代码:
注意:如果在vue创建项目的时候,设置安装vue-router,则项目会自动帮我们生成上面的router目录和index.js里面的代码,以及自动到main.js里面注册路由对象。
在我们安装注册了vue-router组件以后,vue-router在vue项目中会帮我们在全局范围内所有组件里面创建2个对象给我们使用:
this.$router
,可用于在js代码中进行页面跳转。this.$route
,可用于获取地址栏上面的url参数。在vue-router提供的操作中, 进行页面跳转有2种方式:
使用
来跳转
在中使用
this.$router.push(url地址)
来跳转
在中还可以使用
this.$router.go(整数)
,表示跳转返回上一页或者上几页,下一个或者下几页
例如,我们就可以在Home.vue组件中,使用router-link跳转到User.vue组件中。
routes/index.js,代码:
// 1. 引入vue和vue-router组件核心对象,并在vue中通过use注册vue-router组件
import Vue from "vue";
import Router from "vue-router";
Vue.use(Router); // Router是类
// 2. 暴露vue-router对象,并在vue-router里面编写路由,提供给main.js调用
// 导入组件
// import 组件名 from "../components/组件名"
import Home from "../components/Home";
import User from "../components/User";
export default new Router({
mode:"history", // 路由地址的显示模式: 默认hash,表示地址栏上面出现#
routes:[
// {
// name:"路由名称[对应组件的name值,将来用于跳转页面]",
// path: "访问url路径",
// component: 组件名
// },
{
name:"Home",
path: "/",
component: Home
},{
name:"User",
path: "/user",
component: User
},
],
});
// vue-router除了可以进行组件和url地址的绑定以外,还可以
// 进行不同组件的页面跳转,
Home.vue代码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H58KCtN1-1595157631747)(E:/python八期/北京python27期荏苒项目/day108/assets/1581908101280.png)]
this.$router.push()
跳转
vue-router
提供了this.$route
,可以让我们接收来自其他页面的附带参数。参数有2种:
查询字符串(query string
),就是地址栏上面?
号后面的参数,
例如:http://localhost:8008/user?name=xiaoming&pwd=123
,这里name=xiaoming&pwd=123
就是查询字符串参数。
路由参数(router params
),就是地址栏上面路由路径的一部分,
例如:http://localhost:8080/user/300/xiaoming
,此时,300属于路由路径的一部分,这个300就是路由参数.,当然,xiaoming,或者user也可以理解是路由参数,就是看我们的页面中是否需要接收而已。
Home.vue代码:
首页页面组件
查询字符串参数
查询字符串参数
用户中心页面组件
例如:我们用户的界面都是一样的,但是每一个用户来到自己的页面中,显示的内容肯定都是不一样的,此时,我们需要使用不同的路径来区分不同的用户。这时候,可以在路由路径中使用路由参数表示不同用户的id
例如:我们就需要设置一个route/index.js中路由信息里面,哪一段路由属于路由参数。
src/routes/index.js设置路由参数。
// 1. 引入vue和vue-router组件核心对象,并在vue中通过use注册vue-router组件
import Vue from "vue";
import Router from "vue-router";
Vue.use(Router); // Router是类
// 2. 暴露vue-router对象,并在vue-router里面编写路由,提供给main.js调用
// 导入组件
// import 组件名 from "../components/组件名"
import Home from "../components/Home";
import User from "../components/User";
export default new Router({
mode:"history", // 路由地址的显示模式: 默认hash,表示地址栏上面出现#
routes:[
// {
// name:"路由名称[对应组件的name值,将来用于跳转页面]",
// path: "访问url路径",
// component: 组件名
// },
{
name:"Home",
path: "/",
component: Home
},{
name:"User",
path: "/user/:id/img-:img_id",
component: User
},
],
});
// vue-router除了可以进行组件和url地址的绑定以外,还可以
// 进行不同组件的页面跳转,
然后我们就是在Home中如果需要转到User里面。
Home.vue代码:
首页页面组件
路由参数
User.vue,组件中可以通过this.$route.params
接收路由参数。
用户中心页面组件
对于前端页面布局,我们可以使用一些开源的UI框架来配合开发,常用的UI框: bootstap,H-ui框架,lay-UI框架,Amaze UI,zui框架,ElementUI.
Vue开发前端项目中,比较常用的就是ElementUI了。
ElementUI是饿了么团队开发的一个UI组件框架,这个框架提前帮我们提供了很多已经写好的通用模块,我们可以在Vue项目中引入来使用,这个框架的使用类似于我们前面学习的bootstrap框架,也就是说,我们完全可以把官方文档中的组件代码拿来就用,有定制性的内容,可以直接通过样式进行覆盖修改就可以了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9O9Fyc4H-1595157631748)(E:/python八期/北京python27期荏苒项目/day108/assets/1552501300174.png)]
中文官网:http://element-cn.eleme.io/#/zh-CN
文档快速入门:http://element-cn.eleme.io/#/zh-CN/component/quickstart
项目根目录执行以下命令:
npm i element-ui -S
上面的命令等同于 npm install element-ui --save
执行命令效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q1ecMw3A-1595157631749)(E:/python八期/北京python27期荏苒项目/day108/assets/1556417812874.png)]
在main.js中导入ElementUI,并调用。代码:
// elementUI 导入
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
// 调用插件
Vue.use(ElementUI);
成功引入了ElementUI以后,接下来我们就可以开始进入前端页面开发,首先是首页。
首页采用了上下页面布局,首页是导航栏、轮播图。。。脚部等几个小模块。所以我们可以把首页作为一个组件进行开发,然后把首页的这些小模块作为单独的组件来进行开发。
在src/components目录下创建文件 Home.vue
代码:
首页
在router/index.js中引入Home组件,并设置Home组件作为首页路由。
代码:
import Vue from "vue"
import Router from "vue-router"
// 后面这里引入可以被用户访问的页面组件
import Home from "../components/Home"
Vue.use(Router);
export default new Router({
// 路由跳转模式,注意使用 history
mode: "history",
// 路由规则
routes:[
{
// name:"路由别名",
name:"Home",
// path: "路由地址",
path: "/",
// component: 组件类名,
component: Home,
},
]
})
}
User.vue,组件中可以通过`this.$route.params`接收路由参数。
```vue
用户中心页面组件
对于前端页面布局,我们可以使用一些开源的UI框架来配合开发,常用的UI框: bootstap,H-ui框架,lay-UI框架,Amaze UI,zui框架,ElementUI.
Vue开发前端项目中,比较常用的就是ElementUI了。
ElementUI是饿了么团队开发的一个UI组件框架,这个框架提前帮我们提供了很多已经写好的通用模块,我们可以在Vue项目中引入来使用,这个框架的使用类似于我们前面学习的bootstrap框架,也就是说,我们完全可以把官方文档中的组件代码拿来就用,有定制性的内容,可以直接通过样式进行覆盖修改就可以了。
[外链图片转存中…(img-9O9Fyc4H-1595157631748)]
中文官网:http://element-cn.eleme.io/#/zh-CN
文档快速入门:http://element-cn.eleme.io/#/zh-CN/component/quickstart
项目根目录执行以下命令:
npm i element-ui -S
上面的命令等同于 npm install element-ui --save
执行命令效果:
[外链图片转存中…(img-Q1ecMw3A-1595157631749)]
在main.js中导入ElementUI,并调用。代码:
// elementUI 导入
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
// 调用插件
Vue.use(ElementUI);
成功引入了ElementUI以后,接下来我们就可以开始进入前端页面开发,首先是首页。
首页采用了上下页面布局,首页是导航栏、轮播图。。。脚部等几个小模块。所以我们可以把首页作为一个组件进行开发,然后把首页的这些小模块作为单独的组件来进行开发。
在src/components目录下创建文件 Home.vue
代码:
首页
在router/index.js中引入Home组件,并设置Home组件作为首页路由。
代码:
import Vue from "vue"
import Router from "vue-router"
// 后面这里引入可以被用户访问的页面组件
import Home from "../components/Home"
Vue.use(Router);
export default new Router({
// 路由跳转模式,注意使用 history
mode: "history",
// 路由规则
routes:[
{
// name:"路由别名",
name:"Home",
// path: "路由地址",
path: "/",
// component: 组件类名,
component: Home,
},
]
})