Vue
Vue常用7个属性
- el属性
- data属性
- template属性
- methods属性
- render属性
- computed属性
- watch属性
1、前端核心分析
- 软件名称:vue.js
- 作者:尤雨溪
- 前端三大框架:VUE js,Angular JS,Ractive js
相关技术侧重的功能
- 视图:VUE
- 网络通信:axios
- 页面跳转:vue-router
- 状态管理:vuex
- Vue-Ul:如 飞冰
CSS预处理器
为CSS增加了一下变成的特性
常用的css预处理器:
- SASS:基于Ruby
- LESS:基于NodeJS(建议使用这种)
2、前端发展史
UI框架
- Ant-Design
- ElementUl、iview、ice
- Bootstrap
- AmazeUI
Javascrpt 构建工具
- Babel:js编译工具(用于编译typeScript比较多)
- Webpack:模块打包器(我们这个用的比较多)
3、Vue第一个程序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- view -->
<div id="app">
<!--获取数据-->
{{message}}
</div>
<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
/*创建vue对象*/
var vm = new Vue({
/*绑定元素*/
el:"#app",
/* model:数据 */
data:{
message:"hello vue!"
}
});
</script>
</body>
</html>
4、Vue基本语法
-
if语句
<!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--V-if的用法--> <div id="app"> <!-- <h1 v-if="ok">Yes</h1>--> <h1 v-if="dat==='A'">A</h1> <h1 v-else-if="dat==='B'">B</h1> <h1 v-else-if="dat==='C'">C</h1> <h1 v-else>No</h1> </div> <!--1.导入vue.js--> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> <script> var vm = new Vue({ el: "#app", data:{ ok: false, dat:'A' } }); </script> </body> </html> </body> </html>
-
for语句
<!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <li v-for="item in items"> {{item.message}} </li> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> <script> var vm = new Vue({ el: "#app", data:{ items:[ {message: '狂神说Java'}, {message: '狂神说前端'}, {message: '狂神说运维'}, ] } }); </script> </body> </html> </body> </html>
5、Vue绑定事件
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<button v-on:click="sayHi">click Me</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var vm = new Vue({
el: "#app",
data:{
message:"狂神说Java"
},
methods:{//方法必须定义在Vue的Method对象中
sayHi:function (event){
alert(this.message)
}
}
});
</script>
</body>
</html>
</body>
</html>
6、Vue双向绑定
v-model=“message”
案例:将用户输入的数据与系统数据进行绑定
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
输入的文本:<input type="text" v-model="message">{{message}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var vm = new Vue({
el: "#app",
data:{
message:"输入你需要的数据"
}
});
</script>
</body>
</html>
</body>
</html>
7、Vue组件讲解
Vue组件:自定义标签
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!--使用组件-->
<qinjiang></qinjiang>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
//定义一个vue组件
Vue.component("qinjiang",{
template:'<li>Hello</li>' //template属性为该组件的模板或者样式
});
var vm = new Vue({
el: "#app",
data:{
message:"狂神说Java"
}
});
</script>
</body>
</html>
</body>
</html>
- 切记:模板的定义是在script标签中
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!--组件:传递给组件中的值:props-->
<qinjiang v-for="item in items" v-bind:dat="item"></qinjiang>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
//定义一个vue组件
Vue.component("qinjiang",{
props:['dat'],//通过props访问外部变量
template:'<li>{{dat}}</li>'
});
var vm = new Vue({
el: "#app",
data:{
items:["java","Linux","前端"]
}
});
</script>
</body>
</html>
</body>
</html>
- 以上内容:将组件数据与内部数据进行绑定
8、Axios异步通信
网络通信
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo7</title>
<!--v-clock:解决闪烁问题-->
<style>
[v-clock]{
display: none;
}
</style>
</head>
<body>
<!--v-clock:解决闪烁问题,当数据没有加载完,则显示白屏-->
<div id="vue" v-clock>
<div>{{info.name}}</div>
<div>{{info.address.street}}</div>
<a v-bind:href="info.url">点我</a>
</div>
<!--同时导入vue和axios的cdn包-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
var vm = new Vue({
el: "#vue",
data(){
return{
//请求的返回参数合适,必须和json字符串一样
info:{
name:null,
address:{
street:null,
city:null,
country:null
},
url:null
}
}
},
mounted(){//钩子函数
axios.get('../data.json').then(response=>(this.info=response.data));
}
});
</script>
</body>
</html>
</body>
</html>
9、计算属性
计算属性:计算出来的结果,保存在属性中~
好处:在内存中运行,即虚拟Dom
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo7</title>
<!--v-clock:解决闪烁问题-->
<style>
[v-clock]{
display: none;
}
</style>
</head>
<body>
<div id="app">
<p>{{currentTime1()}}</p>
<p>{{currentTime2}}</p>
</div>
<!--同时导入vue和axios的cdn包-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var vm = new Vue({
el: "#app",
data:{
message:"hello,kuangshen"
},
methods:{
currentTime1:function (){
return Date.now();//返回一个时间戳
}
},
computed:{//计算属性:methods,computed 方法名不能重名,否则会调用methods中的方法
currentTime2:function (){
return Date.now();//返回一个时间戳
}
}
});
</script>
</body>
</html>
</body>
</html>
使用场景
主要就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销。
10、插槽slot
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo9</title>
</head>
<body>
<div id="app">
<todo>
<todo-title solt="todo-title" :title="title"></todo-title>
<todo-items solt="todo-items" v-for="item in todoItems" :item="item"></todo-items>
</todo>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
//slot定义插槽
Vue.component("todo", {
template:
'<div>\
<slot name="todo-title"></slot>\
<ul>\
<slot name="todo-items"></slot>\
</ul>\
</div>'
});
Vue.component("todo-title", {
props: ['title'],
template: '<div>{{title}}</div>'
})
Vue.component("todo-items", {
props: ['item'],
template: '<li>{{item}}</li>'
})
var vm = new Vue({
el: "#app",
data: {
title: '秦老师系列课程',
todoItems: ['狂神说Java', '狂神说前端', '狂神说Linux']
}
});
</script>
</body>
</html>
</body>
</html>
11、自定义事件、内容分发
略
12、第一个vue-cli项目
-
vue-cli:是vue-cli官方提供的一个脚手架,用于快速生成一个vue的项目模板
-
主要功能:
- 统一目录结构
- 本地调试
- 热部署
- 单元测试
- 集成打包上线
-
需要的坏境:
-
Node.js :下载 | Node.js 中文网 (nodejs.cn)
- 确认安装成功可以在cmd输入:node -v或npm -v查看版本
-
Git
-
镜像(这里以淘宝镜像为例 cnpm)
# -g 就是全局安装 npm install cnpm -g #或使用如下语句解决npm速度慢的问题 npm install --registry=https://registry.npm.taobao.org #方法三 npm config set registry https://registry.npm.taobao.org #验证,如果返回 https://registry.npm.taobao.org 说明安装成功! npm config get registry
-
-
安装vue-cli
cnpm install vue-cli -g #测试是否安装成功 #查看可以基于模板创建vue应用程序,通常我们选择webpack vue list
出现如上界面,说明安装成功!
- 创建项目
-
在你的项目目录打开cmd
-
输入:vue init webpack 项目名
- 初始化,并运行
#进入项目目录
cd 项目目录
#安装依赖
npm install
#启动项目
npm run dev
出现下面界面说明项目启动成功!
然后再浏览器地址栏输入:http://localhost:8080/便可访问
**关闭项目:**ctrl+C
13、webpack学习使用
-
webpack简介:webpack是一个现代javaScript应用程序的静态模块打包器。是一款模块加载兼打包工具,它能吧各种资源,如js,jsx,es6,sass,less图片等都作为模块处理和使用
-
安装:
-
#安装打包工具 npm install webpack -g #安装客户端 npm install webpack-cli -g
-
测试安装成功:
webpack -v webpack-cli -v
-
-
配置
- 创建webpack.config.js配置文件
-
- entry:入口文件,指定webpack用哪个文件作为项目的入口
- output:输出,指定webpack吧处理完成的文件放置到指定的路径
- module:模块,用于处理各类型的文件
- plugins:插件,如:热更新、代码重用等
- resolve:设置路径指向
- watch:监听,用于设置文件改动后直接打包
-
使用
-
创建项目
-
创建一个名为modules的目录,用于放置js模块等资源文件
-
在modules下创建模块文件,如hello.js,用于编写js模块相关代码
//暴露一个方法,exports相当于java中的public exports.sayHi = function (){ document.write("<h1>狂神说ES6</h1>") };
-
在modules下创建以恶名为main.js的入口文件,用于打包时设置entry属性
//引入模块,类似Java的导包 var hello = require("./hello") //使用模块中的方法 hello.sayHi();
-
在项目目录下chuangjianwebpack.config.js配置文件
//导出模块 module.exports = { entry:'./modules/main.js',//设置主入口 output:{ //输出 filename:"./js/bundle.js" } };
-
使用webpack命令打包(需要使用管理员模式打开IDEA或命令行,无法打包请看https://blog.csdn.net/PengHengYYDS/article/details/121234702)
webpack
出现如下画面则说明打包成功
-
完整的项目目录结构:
14、vue-router路由
vue Router 是vue.js官方的路由管理器。它和Vue.js的核心深度集成,让构建单页应用变得易如反掌
-
安装
cnpm install vue-router --save-dev
如果在一个模块化工程中使用它,必须要通过Vue.use()明确地安装路由功能
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter)
-
使用
目录结构
content.vue
<template>
<h1>这是内容页</h1>
</template>
<script>
export default {
name: "Content"
}
</script>
<style scoped>
</style>
Main.vue
<template>
<h1>首页</h1>
</template>
<script>
export default {
name: "Main"
}
</script>
<style scoped>
</style>
App.vue
<template>
<div id="app">
<h1>Vue-Router</h1>
<router-link to="/main">首页</router-link>
<router-link to="/content">内容页</router-link>
<router-view></router-view>
</div>
</template>
<script>
import Content from "./components/Content";
export default {
name: 'App'
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
main.js
// 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";//自动扫描里面的路由配置
//关闭生产模式下给出的提示
Vue.config.productionTip = false
//现实声明使用VueRouter
Vue.use(router);
new Vue({
el: '#app',
//配置路由
router,
components: { App },
template: '<App/>'
})
index.js
import Vue from "vue"
import VueRouter from "vue-router"
import Content from "../components/Content"
import Main from "../components/Main";
//安装路由
Vue.use(VueRouter);
//配置导出路由
export default new VueRouter({
routes:[
{
//路由路径 类似@RequestMapping
path:'/content',
name:'content',
//跳转的组件
component:Content
},
{
//路由路径
path:'/main',
name:'main',
//跳转的组件
component:Main
}
]
});
15、vue+elementUI
- elementUI帮助文档:组件 | Element
创建工程
-
创建名为hello-vue的工程: vue init webpack hello-vue
-
安装依赖,我们需要安装:vue-router element-ui sass-loader 和 node-sass四个插件
# 进入工程目录 cd hello-vue #安装 vue-router npm install vue-router --save-dev #安装element-ui npm i element-ui -s #安装依赖 npm install #安装SASS加载器 cnpm install sass-loader node-sass --save-dev #启动测试 npm run dev
项目代码
- 结构
-
App.vue
<template> <div id="app"> <router-view></router-view> </div> </template> <script> export default { name: 'App' } </script>
-
Nain.vue
<template> <h1>首页</h1> </template> <script> export default { name: "Main" } </script> <style scoped> </style>
-
Login.vue
<template> <div> <el-form ref="loginForm" :model="form" :rules="rules" label-width="80px" class="login-box"> <h3 class="login-title">欢迎登录</h3> <el-form-item label="账号" prop="username"> <el-input type="text" placeholder="请输入账号" v-model="form.username"/> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" placeholder="请输入密码" v-model="form.password"/> </el-form-item> <el-form-item> <el-button type="primary" v-on:click="onsubmit('loginForm')">登录</el-button> </el-form-item> </el-form> <el-dialog title="温馨提示" :visible.sync="dialogVisiable" width="30%" :before-close="handleClose"> <span>请输入账号和密码</span> <span slot="footer" class="dialog-footer"> <el-button type="primary" @click="dialogVisible = false">确定</el-button> </span> </el-dialog> </div> </template> <script> export default { name: "Login", data(){ return{ form:{ username:'', password:'' }, //表单验证,需要在 el-form-item 元素中增加prop属性 rules:{ username:[ {required:true,message:"账号不可为空",trigger:"blur"} ], password:[ {required:true,message:"密码不可为空",tigger:"blur"} ] }, //对话框显示和隐藏 dialogVisible:false } }, methods:{ onSubmit(formName){ //为表单绑定验证功能 this.$refs[formName].validate((valid)=>{ if(valid){ //使用vue-router路由到指定界面,该方式称为编程式导航 this.$router.push('/main'); }else{ this.dialogVisible=true; return false; } }); } } } </script> <style lang="scss" scoped> .login-box{ border:1px solid #DCDFE6; width: 350px; margin:180px auto; padding: 35px 35px 15px 35px; border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px; box-shadow: 0 0 25px #909399; } .login-title{ text-align:center; margin: 0 auto 40px auto; color: #303133; } </style>
-
package.json
{ "name": "hello-vue", "version": "1.0.0", "description": "A Vue.js project", "author": "kuangshen", "private": true, "scripts": { "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "start": "npm run dev", "build": "node build/build.js" }, "dependencies": { "element-ui": "^2.15.9", "vue": "^2.5.2" }, "devDependencies": { "autoprefixer": "^7.1.2", "babel-core": "^6.22.1", "babel-helper-vue-jsx-merge-props": "^2.0.3", "babel-loader": "^7.1.1", "babel-plugin-syntax-jsx": "^6.18.0", "babel-plugin-transform-runtime": "^6.22.0", "babel-plugin-transform-vue-jsx": "^3.5.0", "babel-preset-env": "^1.3.2", "babel-preset-stage-2": "^6.22.0", "chalk": "^2.0.1", "copy-webpack-plugin": "^4.0.1", "css-loader": "^0.28.0", "extract-text-webpack-plugin": "^3.0.0", "file-loader": "^1.1.4", "friendly-errors-webpack-plugin": "^1.6.1", "html-webpack-plugin": "^2.30.1", "less-loader": "^5.0.0", "node-notifier": "^5.1.2", "node-sass": "^7.0.1", "optimize-css-assets-webpack-plugin": "^3.2.0", "ora": "^1.2.0", "portfinder": "^1.0.13", "postcss-import": "^11.0.0", "postcss-loader": "^2.0.8", "postcss-url": "^7.2.1", "rimraf": "^2.6.0", "sass-loader": "^4.1.1", "semver": "^5.3.0", "shelljs": "^0.7.6", "uglifyjs-webpack-plugin": "^1.1.1", "url-loader": "^0.5.8", "vue-loader": "^13.3.0", "vue-router": "^3.1.5", "vue-style-loader": "^3.0.1", "vue-template-compiler": "^2.5.2", "webpack": "^3.6.0", "webpack-bundle-analyzer": "^2.9.0", "webpack-dev-server": "^2.9.1", "webpack-merge": "^4.1.0" }, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" }, "browserslist": [ "> 1%", "last 2 versions", "not ie <= 8" ] }
-
index.js
import Vue from 'vue' import Router from 'vue-router' import Main from '../views/Main' import Login from "../views/Login" Vue.use(Router); export default new Router({ routes:[ { path:'/main', component:Main }, { path:'/login', component:Login } ] });
-
main.js
import Vue from 'vue' import App from './App' import router from './router' //导入elementUI import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; Vue.use(router); Vue.use(ElementUI); // Vue.config.productionTip = false new Vue({ el: '#app', router, render:h=> h(App)//ElementUI })
注意:Vue Router v3对应Vue2.x, v4对应Vue3,
16、路由嵌套
效果:
- 项目目录结构
-
List.vue
<template> <h1>用户列表</h1> </template> <script> export default { name: "List" } </script> <style scoped> </style>
-
Profile.vue
<template> <h1>个人信息</h1> </template> <script> export default { name: "UserProfile" } </script> <style scoped> </style>
-
Main.vue
<template> <div> <el-container> <el-aside width="200px"> <el-menu :default-openeds="['1']"> <el-submenu index="1"> <template slot="title"><i class="el-icon-caret-right"></i>用户管理</template> <el-menu-item-group> <el-menu-item index="1-1"> <router-link to="/user/profile">个人信息</router-link> </el-menu-item> <el-menu-item index="1-2"> <router-link to="/user/list">用户列表</router-link> </el-menu-item> </el-menu-item-group> </el-submenu> <el-submenu index="2"> <template slot="title"><i class="el-icon-caret-right"></i>内容管理</template> <e1-menu-item-group> <el-menu-item index="2-1">分类管理</el-menu-item> <el-menu-item index="2-2">内容列表</el-menu-item> </e1-menu-item-group> </el-submenu> <el-submenu index="3"> <template slot="title"><i class="el-icon-caret-right"></i>系统管理</template> <e1-menu-item-group> <el-menu-item index="3-1">用户设置</el-menu-item> </e1-menu-item-group> </el-submenu> </el-menu> </el-aside> <el-container> <el-header style="text-align: right; font-size: 12px"> <el-dropdown> <i class="el-icon-setting" style="margin-right:15px"></i> <el-dropdown-menu slot="dropdown"> <el-dropdown-item>个人信息</el-dropdown-item> <el-dropdown-item>退出登录</el-dropdown-item> </el-dropdown-menu> </el-dropdown> </el-header> <el-main> <router-view/> </el-main> </el-container> </el-container> </div> </template> <script> export default { name: "Main" } </script> <style scoped lang="scss"> .el-header { background-color: #048bd1; color: #333; line-height: 60px; } .el-aside { color: #333; } </style>
-
index.js
import Vue from 'vue' import Router from 'vue-router' import Main from '../views/Main' import Login from "../views/Login" import UserList from "../views/user/List"; import UserProfile from "../views/user/Profile"; Vue.use(Router); export default new Router({ routes:[ { path:'/main', component:Main }, { path:'/login',//嵌套路由 component:Login, children:[ {path:'/user/profile',component:UserProfile}, {path:'/user/list',component:UserList}, ] } ] });
17、参数传递及重定向
效果
-
目录结构:和上一节一样
-
Profile.vue
<template> <div> <h1>个人信息</h1> {{id}} </div> </template> <script> export default { props:['id'], name: "UserProfile" } </script> <style scoped> </style>
-
List.vue
<template> <h1>用户列表</h1> </template> <script> export default { name: "List" } </script> <style scoped> </style>
-
Main.vue
<template> <div> <el-container> <el-aside width="200px"> <el-menu :default-openeds="['1']"> <el-submenu index="1"> <template slot="title"><i class="el-icon-caret-right"></i>用户管理</template> <el-menu-item-group> <el-menu-item index="1-1"> <!--name:地址 params传递参数 需要对象:v-bind--> <router-link :to="{name:'UserProfile',params:{id:1}}">个人信息</router-link> </el-menu-item> <el-menu-item index="1-2"> <router-link to="/user/list">用户列表</router-link> </el-menu-item> <el-menu-item index="1-3"> <router-link to="/goHome">回到首页</router-link> </el-menu-item> </el-menu-item-group> </el-submenu> <el-submenu index="2"> <template slot="title"><i class="el-icon-caret-right"></i>内容管理</template> <e1-menu-item-group> <el-menu-item index="2-1">分类管理</el-menu-item> <el-menu-item index="2-2">内容列表</el-menu-item> </e1-menu-item-group> </el-submenu> <el-submenu index="3"> <template slot="title"><i class="el-icon-caret-right"></i>系统管理</template> <e1-menu-item-group> <el-menu-item index="3-1">用户设置</el-menu-item> </e1-menu-item-group> </el-submenu> </el-menu> </el-aside> <el-container> <el-header style="text-align: right; font-size: 12px"> <el-dropdown> <i class="el-icon-setting" style="margin-right:15px"></i> <el-dropdown-menu slot="dropdown"> <el-dropdown-item>个人信息</el-dropdown-item> <el-dropdown-item>退出登录</el-dropdown-item> </el-dropdown-menu> </el-dropdown> </el-header> <el-main> <router-view/> </el-main> </el-container> </el-container> </div> </template> <script> export default { name: "Main" } </script> <style scoped lang="scss"> .el-header { background-color: #048bd1; color: #333; line-height: 60px; } .el-aside { color: #333; } </style>
-
index.js
import Vue from 'vue' import Router from 'vue-router' import Main from '../views/Main' import Login from "../views/Login" import UserList from "../views/user/List"; import UserProfile from "../views/user/Profile"; Vue.use(Router); export default new Router({ routes:[ { path:'/main', component:Main, children:[//嵌套路由 {path:'/user/profile/:id',name:'UserProfile',component:UserProfile,props:true}, {path:'/user/list',component:UserList}, ] }, { path:'/login', component:Login }, {//演示重定向 path:'/goHome', redirect:'main' } ] });
18、404和路由钩子
路由方式有两种
- hash:路径带#(默认)
- history:路径不带#
将路由改为history模式
只需要在index.js文件中改
import Vue from 'vue'
import Router from 'vue-router'
import Main from '../views/Main'
import Login from "../views/Login"
import UserList from "../views/user/List";
import UserProfile from "../views/user/Profile";
Vue.use(Router);
export default new Router({
mode:'history', //修改路由的方式在这里
routes:[
{
path:'/main/:name',
component:Main,
props:true,
children:[
{path:'/user/profile/:id',name:'UserProfile',component:UserProfile,props:true},
{path:'/user/list',component:UserList},
]
},
{
path:'/login',
component:Login
},
{
path:'/goHome',
redirect:'main'
}
]
});
自定义404
-
在views目录下 创建404视图
<template> <h1>404,你的页面走丢了</h1> </template> <script> export default { name: "NotFound" } </script> <style scoped> </style>
-
在index.js中导入视图
import NotFound from "../views/NotFound";//1.导入404视图 //2.设置404页面 { path:'*', component:NotFound }
路由钩子与异步请求
- beforeRouteEnter: 在进入路由前执行
- beforeRouteLeave: 在离开路由前执行
在Profile.vue中测试
<template>
<div>
<h1>个人信息</h1>
{{id}}
</div>
</template>
<script>
export default {
props:['id'],
name: "UserProfile",
//进入路由前的钩子,类似过滤器,拦截器
beforeRouteEnter:(to,form,next)=>{
console.log("进入路由之前");
next();
},
beforeRouteLeave:(to,form,next)=>{
console.log("在离开路由前");
next();
}
}
</script>
<style scoped>
</style>
参数说明:
- to : 路由将要跳转的路径信息
- form : 路径跳转前的路径信息
- next : 路由的控制参数
- nex() 跳入下一个页面
- nex(‘/path’) 改变路由的跳转方向,使其跳到另一个路由
- next(false) 返回原来的页面
- next((vm)=>{})仅在beforeRouteEnter中可用,vm时组件实列
在钩子函数中使用异步请求
-
安装Axios
cnpm install axios -s
-
main.js引用Axios
import axios from 'axios' import VueAxios from 'vue-axios' Vue.use(VueAxios,axios); Vue.prototype.axios = axios;
-
Profile.vue
<template> <div> <h1>个人信息</h1> {{$route.params.id}}<br/> {{id}} </div> </template> <script> export default { props: ['id'], name: "UserProfile", beforeRouteEnter: (to, from, next)=>{ console.log("进入钩子之前"); next(vm => { vm.getData(); // 进入路由之前,执行我们自定义的getData方法 }); }, beforeRouteLeave: (to, from, next)=>{ console.log("离开钩子之前") next(); }, methods: { getData: function () { this.axios({ method: 'get', url: 'http://localhost:8080/static/data.json' }).then(function (response) { console.log(response) }); } } } </script> <style scoped> </style>