最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在nuxt中使用路由重定向的實(shí)例

 更新時(shí)間:2020年11月06日 11:27:31   作者:元無(wú)心  
這篇文章主要介紹了在nuxt中使用路由重定向的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

我們都知道,在寫(xiě)SPA的時(shí)候,我們可以通過(guò)配置vue-router來(lái)實(shí)現(xiàn)路由的重定向。

官方文檔(以及ts類型)的定義中給出了這一選項(xiàng):

interface RouteConfig = {
 path: string,
 redirect?: string | Location | Function,
}

也就是說(shuō),我們可以定義這樣一個(gè)路由:

{
  path: "/foo",
  redirect: "/foo/bar",
}

這樣,我們?cè)谠L問(wèn)/foo的時(shí)候,就會(huì)被重定向到/foo/bar。這些都是老生常談了。

然而,到了SSR的環(huán)境下,如果使用nuxt,因?yàn)閚uxt采用了約定大于配置的方式,pages目錄代替了路由,雖然簡(jiǎn)化了配置,但是給一些需要定制化的場(chǎng)景的手動(dòng)配置帶來(lái)了一些麻煩,并且nuxt官方也不建議手動(dòng)配置router,如果實(shí)在需要配置,可以在nuxt.config.js里進(jìn)行一些中間件配置,但是這個(gè)對(duì)于重定向這種特別簡(jiǎn)單的事情來(lái)說(shuō),未免有殺雞用牛刀之嫌。

所以,我一開(kāi)始想的辦法是,在pages目錄下,需要重定向的路由組件里,增加一個(gè)beforeCreate()鉤子:

<template>
 <div></div>
</template>

<script>
export default {
 beforeCreate() {
  this.$router.replace('/path/to')
 }
}
</script>

相當(dāng)于在組件創(chuàng)建之前進(jìn)行一個(gè)路由的替換,這個(gè)組件作為路由的占位。之所以不用push而是用replace,因?yàn)閞eplace更接近重定向的效果,我們總不希望用戶還能回退(比如瀏覽器的后退鍵)到重定向之前的頁(yè)面里去吧。

但是這個(gè)方案有一個(gè)問(wèn)題,就是在路由“重定向”的過(guò)程中,界面會(huì)發(fā)生輕微的閃爍,這樣體驗(yàn)就很不好了。所以,肯定需要其他的解決方案。

至于為什么會(huì)閃屏,因?yàn)殡m然beforeCreate鉤子理論上會(huì)先于模板編譯執(zhí)行,但是這是在SFC環(huán)境下,模板編譯會(huì)提前執(zhí)行;如果是用script標(biāo)簽引入的Vue就不會(huì)有這個(gè)問(wèn)題:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <script src="https://unpkg.com/vue@2.6.11/dist/vue.js"></script>
  <script src="https://unpkg.com/vue-router@3.1.6/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
  <router-view/>
</div>

<script>
  const Foo = {template: '<div>foo</div>'};
  const Bar = {template: '<div>bar</div>'};

  const routes = [
    {path: '/foo', component: Foo, redirect: '/bar'},
    {path: '/bar', component: Bar}
  ];

  const router = new VueRouter({routes});

  const app = new Vue({
    el: '#app',
    router
  })
</script>
</body>
</html>

如果有需要,可以進(jìn)一步參考Vue官方的生命周期圖示。

查了一下文檔,好在nuxt提供了這么一個(gè)重定向的API,就藏在context對(duì)象里。事實(shí)上,下面所有的解決方案,都是基于這個(gè)context對(duì)象進(jìn)行的:

屬性字段 類型 可用 描述
redirect Function 客戶端 & 服務(wù)端 用這個(gè)方法重定向用戶請(qǐng)求到另一個(gè)路由。狀態(tài)碼在服務(wù)端被使用,默認(rèn) 302 redirect([status,] path [, query])

同時(shí),我們還知道:

asyncData方法會(huì)在組件(限于頁(yè)面組件)每次加載之前被調(diào)用。它可以在服務(wù)端或路由更新之前被調(diào)用。在這個(gè)方法被調(diào)用的時(shí)候,第一個(gè)參數(shù)被設(shè)定為當(dāng)前頁(yè)面的上下文對(duì)象,你可以利用 asyncData方法來(lái)獲取數(shù)據(jù)并返回給當(dāng)前組件。

所以,我們可以這么寫(xiě):

<template>
 <div></div>
</template>

<script>
export default {
 asyncData({ redirect }) {
  redirect('/path/to')
 }
}
</script>

