目录
1.Vue基础回顾
1.1 基本使用
1.1.1 Vue的基本使用
1)使用PyCharm新建空白项目vue,在vue目录下新建src目录,并将提供的vue.js和axios.js放到src目录下。
2)在vue目录下新建01-vue基本使用的.html,并在其中编写以下内容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue基本使用</title>
<script src="./src/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 使用数据 -->
{{ name }}
</div>
</body>
<script>
// 创建Vue对象
var vm = new Vue({
// 接管app对应的div区域
el: "#app",
data: {
// 定义数据
name: "itcast"
}
});
</script>
</html>
1.1.2 methods方法的定义与使用
1)修改01-vue基本使用的.html文件,在vue中定义methods方法change_name。
<script>
// 创建Vue对象
var vm = new Vue({
// 接管app对应的div区域
el: "#app",
data: {
// 定义数据
name: "itcast"
},
methods: {
// 定义方法
change_name: function () {
// 修改name变量数据
this.name = 'itheima';
}
}
});
</script>
2)修改01-vue基本使用的.html文件,在其中添加button按钮并绑定click事件时调用change_name方法。
<body>
<div id="app">
<!-- 使用数据 -->
{{ name }}
<input type="button" @click="change_name" value="改变name">
</div>
</body>
1.2 axios请求
1.2.1. axios请求的基本使用
在vue中,可以使用axios发起异步请求。
axios.get(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.delete(url[, config])
以get请求为例:
axios.get(url[, config]).then(response => {
// 请求成功执行的代码
}).catch(error => {
// 请求失败时执行的代码
})
1.2.2. 案例(Vue获取所有图书的数据并展示)
1)在vue目录下新建02-axios请求.html,并在其他编写以下内容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>axios基本使用</title>
<script src="./src/vue.js"></script>
<script src="./src/axios.js"></script>
</head>
<body>
<div id="app">
<input type="button" value="获取所有图书数据" @click="show_books">
</div>
</body>
<script>
// 创建Vue对象
var vm = new Vue({
// 接管app对应的div区域
el: "#app",
data: {
// 定义数据
books: []
},
methods: {
// 定义方法
show_books: function () {
}
}
})
</script>
</html>
2)在show_books.html文件中编写show_books方法的内容,使用axios访问DRF框架编写的/books/接口来获取数据。
<script>
// 创建Vue对象
var vm = new Vue({
// 接管app对应的div区域
el: "#app",
data: {
// 定义数据
books: []
},
methods: {
// 定义方法
show_books: function () {
axios.get('http://127.0.0.1:8000/books/')
.then(response => {
// 请求成功:通过`response.data`可以获取API接口的响应数据
this.books = response.data;
}).catch(error => {
// 请求失败:通过`error.response.data`可以获取API接口响应的错误信息
console.log(error.response.data);
})
}
}
})
</script>
3)修改show_books.html文件内容,使用v-for遍历展示所有图书的数据。
<body>
<div id="app">
<input type="button" value="获取所有图书数据" @click="show_books">
<table>
<tr v-for="book in books">
<td>{{ book.id }}</td>
<td>{{ book.btitle }}</td>
<td>{{ book.bpub_date }}</td>
<td>{{ book.bread }}</td>
<td>{{ book.bcomment }}</td>
</tr>
</table>
</div>
</body>
注:GET /books/接口直接使用DRF框架所讲的图书管理案例项目运行即可,但是默认点击获取所有图书数据按钮时,会有以下错误:
这是CORS跨域请求错误,在美多商城后台项目中会进行详细讲解,此处按如下方式解决此错误即可:
1)安装django-cors-headers扩展包
pip install django-cors-headers
2)在MIDDLEWARE中间件配置中注册中间件。
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 此处为注册的中间件
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
3)在settings.py中进行如下配置。
CORS_ORIGIN_ALLOW_ALL=True
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie
4)再次点击获取所有图书数据按钮,结果如下:
2.Vue组件
2.1 基本使用
- Vue组件的基本使用
vue的组件分为全局注册组件和局部注册组件。
1.1 全局注册组件
1)在vue目录下新建03-vue组件(全局注册).html文件,编写以下内容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue组件(全局注册)</title>
<script src="./src/vue.js"></script>
</head>
<body>
<div id="app">
</div>
</body>
<script>
// 创建Vue对象
var vm = new Vue({
// 接管app对应的div区域
el: "#app"
})
</script>
</html>
2)在03-vue组件(全局注册).html文件中全局注册一个Vue组件并使用。
<body>
<div id="app">
<!-- 使用组件时,直接将组件名当做标签使用即可 -->
<login></login>
</div>
</body>
<script>
// 定义组件并注册
Vue.component('login', {
// login组件的模板内容
template: '<div>登录组件内容</div>'
});
// 创建Vue对象
var vm = new Vue({
// 接管app对应的div区域
el: "#app"
})
</script>
3)在浏览器中查看03-vue组件(全局注册).html,显示内容如下:
注:使用Vue.component创建的组件是全局注册的,它们在注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中。
2. 局部注册组件
1)在vue目录下新建04-vue组件(局部注册).html文件,编写以下内容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue组件(局部注册)</title>
<script src="./src/vue.js"></script>
</head>
<body>
<div id="app">
</div>
</body>
<script>
// 创建Vue对象
var vm = new Vue({
// 接管app对应的div区域
el: "#app"
})
</script>
</html>
2)在04-vue组件(局部注册).html定义一个Vue组件并进行局部注册。
<body>
<div id="app">
<!-- 使用组件 -->
<login></login>
</div>
</body>
<script>
// 定义login组件
var login = {
// 定义组件的模板内容
template: '<div>登录组件内容</div>'
};
// 创建Vue对象
var vm = new Vue({
// 接管app对应的div区域
el: "#app",
components: {
// 组件名: 组件
'login': login
}
})
</script>
3)在浏览器中查看03-vue组件(全局注册).html,显示内容如下:
注:局部注册的组件在其子组件中不可用。
2.2 组件data属性
一个组件的 data 选项必须是一个函数。
1)在vue目录下新建05-组件的data属性.html文件,编写以下内容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>组件的data属性</title>
<script src="./src/vue.js"></script>
</head>
<body>
<div id="app">
</div>
</body>
<script>
// 创建Vue对象
var vue = new Vue({
// 接管app对应的div区域
el: "#app"
})
</script>
</html>
2)在05-组件的data属性.html文件中定义注册组件component_a并使用。
<body>
<div id="app">
<!-- 使用组件 -->
<component-a></component-a>
</div>
</body>
<script>
// 创建component_a组件
var component_a = {
template: "<div>组件内容:{{ count }}</div>",
// 组件的data选项必须是一个函数
data: function () {
// 返回一个字典,字典中包含定义的各个参数
return {
count: 1
}
}
};
// 创建Vue对象
var vue = new Vue({
// 结果app对应的div区域
el: "#app",
components: {
// 组件名:组件
'component-a': component_a
}
})
</script>
3)在浏览器中查看05-组件的data属性.html,显示内容如下:
2.3 父子组件
- 父组件和子组件
1)在vue目录下新建06-父子组件.html文件,编写以下内容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父子组件</title>
<script src="./src/vue.js"></script>
</head>
<body>
<div id="app">
</div>
</body>
<script>
// 创建Vue对象
var vue = new Vue({
// 接管app对象对应的div区域
el: "#app"
})
</script>
</html>
2)在06-父子组件.html文件中定义注册两个组件:父组件parent,子组件child。
<body>
<div id="app">
<!-- 使用组件 -->
<parent></parent>
</div>
</body>
<script>
// 子组件
var child = {
template: "<div>子组件</div>"
};
// 父组件
Vue.component("parent", {
template: "<div>父组件<child></child></div>",
data: function () {
return {
count: 1
}
},
components: {
// child组件是parent组件的子组件
"child": child
}
});
// 创建Vue对象
var vue = new Vue({
// 接管app对象对应的div区域
el: "#app"
})
</script>
3)在浏览器中查看06-父子组件.html页面,效果如下:
- 父子组件之间的传值
2.1 父组件向子组件传值-props属性
1)拷贝06-父子组件.html页面,修改名称为07-父组件向子组件传值.html。
2)在07-父组件向子组件传值.html中编写以下代码,让父组件parent将其data中的count数据传递给child子组件并在child子组件中进行使用。
<script>
// 子组件
var child = {
template: "<div>子组件:{{ num }}</div>",
props: ['num'] // 用于接收父组件传递的值
};
// 父组件
Vue.component("parent", {
// <child :num='count'></child>:表示在使用子组件时,将父组件中count数据的值传递给子组件的num
template: "<div>父组件<child :num='count'></child></div>",
data: function () {
return {
count: 1
}
},
components: {
// child组件是parent组件的子组件
"child": child
}
});
// 创建Vue对象
var vue = new Vue({
// 接管app对象对应的div区域
el: "#app"
})
</script>
3)在浏览器中查看07-父组件向子组件传递.html,效果如下:
2.2 子组件向父组件传递-$emit
1)拷贝06-父子组件.html页面,修改名称为08-子组件向父组件传值.html。
2)在08-子组件向父组件传值.html中编写以下代码,让child子组件传递数据给父组件parent。
<script>
// 子组件
var child = {
// 2. 点击子组件的a标签,触发send_data向父组件传值
template: "<div>子组件<br/><a href='#' @click='send_data'>传值给父组件</a></div>",
methods: {
send_data: function () {
// 1. 调用$emit('事件名', '传递的值')将值传递给父组件
this.$emit('send', 'hello')
}
}
};
// 父组件
Vue.component("parent", {
template: "<div>父组件<child v-on:send='receive_data'></child></div>",
data: function () {
return {
count: 1
}
},
components: {
// child组件是parent组件的子组件
"child": child
},
methods: {
// 3. 定义receive_data用于获取子组件传递的数据
'receive_data': function (input) {
// input即为子组件传递的数据
alert(input);
}
}
});
// 创建Vue对象
var vue = new Vue({
// 接管app对象对应的div区域
el: "#app"
})
</script>
3)在浏览器中查看08-子组件向父组件传值.html,点击传值给父组件a标签,效果如下:
3.单文件组件
将一个组件相关的html结构,css样式,以及交互的JavaScript代码从html文件中剥离出来,合成一个文件,这种文件就是单文件组件,相当于一个组件具有了结构、表现和行为的完整功能,方便组件之间随意组合以及组件的重用,这种文件的扩展名为“.vue”,比如:“Hello.vue”。
// 使用template标签来定义html部分
<template>
<p>{{ greeting }} World!</p>
</template>
// javascript要写成模块导出的形式:
<script>
export default{
data:function(){
return {
greeting: 'Hello'
}
}
}
</script>
// 样式中如果有scope关键字,表示这些样式是组件局部的,不会影响其他元素
<style scoped>
p {
font-size: 2em;
text-align: center;
}
</style>
4.Vue-cli的使用
我们的项目文件都是手动创建出来,在实际开发中我们可以借助vue-cli创建出所有的项目文件。
- 基本使用
1)在终端全局安装vue-cli。
npm install --global vue-cli
2)使用vue-cli创建一个前端项目。
vue init webpack 项目名
如:
vue init webpack meiduo_mall_admin
创建出的项目目录结构如下:
- src:主开发目录,要开发的单文件组件全部在这个目录下
- static:静态资源目录,所有的css,js文件放在这个文件夹
- components:组件目录,vue格式的单文件组件都存在这个目录中
- router:路由目录,在此文件夹中配置组件路由
还有node_modules目录是node的包目录,config是配置目录,build是项目打包时依赖的目录。
3)运行调试项目。
// 进入项目目录下,执行下面指令
npm run dev
效果如下:
4)通过浏览器访问http://localhost:8080,效果如下:
- Vue单文件组件项目页面结构说明
整个项目是一个主文件index.html,index.html中会引入src文件夹中的main.js,main.js中会导入顶级单文件组件App.vue,App.vue中会通过组件嵌套或者路由来引用components文件夹中的其他单文件组件。