换个页面,VueRouter就派上大用场了。可是在换页前,我们得先看看服务器是不是正常运行着,还有就是检查一下用户是否有权限访问。所以,今天就来聊聊如何利用VueRouter搞定这些事情!
一、安装和配置Vue Router
首先得装个VueRouter!敲下下面这个命令就能搞定:
bash npm install vue-router
先搞定VueRouter的主要Javascript文件安装,接下来就能搞定路由设定
javascript import Vue from 'vue'; 直接用VueRouter,它就是我们的Vue导航器。 import App from './App.vue'; 直接把'./routes'的文件夹拿来用就好。 Vue.use(VueRouter); 就这么简单,我们用VueRouter搭建了个路由框架。 routes }); new Vue({ router, render: h => h(App) }).$mount('#app'); 哈喽,我们快来学学怎么用VueRouter装路由!以后处理数据就轻松多了哦~npm install vue-router --save二、使用Vue Router的beforeEach钩子
说到VueRouter,真是厉害!不管换哪个页面,它都会跑个代码先,这"beforeEach"就是干这个事的。比如你想提前下载点啥到手机里,这里就能搞定。其实,这就是个小事儿,超容易理解的:
记住,每次换线之前别忘了先瞅两眼!我们就管这个叫做“(to, from, next)”或者是“前后跳转”,简单易懂的。
if (to.meta.requiresAuth) {
从服务器上给我拿点数据来,然后告诉我。
// 将数据保存到Vue实例或者Vuex中import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const routes = [ // 定义路由 ] const router = new VueRouter({ routes }) new Vue({ router, render: h => h(App) }).$mount('#app')给store提交数据更新,'setData': data。
next();
}).catch(error => {
唉,看看,我又掉链子了,抓取的数据获取失败,挨!
next(false);
});
} else {
next();
}
这儿有段代码,咱们就用fetchDataFromServer这个小程序搞定了从服务器拉数据的活儿。这玩意儿给你送来个Promise对象,你就可以和服务器愉快滴聊天,轻轻松松抓到想要的东西!搞定以后,当然得记得把数据存储起来,这样以后才能随便用。那要是没能取到数据咋办?别急,用next(false)就让路由老老实实等着呗。
三、注销钩子函数
搞定数据预处理后,别忘了把讨厌的钩子函数给去掉。可别让它跑去捣乱别的页面呀~关了Vue实例之前,别忘了从Vue Router里面踢出来
每次翻页前记得调好这个功能,不然你的路径可能就没用!其实,它就是防那些干扰路径的钩子函数的。
// 钩子函数的逻辑
export default {router.beforeEach((to, from, next) => { // 在这里进行数据预处理的操作 fetchDataFromServer(to.path) .then(data => { // 将数据保存到Vue实例或者Vuex中 store.commit('setData', data) next() }) .catch(error => { console.error('数据获取失败', error) next(false) // 停止路由跳转 }) })beforeDestroy() {
unregisterHook();
};
这个remove hook就像个关机快捷键,只要你悄悄地把它放进你的Vue实例里,等Vue跑完之后,它会直接帮你把挂载的钩子函数干掉!
四、处理用户权限验证
咱们不仅要把服务器数据拉过来,还要在每回检测前加个“每次开始”,保证用户有这权限!比如说你要看只有登录了才有的页面,首先看看这个用户是不是已经登陆。
想要成功打卡得先登录网页才行(上面有提示"to.meta.requiresAuth")。这时候别犹豫,赶紧检查看看自己是不是已经登录了呢("!store.getters.isLoggedIn")!
next('/login');
咱们去店里看下,有没有IsLoggedIn这个标识,如果有就能知道用户是否已经登陆?不过我这儿显示还是空的。那就只好让他们先回到登陆页面
五、处理页面加载状态
记得在整理资料时说说你在干嘛,像是每次开始前加个小广告加载下,搞定后马上弄掉!
把'加载中'那个设定改成假了。
服务器发来了数据,然后咱来处理一下。就这么简单!把'text'扔进'store'里,然后来个store.commit('setData', text)搞定。
把加载状态设为关闭。
}).catch(error => {
“数据好像出了点问题!没事,我帮你看看咋回事。” console.error(error);
next(false);
});
这个神奇功能可以看到咱们处理数据的情况!是不是还在慢慢加载?
六、处理页面缓存const unregisterHook = router.beforeEach((to, from, next) => { // 钩子函数的具体操作 }) new Vue({ router, beforeDestroy() { unregisterHook() // 注销钩子函数 }, render: h => h(App) }).$mount('#app')只要在VueRouter里面加个keep-alive,页面填好的信息就不会丢失了!
html给`$route.meta.keepAlive`设置个值,这样就能保存下你想要保留的页面!
七、处理页面过渡效果
为了提升用户体验,我们还可以在页面跳转时添加过渡效果:
在进入和离开时,动画效果会让你感觉到变化。
transition: opacity .5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
Transition这玩意儿真的酷爆了,能让你的网页切换炫到飞起!
八、处理动态路由
对,有时要看看人家为啥点了啥键才行,这样才能搞清楚咋弄路由器。比如,有人点了个钮,那咱们就再加点儿路由!
router.addRoute({
path: ‘/dynamic’,
component: DynamicComponent
只需要加入Route,走新的路就变得超简单~ 换页?那不是秒按秒进吗!
九、处理路由导航守卫
我们之前聊过的那个beforeEach,其实Vue Router里头还有别的好用的导航钩子!像 beforeResolve和afterEach这两个就安静的躺在那儿等着你去发现。
路由处理就是先搜集点资料,搞清楚你要啥,从哪儿来。干嘛用?充当下保险,先把有用的信息全收好再发送出去呗。
// 在所有组件内守卫和异步路由组件被解析之后调用
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const fetchDataFromServer = async (path) => { // 向服务器发送请求并获取数据的逻辑 } const routes = [ // 定义路由 ] const router = new VueRouter({ routes }) const unregisterHook = router.beforeEach((to, from, next) => { fetchDataFromServer(to.path) .then(data => { // 将数据保存到Vue实例或者Vuex中 store.commit('setData', data) next() }) .catch(error => { console.error('数据获取失败', error) next(false) // 停止路由跳转 }) }) new Vue({ router, beforeDestroy() { unregisterHook() // 注销钩子函数 }, render: h => h(App) }).$mount('#app')next();
快看别错过这个好机会无论你从哪儿来,想去哪里,都要这样做。
// 在路由跳转完成后调用
用了这个导航守卫,就可以在不同阶段搞定数据和翻页!
十、处理路由参数和查询参数
你知道吗?我们可以用代码让网页在跳转时带入路由参数和查询参数!每次点之前都能通过代码获取并改变这些参数,超好玩的!
const { params, query } = to;
// 处理参数
咱都知道,想去其他网站,首先要搞定to对象里面的params和query
看完这段话,还有那几个代码,你有没有觉得用VueRouter处理网页上的数据简直小菜一碟?前后两个页面之间,就在beforeEach钩子里搞定数据采集和处理,然后扔给Vue实例或者Vuex。不过千万记得,如果Vue实例没了,要注销这个钩子,否则可能会影响其他页面的跳转。这样一来,我们就可以随心所欲地控制页面跳转,还能做好数据预处理。
看原文!希望能帮到你用 VueRouter 做单页应用。有没有遇到需要先处理数据加载的困扰?来说说怎么解决,一起在评论区分享小技巧哟~
原文链接:https://www.icz.com/technicalinformation/web/2024/07/18979.html,转载请注明出处~~~
评论0