這樣就可以解決問(wèn)題了??赡苣銜?huì)想為什么不用fetch來(lái)進(jìn)行路由跳轉(zhuǎn),因?yàn)閒etch是用來(lái)處理vuex store的數(shù)據(jù)的,我個(gè)人認(rèn)為從語(yǔ)義上不適合處理路由跳轉(zhuǎn)的任務(wù);當(dāng)然,實(shí)際上是可以正常運(yùn)行的,反正都是基于context對(duì)象進(jìn)行的操作。

如果你對(duì)上面那個(gè)空的div感到不滿意,覺(jué)得不優(yōu)雅,你也可以搞得更極端一點(diǎn),使用渲染函數(shù)來(lái)渲染模板的根節(jié)點(diǎn):

<script>
export default {
 asyncData({ redirect }) {
  redirect('/path/to')
 },
 render(h) {
  return h('div')
 }
}
</script>

這樣看起來(lái)可能更簡(jiǎn)潔一點(diǎn)。

但是這種寫(xiě)法對(duì)于路由鑒權(quán)那種場(chǎng)景是不太適用的。比如,我需要在進(jìn)行路由跳轉(zhuǎn)前驗(yàn)證用戶的身份,我總不能在每個(gè)page里都寫(xiě)這么一段吧,維護(hù)起來(lái)也不方便,如果路由改了,每個(gè)頁(yè)面都得改。

所以,這個(gè)時(shí)候就得用到nuxt提供的中間件機(jī)制了。中間件可以在page層面配置,也可以全局配置,參考官方的例子:

pages/secret.vue

<template>
 <h1>Secret page</h1>
</template>

<script>
export default {
 middleware: 'authenticated'
}
</script>

middleware/authenticated.js

export default function ({ store, redirect }) {
 // If the user is not authenticated
 if (!store.state.authenticated) {
  return redirect('/login')
 }
}

這個(gè)也放到nuxt.config.js里,變成全局的配置:

module.exports = {
 router: {
  middleware: 'authenticated'
 }
}

但是有一點(diǎn)需要注意,也是只要使用路由就需要注意的一個(gè)問(wèn)題:避免循環(huán)重定向。這和避免寫(xiě)死循環(huán)是一個(gè)道理。

總結(jié)一下:

如果是少數(shù)幾個(gè)頁(yè)面之間的固定的重定向邏輯,可以直接用asyncData(或者fetch,雖然我個(gè)人覺(jué)得語(yǔ)義不好)參數(shù)里context的redirect來(lái)進(jìn)行重定向;

如果需要重定向的頁(yè)面數(shù)量較多(可以考慮使用中間件 + 表驅(qū)動(dòng)),或者存在一些動(dòng)態(tài)變化的重定向邏輯(比如路由鑒權(quán)),可以考慮使用中間件機(jī)制。

補(bǔ)充知識(shí):使用Nuxt.js和Vue-i18n重定向到同一頁(yè)面但切換語(yǔ)言URL

公司最近提出一個(gè)需求,就是當(dāng)用戶切換語(yǔ)言的時(shí)候,在路由中需要將其選中的語(yǔ)言加入到路由中

例如網(wǎng)址:

localhost/about

應(yīng)該通過(guò)該方法(通過(guò)按特定按鈕)重定向到:

localhost/bg/about

Nuxt文檔中所建議的,用于使用Vue-i18n進(jìn)行本地化https://nuxtjs.org/examples/i18n/

在 Nuxt 官網(wǎng)中也給出了國(guó)際化的例子,但是并不滿足公司的這個(gè)需求,大家有興趣可以去看下

Nuxt 官網(wǎng) 國(guó)際化的例子

在 components文件夾下面新建 LangSelect.vue文件

<template>
 <el-dropdown trigger="click" class="international" @command="handleSetLanguage">
  <div>
   <i class="el-icon-share">{{$t('home.changelang')}}</i>
  </div>
  <el-dropdown-menu slot="dropdown">
   <el-dropdown-item :disabled="language==='zh'" command="zh">中文</el-dropdown-item>
   <el-dropdown-item :disabled="language==='en'" command="en">English</el-dropdown-item>
  </el-dropdown-menu>
 </el-dropdown>
</template>

<script>
export default {
 computed: {
  language() {
   return this.$store.state.locale;
  }
 },
 methods: {
  handleSetLanguage(language) {
   this.$i18n.locale = language;
   console.log(this.$i18n.locale);
   this.$store.commit("SET_LANG", language);
  //  console.log(this.$store.state.locale, "locale");
   var beforePath = this.$nuxt.$router.history.current.path;
   // -- Removing the previous locale from the url
   var changePath = this.$store.state.locale
   var result = "";
   result = beforePath.replace("/en", "");
   result = result.replace("/zh", "");
  this.$nuxt.$router.replace({ path: "/" + changePath + result });
   this.$message({
    message: "Switch Language Success",
    type: "success"
   });
  }
 }

};
</script>

