P10第10节路由【晓舟报告】从零开始学前端-Vue基础教程
之前师傅是手把手教,演示。这样我才知道。当面指出学的最快。就是npm run dev
npm run serve 他会说为什么这么写,因为dev在那边了。上班和读大学一样,散了就基本不会再见了。
即使只学了一点点,也要能说出个所以然。把这一点点东西,讲明白,心里能理清楚。韦神,对数学勤奋找到了自己人生的价值和追求,别的就不重要了。老师。以书为伴以知识围板,饮食很简单,鸡蛋1瓶矿泉水1.5升。知道自己在做什么,心中有数很重要。。
代码:
1)没弄出来,他写的那个首页是怎么显示在主键上面的。那就去看视频。 遇见问题想办法解决。
<template> <!-- 这是主键App.vue --> <div id="app"> <nav> <router-link to="/Login">登录页</router-link> | <router-link to="/">Home首页</router-link> | <!-- <router-link to="/about">about</router-link> | --> <router-link to="/Blog">Blog博客</router-link>| <router-link to="/Video">Video视频</router-link>|| <span>欢迎:{{ username }}<button @click="logout">注销</button></span > </nav> <!-- 是让router的页面显示的。 --> <router-view /> </div> </template> <script> export default { data() { return { // username: '', username: localStorage.getItem('usr'), // showUser:localStorage.getItem("usr") }; }, watch: { '$route.path': function () { // console.log('world'); this.username = localStorage.getItem('usr') // this.showUser=localStorage.getItem("user") }, }, methods: { // logout() { //1.注销用localStorage.clear(); 2.用路由跳转到登录页面 // localStorage.clear(); // this.$router.push('/login'); // }, // methods中写方法 // localStorage.clear(); // this.$rouer.push("/login"); // 注销的方法logout // logout() { // // 本地数据的注销 // localStorage.clear(); // // 由路由跳转到login登录的界面 // this.$router.push('/login'); // }, // 注销的方法 logout(){ localStorage.clear(); this.$router.push("/login") } }, }; </script> <style></style>
在view文件当中的文件
<template> <!-- 这是views文件夹下面的HomeView.vue文件 --> <div class="home"> <img alt="Vue logo" src="../assets/logo.png"> <HelloWorld msg="Welcome to Your Vue.js App"/> </div> </template> <script> // @ is an alias to /src import HelloWorld from '@/components/HelloWorld.vue' export default { name: 'HomeView', components: { HelloWorld } } </script>
<template> <!-- 这是views文件夹下面的BlogView.vue文件 --> <div> <h1>blog</h1> <ul> <li><router-link to="">javascript教程 </router-link></li> <li><router-link to="">nodejs教程</router-link></li> </ul> </div> </template> <script> export default {}; </script> <style></style>
<template> <!-- 这是views文件夹下面的AboutView.vue文件 --> <div class="about"> <h1>This is an about page</h1> </div> </template>
<template> <div> <!-- 这是views文件夹下面的VideoView.vue文件 --> <video src="" controls></video> </div> </template> <script> export default {}; </script> <style></style>
<template> <div> <!-- 这是views文件夹下面的LoginView.vue文件 --> <form @submit.prevent="doLogin"> <h1>首页</h1> <input type="text" placeholder="用户名" v-model="username" /> <input type="password" placeholder="密码" /> <button>点击登录</button> </form> </div> </template> <script> export default { data() { // 创建数据要return数据 多改正几次bug就知道了 v-model绑定数据,双向绑定。 return { username: '', }; }, methods: { // methods中写方法 doLogin() { // 命令行输出username console.log('this.username'); // 本地存储 username 将数据进行本地保存。 localStorage.setItem('usr', this.username); //用导航的功能,用一个push方法,后面写的/地址就可以跳转到对应的地址了。将页面路由跳转。 this.$router.push('/'); //本地获取到username localStorage.getItem('user'); }, }, }; </script>
router的文件
// index.js文件夹中定义整体路由跳转的方式 写路由 的文件 import Vue from 'vue'; import VueRouter from 'vue-router'; import HomeView from '../views/HomeView.vue'; import BlogView from '../views/BlogView'; import VideoView from '../views/VideoView'; // 导入组件 import LoginView from '../views/LoginView'; Vue.use(VueRouter); // 定义数组变量 const routes = [ { //导入组件。把组件配置到这个环境里。这边path里的值的 内容和 route-link里的值 是一样的。 path: '/', name: 'home', component: HomeView, }, { path: '/blog', name: 'Blog', component: BlogView, }, { // 写path的时候会变成小写的样子。 path: '/Video', name: 'Video', component: VideoView, }, { path: '/Login', name: 'Login', component: LoginView, }, ]; const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes, }); // 导航守卫 // router.beforeEach((to, from, next) => { // 先检测一下,看看有没有效果。 // console.log('hello world'); // if (to.path !== './Login') { // if (localStorage.getItem('usr')) { // next(); // } // } else { // next(); // } // }); export default router;
2)那就重新看视频,看一下它在主键文件中是怎么写的。
第1个是路由文件router.index导入文件写好配置。第2个是App..vue显示页面,写路由进去显示出来。第3个是登录文件Login.vue文件。
看着敲出来了。有逻辑的。
<template> <!-- 这是主键App.vue --> <div id="app"> <nav> <!-- router-link就相当于a标签的作用。 --> <!-- <router-link to="/Login">登录页</router-link> | --> <router-link to="/">Home首页</router-link> | <router-link to="/Blog">Blog博客</router-link>| <router-link to="/Video">Video视频</router-link>|| <!-- 注销的时候这个不可见。 --> <span v-if="showUser">欢迎:{{ username }} <!-- 注销的按钮事件。点击按钮引发的注销事件。把注销的方法写到方法里面。 --> <button @click="logout">注销</button> <!-- <button @click="logout">注销</button> --> </span> </nav> <!-- 是让router的页面显示的。 --> <router-view /> </div> </template> <script> export default { data(){ return{ username:localStorage.getItem("usr"), showUser:true } }, // 监听变量 watch:{ //侦听函数的路径的变化 "$route.path":function(){ // 这个是检测的,页面切换的时候命令行就会出现world // console.log("world") // 当页面切换的时候,就是直接把this.username的值变成localStorage.getItem("usr") this.username=localStorage.getItem("usr") this.showUser=localStorage.getItem("usr") } }, methods:{ logout(){ // 清空本地存储。 localStorage.clear(); // 跳转到/login 的页面。 this.$router.push("/login") } } }; </script> <style></style>
<template> <div> <!-- 这是views文件夹下面的VideoView.vue文件 --> <video src="" controls></video> </div> </template> <script> export default {}; </script> <style></style>
<template> <div> <!-- 这是views文件夹下面的LoginView.vue文件登录页面 解决当下遇见的问题。 --> <!-- 提交表单@submit.prevent="doLogin" submit就是提交方法,在写方法的methods中写方法doLogin--> <form @submit.prevent="doLogin"> <h1>首页</h1> <!-- 双向绑定,绑定字符串username --> <input type="text" placeholder="用户名" v-model="username" /> <input type="password" placeholder="密码" /> <button>点击登录</button> </form> </div> </template> <script> export default { data() { // 创建数据要return数据 多改正几次bug就知道了 v-model绑定数据,双向绑定。 return { // 新建变量 username: '', }; }, methods: { // methods中写方法 // doLogin方法实现表单提交,数据本地保存,提交之后实现页面跳转。 doLogin(){ // 命令行输出username // console.log('this.username'); // 本地存储 username 将数据进行本地保存。localStorage是个对象,后面是setItem方法 变量的值是usr,设置成this.username 这样就把username在本地存储了。 localStorage.setItem("usr", this.username); //本地获取到username getItem方法就可以拿到本地存储的。 存起来了之后,在哪显示出来呢?在App.vue中显示出来的。。把localStorage.getItem('user')赋值给username 。 // localStorage.getItem('user'); // push('/')实现页面跳转。用导航的功能,用一个push方法,后面写的/地址就可以跳转到对应的地址了。将页面路由跳转。可以用$router的push方法,可以把它跳转到网页挑战到首页了。 this.$router.push("/"); }, }, }; </script>
<template> <!-- 这是views文件夹下面的HomeView.vue文件 --> <div class="home"> <h1>首页</h1> </div> </template> <script> // @ is an alias to /src export default { } </script>
<template> <!-- 这是views文件夹下面的BlogView.vue文件 --> <div> <h1>blog</h1> <ul> <li><router-link to="">javascript教程 </router-link></li> <li><router-link to="">nodejs教程</router-link></li> </ul> </div> </template> <script> export default {}; </script> <style></style>
<template> <!-- 这是views文件夹下面的AboutView.vue文件 --> <div class="about"> <h1>This is an about page</h1> </div> </template>
路由文件router文件夹下面的index.js文件
// index.js文件夹中定义整体路由跳转的方式 写路由 的文件 import Vue from 'vue'; import VueRouter from 'vue-router'; import HomeView from '../views/HomeView.vue'; // 引入组件。 import BlogView from '../views/BlogView'; import VideoView from '../views/VideoView'; // 导入组件 import LoginView from '../views/LoginView'; Vue.use(VueRouter); // 定义数组变量 const routes = [ { // 导入组件。把组件配置到这个环境里。这边path里的值的 内容和 route-link里的值 是一样的。 path: '/', name: 'home', component: HomeView, }, { path: '/blog', name: 'Blog', component:BlogView }, { // 写path的时候会变成小写的样子。 path: '/video', name: 'Video', component: VideoView }, { // 写Login的路由 path: '/Login', name: 'Login', component: LoginView, }, ]; const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes, }); // 导航守卫 to是访问到哪,from是从哪访问 next是继续访问。 router.beforeEach((to, from, next) => { // 先检测一下,看看有没有效果。 // console.log('hello world'); if (to.path !== '/Login') { if (localStorage.getItem('usr')) { next(); }else { // 如果不是,可以将它重定向,定向到Login这边。 next("/Login"); } }else { next(); } }); export default router;
<template> <div> <!-- 这是Login页面 --> <h1>登录页</h1> <form @submit.prevent="doLogin"> <input type="text" placeholder="用户名" v-model="username"> <input type="password" placeholder="密码"> <button>点击登录</button> </form> </div> </template> <script> export default { data(){ return{ username:"" } }, methods:{ doLogin(){ // 本地存储数据。localStorage是对象。对象有个方法是setItem("usr",this.username) 设置一个变量usr 把它的值设置为this.username 就把数据存起来了。 localStorage.setItem("usr",this.username); // localStorage.getItem("usr"); 就可以拿到这个数据的值了。 // 路由切换到首页的路径。编程式导航的功能。this.$router能找到这个对象,再用push的方法。 this.$router.push("/"); } } } </script> <style> </style>
// router文件夹下的index.js文件夹中定义整体路由跳转的方式 写路由 的文件 // 导入组件,之后再配置路由。 import Vue from 'vue'; import VueRouter from 'vue-router'; import HomeView from '../views/HomeView' import BlogView from '../views/BlogView' import VideoView from '../views/VideoView' import LoginView from '../views/LoginView' Vue.use(VueRouter); // 定义数组变量 const routes = [ { // 导入组件。把组件配置到这个环境里。这边path里的值的 内容和 route-link里的值 是一样的。 // 写path的时候会变成小写的样子。组件component path: '/', name: 'home', component: HomeView, }, { path: '/blog', name: 'Blog', component:BlogView }, { path: '/video', name: 'Video', component:VideoView }, { // 写Login登录页的路由 path: '/Login', name: 'Login', component: LoginView, }, ]; const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes, }); // 导航守卫 to是访问到哪,from是从哪访问 next是继续访问。 router.beforeEach((to, from, next) => { // 先检测一下,看看有没有效果。 // console.log('hello world'); if (to.path !== '/Login') { if (localStorage.getItem('usr')) { next(); }else { // 如果不是,可以将它重定向,定向到Login这边。 next("/Login"); } }else { next(); } }); export default router;
<template> <div> <!-- 这是显示的主键界面App.vue --> <router-link to="/">home首页</router-link>| <router-link to="/blog">blog博客</router-link>| <router-link to="/video">video视频</router-link>|| <!-- 路由显示 --> <span v-if="showUser"> 欢迎:{{username}} <button @click="logout">点击注销</button> </span> <router-view/> </div> </template> <script> export default { data(){ return{ // 为什么要写在这边呢?因为这边需要显示数据。 username:localStorage.getItem("usr"), // showUser:true showUser:localStorage.getItem("usr") } }, watch:{ // 侦听函数路径的变化。 '$route.path':function(){ // 这个监听数据写了之后才会有效果。 this.username=localStorage.getItem("usr"); this.showUser=localStorage.getItem("usr") } }, methods:{ logout(){ // 1.清空数据clear方法后面要有括号() 2.路由切换到登录的网页。 localStorage.clear(); this.$router.push("/Login"); } } } </script> <style> </style>
<template> <div> <!-- 这是views文件夹下面的BlogView.vue文件 --> <ul> <li> <router-link to="">Java语言</router-link> </li> <li> <router-link to="">axios请求</router-link> </li> <li> <router-link to="">JavaScript语言</router-link> </li> </ul> </div> </template> <script> export default { } </script> <style> </style>
<template> <div> <!-- 这是views文件夹下面的VideoView.vue文件 --> <video src="" controls></video> </div> </template> <script> export default {}; </script> <style></style>
<template> <!-- 这是views文件夹下面的AboutView.vue文件 --> <div class="about"> <h1>This is an about page</h1> </div> </template>
4)第4遍
<template> <div> <h1 style="color:grey;">这是主键显示页面</h1> <!-- 这是主键显示页面 --> <router-link to="/">home首页</router-link> | <router-link to="/blog">博客blog</router-link> | <router-link to="/video">视频video</router-link> || <!-- 路由显示 --> <!-- v-if当注销之后,不显示这边的文字。 --> <span v-if="showUser"> 欢迎:{{username}} <button @click="logout">注销按钮</button> </span> <!-- 为什么不显示呢?要在router-view才能显示出来啊 --> <router-view/> </div> </template> <script> export default { data(){ return{ //获取数据。为什么要在这边获取数据呢??是因为上面的欢迎要显示。后面要用到这个数据匹配这个页面点击能否访问。路由侦听。 我的知识还没学完。 username:localStorage.getItem("usr"), // showUser新建数据 showUser有数值的时候就是正的值显示数据,showUser没有数值的时候就是0就不显示。打好基本功。 // showUser:true, showUser:localStorage.getItem("usr") } }, // 监听器 watch:{ // 监听函数路径的变化 '$route.path':function(){ // 这个监听数据写了之后才会有效果。 this.username=localStorage.getItem("usr"); this.showUser=localStorage.getItem("usr"); } }, methods:{ logout(){ // 注销里面的数据。 clear方法clear() localStorage.clear(); // 导航到登录页 this.$router.push("/login"); } } } </script> <style> </style>
// index.js文件夹中定义整体路由跳转的方式 写路由 的文件 // 导入组件,之后再配置路由。 import Vue from 'vue'; import VueRouter from 'vue-router'; import HomeView from '../views/HomeView' import BlogView from '../views/BlogView' import VideoView from '../views/VideoView' import LoginView from '../views/LoginView' Vue.use(VueRouter); // 定义数组变量 const routes = [ { // 导入组件。把组件配置到这个环境里。这边path里的值的 内容和 route-link里的值 是一样的。 // 写path的时候会变成小写的样子。组件component path: '/', name: 'home', component: HomeView, }, { path: '/blog', name: 'Blog', component:BlogView }, { path: '/video', name: 'Video', component:VideoView }, { // 写Login登录页的路由 path: '/Login', name: 'Login', component: LoginView, }, ]; const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes, }); // // 导航守卫 to是访问到哪,from是从哪访问 next是继续访问。 // router.beforeEach((to, from, next) => { // // 先检测一下,看看有没有效果。 // // console.log('hello world'); // if (to.path !== '/Login') { // if (localStorage.getItem('usr')) { // next(); // }else { // // 如果不是,可以将它重定向,定向到Login这边。 // next("/Login"); // } // }else { // next(); // } // }); // 导航守卫 to是访问去哪,from是从哪访问,next是继续访问。 router.beforeEach((to, from, next)=>{ //先检测一下,看看有没有效果。 // console.log("hello world"); if (to.path !== '/Login') { if (localStorage.getItem("usr")) { next(); } else { next("/Login"); } } else { next(); } }); export default router;
<template> <div> <!-- 这是LoginView登录页面 --> <!-- form表单中,在form中写提交数据事件,在button点击的时候就可以接收到 --> <h1>这是登录页</h1> <form @click.prevent="doLogin"> <input type="text" v-model="username" placeholder="用户名"> <input type="password" placeholder="密码"> <button>点击登录</button> </form> </div> </template> <script> export default { // 声明变量 data(){ return{ username:"" } }, methods:{ doLogin(){ // 本地存储数据 localStorage.setItem("usr",this.username); // 路由切换路径 this.$router.push("/"); } } } </script> <style> </style>
<template> <div> <!-- 这是views文件夹下面的VideoView.vue文件 --> <h1>这是video文件</h1> <video src="" controls></video> </div> </template> <script> export default {}; </script> <style></style>
<template> <div> <!-- 这是views文件夹下面的BlogView.vue文件 --> <ul> <li> <router-link to="">Java语言</router-link> </li> <li> <router-link to="">axios请求</router-link> </li> <li> <router-link to="">JavaScript语言</router-link> </li> </ul> </div> </template> <script> export default { } </script> <style> </style>
<template> <!-- 这是views文件夹下面的HomeView.vue文件 --> <div class="home"> <h1>首页</h1> </div> </template> <script> // @ is an alias to /src export default { } </script>
<template> <!-- 这是views文件夹下面的AboutView.vue文件 --> <div class="about"> <h1>This is an about page</h1> </div> </template>
未登录的页面
登录完成之后的页面:
5)第5遍 认真做
// index.js文件夹中定义整体路由跳转的方式 写路由 的文件 // 第一步先1)导入组件,之后再2)配置路由。 import Vue from 'vue'; import VueRouter from 'vue-router'; import HomeView from '../views/HomeView' import BlogView from '../views/BlogView' import VideoView from '../views/VideoView' import LoginView from '../views/LoginView' Vue.use(VueRouter); // 定义数组变量 const routes = [ { // 导入组件。把组件配置到这个环境里。这边path里的值的 内容和 route-link里的值 是一样的。 // 写path的时候会变成小写的样子。组件component path: '/', name: 'home', component: HomeView, }, { path: '/blog', name: 'Blog', component:BlogView }, { path: '/video', name: 'Video', component:VideoView }, { // 写Login登录页的路由 path: '/Login', name: 'Login', component: LoginView, }, ]; const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes, }); // // 导航守卫 to是访问到哪,from是从哪访问 next是继续访问。 // router.beforeEach((to, from, next) => { // // 先检测一下,看看有没有效果。 // // console.log('hello world'); // if (to.path !== '/Login') { // if (localStorage.getItem('usr')) { // next(); // }else { // // 如果不是,可以将它重定向,定向到Login这边。 // next("/Login"); // } // }else { // next(); // } // }); // // 导航守卫 to是访问去哪,from是从哪访问,next是继续访问。 // router.beforeEach((to, from, next)=>{ // //先检测一下,看看有没有效果。 // // console.log("hello world"); // if (to.path !== '/Login') { // if (localStorage.getItem("usr")) { // next(); // } else { // next("/Login"); // } // } else { next(); } // }); // 导航守卫 // router.beforeEach((to, from, next) => { // if (to.path !== '/login') { // if (localStorage.getItem("usr")) { // next(); // } else { // next("/login") // } // } // else { // next() // } // }) // 控制权限,导航守卫 to是去哪,from是从哪,next是继续访问 router.beforeEach((to, from, next) => { if (to.path !== "/Login") { if (localStorage.getItem("usr")) { next(); } else { next("/Login"); } } else { next(); } }) export default router;
<template> <div> <h1>这是显示的App.vue文件</h1> <router-link to="/">主页home</router-link> | <router-link to="/blog">博客blog</router-link> | <router-link to="/video">视频video</router-link> || <!-- 写router-link的时候一定要写router-view显示数据 --> <!-- v-if判断能否显示。 --> <span v-if="showUser"> 欢迎你:{{username}} <button @click="logout">点击注销</button> </span> <router-view/> </div> </template> <script> export default { data(){ return{ username:localStorage.getItem("usr"), showUser:localStorage.getItem("usr") } }, // 侦听器功能 侦听路由路径 把侦听器写在方法的前面 route.path。 watch:{ '$route.path':function(){ this.username=localStorage.getItem("usr") this.showUser=localStorage.getItem("usr") } }, methods:{ logout(){ localStorage.clear() this.$router.push("/Login") } } } </script> <style> </style>
<template> <div> <h1>这是login登录网页</h1> <form @submit.prevent="doLogin"> <input type="text" placeholder="关键字" v-model="username"> <input type="password" placeholder="密码"> <button>点击登录</button> </form> </div> </template> <script> export default { data(){ return{ username:"" } }, methods:{ doLogin(){ localStorage.setItem("usr",this.username) // 刷新数据 this.$router.push("/") } }, } </script> <style> </style>
<template> <div> <!-- --> <h1>这是博客Blog</h1> <ul> <li> <router-link to="">Java课程</router-link> </li> <li> <router-link to="">node课程</router-link> </li> <li> <router-link to="">前端课程</router-link> </li> </ul> </div> </template> <script> export default { } </script> <style> </style>
<template> <div> <!-- 这是主页home --> <h1>这是主页Home</h1> </div> </template> <script> export default { } </script> <style> </style>
<template> <div> <h1>这个是video页面</h1> <video src="" controls></video> </div> </template> <script> export default { } </script> <style> </style>
6)第6遍 认真做
最重要的文件就是显示文件App.vue文件,router文件夹下的index.js文件,Login.vue登录文件。
努力是不辜负自己,独立才能不拖累别人,同龄人在升学,学历是自己的资本,工整是有自己的正确的习惯。