前端学习八(Vue Router)
Vue Router官网:https://router.vuejs.org/zh/guide/#html
一、引用库
<script src="https://unpkg.com/vue-router/dist/vue-router.js">script>
二、定义 (路由) 组件(可以从其他文件 import 进来)
Login组件如下
const Login = { template: ``, data() { return { form: { username: "", password: "" } } }, methods: { async login() { const r = await http.post("/user/login/", this.form) if (r.status === 200) { const token = r.data.token; window.sessionStorage.setItem("token", token) // 编程式跳转路由 this.$router.push('/home') // this.$router.push({ path: '/login' }) } else { alert("登录失败") } } } }用户登录
点击登录
Home组件如下
const Home = { template: `` , data() { return { tableData: "" } }, methods: { async getProjects() { const r = await http.get("/projects/") console.log(r); if (r.status === 200) { this.tableData = r.data.results } else { alert("获取项目失败") } }, } }获取项目
三、定义路由以及创建路由实例
// 2. 定义路由 // 每个路由应该映射一个组件。 其中"component" 可以是通过 Vue.extend() 创建的组件构造器, // 或者,只是一个组件配置对象。 const routes = [ { path: "/login", component: Login }, { path: "/home", component: Home } ] // 3. 创建 router 实例 const router = new VueRouter({ routes: routes // 如果定义的路由名和key相同,则可以如下简写 // routes })
子路由
const routes = [ { path: "/", component: Home, // 子路由,内容会渲染在父路由的router-view中 children: [ { path: "/index", component: index }, { path: "/project", component: project }, { path: "/api", component: api } ] }, { path: "/login", component: Login } ]
别名和重定向
const routes = [ // 重定向 { path: "/", redirect: "/login" }, // 别名name { name: "rgs", path: "/register", component: Register }, { path: "/login", component: Login }, { path: "/home", component: Home } ]
别名被使用的两种方式
// 编程式跳转路由,使用别名 this.$router.push({ name: 'rgs' })
<router-link :to="{name:'rgs'}" >注册router-link>
四、注入路由到vue实例
// 4. 注入路由到vue实例 const app = new Vue({ el: "#app", router: router })
五、使用
<div id='app'> <router-view>router-view> div>
六、编程式导航和声明式导航
// 编程式跳转路由 this.$router.push('/home')
<router-link to="/login">登录页面router-link>
七、上面学习内容练习的实例
实例1
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js">script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js">script>
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<script src="https://unpkg.com/element-ui/lib/index.js">script>
head>
<body>
<div id='app'>
<router-view>router-view>
div>
<script>
const http = axios.create({
baseURL: 'http://api.keyou.site:8000',
timeout: 1000
});
http.interceptors.request.use(function (config) {
const token = window.sessionStorage.getItem("token")
if (token) {
config.headers.Authorization = 'JWT ' + token
}
return config;
}, function (error) {
return Promise.reject(error);
});
// 1. 定义 (路由) 组件,可以从其他文件 import 进来
const Login = {
template: `
<div class="box">
<el-card class="box-card">
<h3>用户登录</h3>
<el-form :model="form" label-width="80px">
<el-form-item label="账号">
<el-input v-model="form.username"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input v-model="form.password" type="password"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="login">点击登录</el-button>
</el-form-item>
</el-form>
</el-card>
</div>`,
data() {
return {
form: {
username: "musen123",
password: "123456"
}
}
},
methods: {
async login() {
const r = await http.post("/user/login/", this.form)
if (r.status === 200) {
const token = r.data.token;
window.sessionStorage.setItem("token", token)
// 编程式跳转路由
this.$router.push('/home')
// this.$router.push({ path: '/login' })
} else {
alert("登录失败")
}
}
}
}
const Home = {
template: `
<div class="box2">
<el-button type="primary" @click="getProjects">获取项目</el-button>
<el-table :data="tableData" stripe style="width: 100%">
<el-table-column prop="id" label="ID" width="180">
</el-table-column>
<el-table-column prop="name" label="项目" width="180">
</el-table-column>
<el-table-column prop="create_time" label="创建时间" min-width="200px">
</el-table-column>
</el-table>
</div>` ,
data() {
return { tableData: "" }
},
methods: {
async getProjects() {
const r = await http.get("/projects/")
console.log(r);
if (r.status === 200) {
this.tableData = r.data.results
} else {
alert("获取项目失败")
}
},
}
}
// 2. 定义路由
// 每个路由应该映射一个组件。 其中"component" 可以是通过 Vue.extend() 创建的组件构造器,
// 或者,只是一个组件配置对象。我们晚点再讨论嵌套路由。
const routes = [
{ path: "/login", component: Login },
{ path: "/home", component: Home }
]
// 3. 创建 router 实例
const router = new VueRouter({
routes: routes
// 如果定义的路由名和key相同,则可以如下简写
// routes
})
// 4. 注入路由到vue实例
const app = new Vue({
el: "#app",
router: router
})
script>
body>
html>
实例2
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js">script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js">script>
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<script src="https://unpkg.com/element-ui/lib/index.js">script>
head>
<body>
<div id='app'>
<el-menu class="el-menu-demo" mode="horizontal" background-color="#545c64" text-color="#fff"
active-text-color="#ffd04b">
<el-menu-item index="11">
<router-link to="/login">登录页面router-link>
el-menu-item>
<el-menu-item index="12">
<router-link to="/home">个人中心router-link>
el-menu-item>
<el-menu-item index="13">
<router-link :to="{name:'rgs'}" >注册router-link>
el-menu-item>
<el-submenu index="2">
<template slot="title">我的工作台template>
<el-menu-item index="2-1">选项1el-menu-item>
<el-menu-item index="2-2">选项2el-menu-item>
<el-menu-item index="2-3">选项3el-menu-item>
el-submenu>
<el-menu-item index="3" disabled>消息中心el-menu-item>
<el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理a>el-menu-item>
el-menu>
<router-view>router-view>
div>
<script>
const http = axios.create({
baseURL: 'http://api.keyou.site:8000',
timeout: 1000
});
http.interceptors.request.use(function (config) {
const token = window.sessionStorage.getItem("token")
if (token) {
config.headers.Authorization = 'JWT ' + token
}
return config;
}, function (error) {
return Promise.reject(error);
});
// 1. 定义 (路由) 组件
const Login = {
template: `
<div class="box">
<el-card class="box-card">
<h3>用户登录</h3>
<el-form :model="form" label-width="80px">
<el-form-item label="账号">
<el-input v-model="form.username"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input v-model="form.password" type="password"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="login">点击登录</el-button>
</el-form-item>
</el-form>
</el-card>
</div>`,
data() {
return {
form: {
username: "musen123",
password: "123456"
}
}
},
methods: {
async login() {
const r = await http.post("/user/login/", this.form)
if (r.status === 200) {
const token = r.data.token;
window.sessionStorage.setItem("token", token)
// 编程式跳转路由
this.$router.push('/home')
// this.$router.push({ path: '/login' })
} else {
alert("登录失败")
}
}
}
}
const Home = {
template: `
<div class="box2">
<el-button type="primary" @click="registerBtn">注册</el-button>
<el-button type="primary" @click="getProjects">获取项目</el-button>
<el-table :data="tableData" stripe style="width: 100%">
<el-table-column prop="id" label="ID" width="180">
</el-table-column>
<el-table-column prop="name" label="项目" width="180">
</el-table-column>
<el-table-column prop="create_time" label="创建时间" min-width="200px">
</el-table-column>
</el-table>
</div>` ,
data() {
return { tableData: "" }
},
methods: {
async getProjects() {
const r = await http.get("/projects/")
console.log(r);
if (r.status === 200) {
this.tableData = r.data.results
} else {
alert("获取项目失败")
}
},
async registerBtn() {
// 编程式跳转路由,使用别名
this.$router.push({ name: 'rgs' })
},
}
}
const Register = {
template: `<p1>注册页面</p1>`
}
const routes = [
// 重定向
{ path: "/", redirect: "/login" },
// 别名name
{ name: "rgs", path: "/register", component: Register },
{ path: "/login", component: Login },
{ path: "/home", component: Home }
]
const router = new VueRouter({
routes
})
var vm = new Vue({
el: "#app",
router: router
})
script>
body>
html>
实例3
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js">script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js">script>
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<script src="https://unpkg.com/element-ui/lib/index.js">script>
head>
<body>
<div id='app'>
<router-view>router-view>
div>
<script>
const http = axios.create({
baseURL: 'http://api.keyou.site:8000',
timeout: 1000
});
http.interceptors.request.use(function (config) {
const token = window.sessionStorage.getItem("token")
if (token) {
config.headers.Authorization = 'JWT ' + token
}
return config;
}, function (error) {
return Promise.reject(error);
});
// 1. 定义 (路由) 组件
const Login = {
template: `
<div class="box">
<el-card class="box-card">
<h3>用户登录</h3>
<el-form :model="form" label-width="80px">
<el-form-item label="账号">
<el-input v-model="form.username"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input v-model="form.password" type="password"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="login">点击登录</el-button>
</el-form-item>
</el-form>
</el-card>
</div>`,
data() {
return {
form: {
username: "musen123",
password: "123456"
}
}
},
methods: {
async login() {
const r = await http.post("/user/login/", this.form)
if (r.status === 200) {
const token = r.data.token;
window.sessionStorage.setItem("token", token)
// 编程式跳转路由
this.$router.push('/')
// this.$router.push({ path: '/login' })
} else {
alert("登录失败")
}
}
}
}
const Home = {
template: `
<div>
<el-menu class="el-menu-demo" mode="horizontal" background-color="#545c64" text-color="#fff"
active-text-color="#ffd04b">
<el-menu-item index="1">
<router-link to="/index">index页面</router-link>
</el-menu-item>
<el-menu-item index="2">
<router-link to="/project">项目页面</router-link>
</el-menu-item>
<el-menu-item index="2">
<router-link to="/api">api页面</router-link>
</el-menu-item>
</el-menu>
<router-view></router-view>
</div>`
}
const index = {
template: `<h1>index页面</h1>`
}
const project = {
template: `<h1>项目页面</h1>`
}
const api = {
template: `<h1>api页面</h1>`
}
const routes = [
{
path: "/",
component: Home,
// 子路由,内容会渲染在父路由的router-view中
children: [
{ path: "/index", component: index },
{ path: "/project", component: project },
{ path: "/api", component: api }
]
}, {
path: "/login",
component: Login
}
]
const router = new VueRouter({
routes// (缩写) 相当于 routes: routes
})
var vm = new Vue({
el: "#app",
router: router
})
script>
body>
html>