1 Vue
- 官网:
Vue.js
2 Node、NPM
- NPM是Node提供的模块管理工具,可以非常方便地下载安装很多前端框架。
1、Node.js
2、NPM
Node.js自带了NPM,在控制台输入
npm -v即可查看版本信息。NPM默认的仓库地址在国外,速度较慢,建议设置到淘宝镜像。切换镜像比较麻烦,推荐使用切换镜像的工具:nrm。
安装nrm,
-g表示全局安装:npm install nrm -g
nrm ls:显示所有镜像。nrm use [name]:使用指定镜像。
3 Vue快速入门
3.1 创建
1、新建空项目
2、初始化
- 在项目目录下执行命令:
npm init。 - 项目中会多出一个文件:
package.json(相当于XML配置文件)。
3、安装Vue
- 在项目目录下执行命令:
npm install vue —save。 - 项目中会多出一个文件:
node_modules,其中就有Vue。
- 同时,
package.json中也会增加Vue的依赖。
4、Hello Vue
<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--Vue对象的HTML模板-->
<div id="app">
<h1>{{name}}</h1>
<!--双向绑定:v-model-->
<input type="text" v-model="num">
<h1>{{num}}</h1>
<!--v-on:事件名:定义事件-->
<input type="button" value="num++" v-on:click="num++">
<input type="button" value="num++" v-on:click="incre">
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
// 初始化一个Vue实例
const app = new Vue({
el: "#app", // element缩写,"#app"选择器
data: { // 定义数据模型
name: "Hello Vue",
num: 100
},
methods: { // 定义方法
incre() {
this.num++;
}
}
});
</script>
</html>3.2 生命周期、钩子函数
每个Vue实例在被创建时都要经过一系列的初始化过程:创建实例、装载模板、渲染模板等。
Vue为生命周期中的每个状态都设置了钩子函数(监听函数)。
每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用。
常用:
created() { // 实例化之后,渲染之前:获取数据 // 1、获取数据:Ajax // 2、绑定数据:this.name = result }
3.3 指令
- 指令是带有
v-前缀的特殊特性。 - 指令特性的预期值是:单个JavaScript表达式。
- 指令的职责是:当表达式的值改变时,将其产生的连带影响,响应式的作用域DOM。
1、数据绑定
花括号(会有闪烁问题)
{{表达式}}v-text、v-html(没有闪烁问题)<h1>xxx<span v-text="name">默认值</span>xxx</h1>
v-model:双向绑定,用在表单元素中。
2、事件绑定:v-on、@
绑定事件。
语法:
v-on:事件名="函数名" @事件名="函数名"
在响应函数里,可以指明使用event内置的参数对象。该对象表示当前事件,可以通过使用event.target.value来获得当前事件对象的value值。
changeMajor(event) { this.msg = event.target.value; }可以使用data()中的数据进行数据传递:
<template> <div> {{count}} <button type="button" @click="addBtn">add</button> <p>myStep: <input type="text" v-model="myStep"></p> </div> </template> <script> export default { name: 'HelloWorld', data () { return { count: 0, myStep: 1 } }, methods: { addBtn() { var myNum = this.myStep - 0; this.count += myNum; } } } </script>也可以直接在函数中进行传递数据:
<template> <div> {{count}} <button type="button" @click="addBtn">add</button> </div> </template> <script> export default { name: 'HelloWorld', data () { return { count: 0, } }, methods: { addBtn(step) { this.count += step; } } } </script>Vue为
v-on提供了事件修饰符:.stop:阻止事件冒泡到父元素。.prevent:阻止默认事件发生。.capture:使用事件捕获模式。.self:只有元素自身触发事件才执行(冒泡或捕获的都不执行)。.once:只执行一次。v-on.click.prevent="num++:"
按键修饰符:
@keyup.13、@keyup.enter:回车事件。- ……
组合按钮:
.ctrl、.ctrl.67。.alt。- ……
3、遍历数据:v-for
语法:
v-for="item in items" v-for="(item, index) in items" :key="index" v-for="(val, key, index) in users" :key="index"
同时使用
:key可以增加效率。案例:
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--Vue对象的HTML模板--> <div id="app"> <ul v-for="item in arr"> <li v-text="item"></li> </ul> <ul v-for="(item, index) in arr" :key="index"> <li>{{index}}-{{item}}</li> </ul> </div> </body> <script src="node_modules/vue/dist/vue.js"></script> <script> // 初始化一个Vue实例 const app = new Vue({ el: "#app", // element缩写,"#app"选择器 data: { // 定义数据模型 arr: [1, 2, 3, 4, 5, 6, 7, 8,] } }); </script> </html>
4、条件渲染:v-if、v-show
v-if:当布尔表达式的值为true时,显示该元素。值为false时,不渲染该元素,效率更高。可以与
v-else-if、v-else联用。v-if="布尔表达式"
v-show:当布尔表达式的值为true时,显示该元素。始终渲染,当值为false时,设置为display:none,效率更低。v-show="布尔表达式"
5、属性绑定:v-bind、:
- 绑定属性(主要用于绑定class属性)。
<template> <div> <div class="mydiv" :class="{red: isRed}"></div> <p><button type="button" @click="changeBtn">改变颜***utton></p> <div class="mydiv" :class="myColor"></div> <p>颜色:</p> <p>红色<input type="radio" v-model="myColor" value="red" name="myColor"></p> <p>蓝色<input type="radio" v-model="myColor" value="blue" name="myColor"></p> <p>黑色<input type="radio" v-model="myColor" value="black" name="myColor"></p> </div> </template> <script> export default { name: 'HelloWorld', data () { return { isRed: false, myColor: '' } }, methods: { changeBtn() { this.isRed = !this.isRed; } } } </script> <style scoped> .mydiv { width: 500px; height: 500px; } .red { background-color: red; } .blue { background-color: blue; } .black { background-color: black; } </style>
6、计算属性:computed
computed:里定义方法,方法必须要有返回值。像普通数据一样使用,不用加()。计算属性基于它们的依赖进行缓存,只有在它的相关依赖发生改变时才会重新求值。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--Vue对象的HTML模板--> <div id="app"> <p>{{birth}}</p> </div> </body> <script src="node_modules/vue/dist/vue.js"></script> <script> // 初始化一个Vue实例 const app = new Vue({ el: "#app", // element缩写,"#app"选择器 data: { // 定义数据模型 birthday: 14564687945121, }, computed: { // 计算属性 birth() { var date = new Date(this.birthday); return date; } } }); </script> </html>
7、监听:watch
watch:里定义方法,方法名必须与被监听的数据名一致。通常在方法里发送异步请求,根据监听的数据值的变化进行即时查询。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--Vue对象的HTML模板--> <div id="app"> <input type="text" v-model="search"> </div> </body> <script src="node_modules/vue/dist/vue.js"></script> <script> // 初始化一个Vue实例 const app = new Vue({ el: "#app", // element缩写,"#app"选择器 data: { // 定义数据模型 search: "" }, watch: { // 监听 search (newVal, oldVal) { // 方法名与监听的数据名必须一致 // 发送异步请求,根据监听的值进行查询 console.log(newVal + " " + oldVal); } } }); </script> </html>
3.4 组件化
- 在大型应用开发的时候,页面可以划分成很多部分。往往不同的页面,会有相同的部分。
- 如果每个页面都独自开发,会增加开发的成本。所以,将页面的不同部分拆分成独立的组件,在不同的页面***享这些组件,可以避免重复开发。
- 在Vue里,所有Vue实例都是组件。
1、全局组件:Vue.component()
组件的
data必须是函数,保证了复用。可以在任何实例中使用。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <counter></counter> <counter></counter> <counter></counter> </div> </body> <script src="node_modules/vue/dist/vue.js"></script> <script> Vue.component("counter", { template: "<button @click='num++'>num++:{{num}}</button>", data() { return { num: 0 } } }) const app = new Vue({ el: "#app", }) </script> </html>
2、局部组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<myhello></myhello>
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
const hello = {
template: "<div>{{name}}</div>",
data() {
return {
name: "Xianhuii"
}
}
};
const app = new Vue({
el: "#app",
components: {
myhello: hello
}
})
</script>
</html>3、父向子传递数据:props
父组件使用子组件时,使用自定义属性传递数据:
- 属性名任意,为子组件的数据名。
- 属性值为父组件的数据名。
子组件使用
props,通过自定义属性的属性名(即子组件的数据名),接收父组件的数据。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <counter :number="num"></counter> </div> </body> <script src="node_modules/vue/dist/vue.js"></script> <script> Vue.component("counter", { template: "<button @click='number++'>num++:{{number}}</button>", props: ["number"] }) const app = new Vue({ el: "#app", data: { num: 0 } }) </script> </html>
4、子向父传递数据:$emit()
父:
<template> <div> <Sub @paramFun="supFun($event)"></Sub> {{num}} {{supMsg}} </div> </template> <script> export default { name: 'Sup', data() { return { num: 0, supMsg: '' } }, methods: { supFun(value) { this.num++; this.supMsg = value } } } </script>子:
<template> <div> <button @click='subFun()'>num++</button> </div> </template> <script> export default { name: "Sub", data() { return { subMsg: 'subMsg' } }, methods: { subFun() { this.$emit("paramFun", this.subMsg); } } } </script>
5、全局注册
- 在main.js中:
import Header from './components/Header' import Content from './components/Content' Vue.component('myheader',Header) Vue.component('mycontent',Content)
6、局部注册
在特定Example.vue中:
<script> import Header from './Header' import Content from './Content' export default { name: 'HelloWorld', components: { 'myheader': Header, 'mycontent': Content } } </script>
3.5 路由:vue-router
1、安装
在项目目录下,使用以下命令:
npm install vue-router --save
安装成功后,在
node_modules目录下会新增vue-router模块:
2、引入
- 在引入Vue之后引入:
<script src="../node_modules/vue/dist/vue.js"></script> <script src="../node_modules/vue-router/dist/vue-router.js"></script>
3、使用
<script>
const router = new VueRouter({
routes: [
{
path: "/login", // 路由路径,必须以“/”开头
component: loginForm // 对应的组件
},
{
path: "/register",
component: registerForm
}
]
})
const app = new Vue({
el: "#app",
router // 注册router
})
</script>4、案例
组件1:
login.js// 组件内的template只能有一个跟标签 const loginForm = { template: ` <div> <h1>登录页</h1> <p>用户名:<input type="text"></p> <p>密 码:<input type="password"></p> <p><input type="submit" value="登录"></p> </div> ` }组件2:
register.js// 组件内的template只能有一个跟标签 const registerForm = { template: ` <div> <h1>注册页</h1> <p>用 户 名:<input type="text"></p> <p>密  码:<input type="password"></p> <p>确认密码:<input type="password"></p> <p><input type="submit" value="注册"></p> </div> ` }主页面:
index.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <span><router-link to="/login">登录</router-link></span> <span><router-link to="/register">注册</router-link></span> <hr> <router-view></router-view> </div> </body> <!--引入vue--> <script src="../node_modules/vue/dist/vue.js"></script> <!--引入vue-router--> <script src="../node_modules/vue-router/dist/vue-router.js"></script> <!--引入login组件--> <script src="js/login.js"></script> <!--引入register组件--> <script src="js/register.js"></script> <script> const router = new VueRouter({ routes: [ { path: "/login", // 路由路径,必须以“/”开头 component: loginForm // 对应的组件 }, { path: "/register", component: registerForm } ] }) const app = new Vue({ el: "#app", router // 注册router }) </script> </html>
3.6 axios
- 官网:axios
1、添加axios
项目根目录下,在命令行中输入:
vue add axios
在Vue项目中的plugins目录下新增axios.js插件:
2、使用axios
在Example.vue中的<script>标签的函数中可以直接使用axios调用方法,如下可以将从后端得到的数据赋值给books数组:
<script> export default { name: "Example", data() { return { books: [] } }, created() { const _this = this axios.get('http://localhost:8181/book/findAll') .then(function(resp) { _this.books = resp.data }) } } </script>GET请求:
const axios = require('axios'); // Make a request for a user with a given ID axios.get('/user?ID=12345') .then(function (response) { // handle success console.log(response); }) .catch(function (error) { // handle error console.log(error); }) .then(function () { // always executed }); // Optionally the request above could also be done as axios.get('/user', { params: { ID: 12345 } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }) .then(function () { // always executed }); // Want to use async/await? Add the `async` keyword to your outer function/method. async function getUser() { try { const response = await axios.get('/user?ID=12345'); console.log(response); } catch (error) { console.error(error); } }POST请求:
axios.post('/user', { firstName: 'Fred', lastName: 'Flintstone' }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
4 项目
4.1 项目技巧
1、安装package.json中的依赖
npm install
2、运行
npm run dev
# 或者
npm start4.2 Vue UI框架
Vuetify:
快速开始 - Vuetify.js
4.3 域名
1、域名解析相关概念
本地hosts文件
ip 域名
DNS服务器
ip 域名
2、本地修改域名
- SwitchHosts修改IP地址
- 在项目的
build/webpack.dev.conf.js中:devServer: { disableHostCheck:true // 添加 }
4.4 Ngnix
1、Ngnix简介
- Ngnix是一个高性能的Web服务器和反向代理服务器。
- 更多的时候,我们把Ngnix作为网关,因为它具备网关必备的功能:
- 反向代理。
- 负载均衡。
- 动态路由。
- 请求过滤。
2、Web服务器
- Web服务器:Apache服务器、Ngnix、IIS。
- Web应用服务器:tomcat、resin、jetty。
- Web服务器只能处理JS、CSS、HTML等静态资源,不能解析JSP等页面。
- Web服务器的并发能力远高于Web应用服务器。
3、代理
- 代理(代理客户端):通过客户机的配置,实现让一台服务器代理客户机,客户的所有请求都交给代理服务器处理。
- 反向代理(代理服务器):用一台服务器,代理真实服务器,用户访问时,不再是访问真实服务器,而是代理服务器。
4、安装目录
5、启动、重新加载
启动:
start ngnix
重新加载:
nginx -s reload
6、配置:nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80; # 监听端口
server_name manage.leyou.com; # 监听域名
location / { # 代理路径
proxy_pass http://127.0.0.1:9001;
proxy_connect_timeout 600;
proxy_read_timeout 60;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}7、访问解析过程
- 访问:
http://manage.leyou.com。 - 在
hosts文件中找到对应IP地址:manage.leyou.com→127.0.0.1。 - 默认端口为
80(即此时Nginx监听的端口),找到Ngnix。 - Ngnix中对
manage.leyou.com配置的代理路径为:http://127.0.0.1:9001,即对应的Web项目(此Web项目正在监听9001端口)。

京公网安备 11010502036488号