在middleware文件中新建i18n.js

export default function ({ isHMR, app, store, route, params, error, redirect }) {
  const defaultLocale = app.i18n.fallbackLocale
  // If middleware is called from hot module replacement, ignore it
  //如果從熱模塊替換調(diào)用中間件,請(qǐng)忽略它
  if (isHMR) { return }
  // Get locale from params
  const locale = params.lang || defaultLocale
  if (!store.state.locales.includes(locale)) {
   return error({ message: 'This page could not be found.', statusCode: 404 })
  }
  // Set locale
  store.commit('SET_LANG', locale)
  app.i18n.locale = store.state.locale

  if(route.fullPath == '/') {
   return redirect('/' + defaultLocale + '' + route.fullPath)
  }
 }

其他的配置都可以在 上面給出的官網(wǎng)鏈接中找到,這里就不在重復(fù)了。

以上這篇在nuxt中使用路由重定向的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何使用vue slot創(chuàng)建一個(gè)模態(tài)框的實(shí)例代碼

    如何使用vue slot創(chuàng)建一個(gè)模態(tài)框的實(shí)例代碼

    這篇文章主要介紹了如何使用vue slot創(chuàng)建一個(gè)模態(tài)框,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • vue-loader教程介紹

    vue-loader教程介紹

    本篇文章主要介紹了vue-loader教程介紹,vue-loader就是告訴webpack如何將vue格式的文件轉(zhuǎn)換成js。有興趣的可以了解一下
    2017-06-06
  • Vue應(yīng)用部署到服務(wù)器的正確方式

    Vue應(yīng)用部署到服務(wù)器的正確方式

    本篇文章主要介紹了詳解Vue應(yīng)用部署到服務(wù)器的正確方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-07-07
  • 全面詳解vue種數(shù)組去重的12種方法示例

    全面詳解vue種數(shù)組去重的12種方法示例

    這篇文章主要介紹了vue數(shù)組去重的12種方法示例全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • vue彈窗消息組件的使用方法

    vue彈窗消息組件的使用方法

    這篇文章主要為大家詳細(xì)介紹了vue彈窗消息組件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 詳解vue-cli項(xiàng)目中用json-sever搭建mock服務(wù)器

    詳解vue-cli項(xiàng)目中用json-sever搭建mock服務(wù)器

    這篇文章主要介紹了詳解vue-cli項(xiàng)目中用json-sever搭建mock服務(wù)器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • vue中element 的upload組件發(fā)送請(qǐng)求給后端操作

    vue中element 的upload組件發(fā)送請(qǐng)求給后端操作

    這篇文章主要介紹了vue中element 的upload組件發(fā)送請(qǐng)求給后端操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 一篇文章總結(jié)Vue3.2語(yǔ)法糖使用

    一篇文章總結(jié)Vue3.2語(yǔ)法糖使用

    Vue3.2(21年8月10日)相比于Vue3新增了語(yǔ)法糖,減少了代碼冗余,下面這篇文章主要給大家介紹了關(guān)于Vue3.2語(yǔ)法糖使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • vue中如何實(shí)現(xiàn)后臺(tái)管理系統(tǒng)的權(quán)限控制的方法示例

    vue中如何實(shí)現(xiàn)后臺(tái)管理系統(tǒng)的權(quán)限控制的方法示例

    這篇文章主要介紹了vue中如何實(shí)現(xiàn)后臺(tái)管理系統(tǒng)的權(quán)限控制的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Vue3開(kāi)發(fā)必備的六個(gè)VSCode插件推薦

    Vue3開(kāi)發(fā)必備的六個(gè)VSCode插件推薦

    在VSCode中添加好用的插件可以提高我們的開(kāi)發(fā)效率,這些可以幫助我們格式化,擴(kuò)充性,執(zhí)行最佳實(shí)踐的代碼方式,自動(dòng)完成一些瑣碎的事情,下面這篇文章主要給大家推薦介紹了關(guān)于Vue3開(kāi)發(fā)必備的六個(gè)VSCode插件,需要的朋友可以參考下
    2022-12-12

最新評(píng)論

临漳县| 日照市| 阿城市| 离岛区| 沙坪坝区| 长葛市| 利川市| 敦化市| 报价| 古田县| 旬阳县| 溧水县| 渝中区| 饶河县| 衢州市| 罗源县| 安塞县| 麻阳| 克东县| 西华县| 乐山市| 湟源县| 七台河市| 北海市| 新兴县| 海林市| 双城市| 吉安市| 小金县| 博客| 琼结县| 古丈县| 梁山县| 海城市| 卓资县| 河西区| 彰化县| 准格尔旗| 彭水| 图木舒克市| 民丰县|