javascript 如何在Nuxt2和3中获取页面中的路径url参数?

wfypjpf4  于 2022-12-21  发布在  Java
关注(0)|答案(9)|浏览(1001)

我使用的是Nuxt.js,并且有一个动态页面,定义如下

pages/post/_slug.vue

那么,当我访问页面url时,比如http://localhost:3000/post/hello-world,我如何读取页面中的slug参数值呢?
目前,我正在使用asyncData获取它,如下所示:

asyncData ({ params }) {
    // called every time before loading the component
    return {
      slug: params.slug
    }
  }

这是工作正常,但我认为这不是最好的方法,应该有一个更好的方法,使参数可用于页面。任何帮助都是感谢!

mfuanj7w

mfuanj7w1#

注:此答案适用于Vue2和Nuxt2。如果您正在查找Nuxt3或Vue3的答案,请参阅其他答案。
在.vue文件中,要获取Vue路由器路由对象:

this.$route

(注意Vue路由器位于this.$router对象下)
$route对象具有一些有用的属性:

{
  fullpath: string,
  params: {
    [params_name]: string
  },
  //fullpath without query
  path: string
  //all the things after ? in url
  query: {
    [query_name]: string
  }
}

可以按如下方式使用$route对象:

<script>
    export default {
      mounted() {
        console.log(this.$route.fullPath);
      }
    };
    </script>

url路径参数在route.params下,如您的route.params.slug

<script>
    export default {
      mounted() {
        console.log(this.$route.params.slug);
      }
    };
    </script>

Vue挂接钩子只在客户端运行,当你想获取服务器端的参数时,可以使用asyncData方法:

<script>
    export default {
        asyncData({route, params}) {
            if (process.server) {
                //use route object
                console.log(route.params.slug)
                //directly use params
                console.log(params.slug)
            }
        }
    };
    </script>

但是,请注意:
它将在服务器端调用一次(在第一次向Nuxt应用发出请求时),并在导航到其他路线时调用客户端。ref
如果你不需要服务器上的参数信息,比如你不需要根据服务器端的参数获取数据,我认为挂载的钩子就足够了。

iezvtpos

iezvtpos2#

要从URL读取参数,您应该在Nuxt中使用以下方法:
第一个月
例如
网址:https://example.com/example/?token=QWERTYUASDFGH
通过这行代码,您可以读取token
this.$route.query.token
给予QWERTYUASDFGH

iq0todco

iq0todco3#

只需访问路由参数
供全球使用,但不是良好做法:
窗口.$nuxt._路由.参数
对于页面/组件/布局等下的本地使用,我们应该始终按照以下方式进行练习
此.$路由

此.$nuxt._路由.参数

iklwldmw

iklwldmw4#

如果您在存储上下文中(例如actions.js),则可以像这样访问查询参数:

this.$router.currentRoute.query['param_name']
esbemjvw

esbemjvw5#

如果您想在apollo智能查询中访问路由信息,其他答案基本上就足够了:

apollo: {
    items: {
      query: jobsBy,
      variables() {
        return {
          clientId: this.$route.query.id
        }
      },
    }
  }
ngynwnxp

ngynwnxp6#

随着Nuxt3稳定版本的发布,我想使用组合API更新答案。
这就是在任何.vue文件中访问当前路径的所有感兴趣部分的方法

<script setup>
const route = useRoute()
</script>

<template>
  <pre>{{ route }}</pre>
</template>

route在转到http://localhost:5678/about?fruit=watermelon时获取以下内容

{
  "path": "/about",
  "name": "about",
  "params": {},
  "query": {
    "fruit": "watermelon"
  },
  "hash": "",
  "fullPath": "/about?fruit=watermelon",
  "matched": [
    {
      "path": "/about",
      "name": "about",
      "meta": {},
      "props": {
        "default": false
      },
      "children": [],
      "instances": {},
      "leaveGuards": {
        "Set(0)": []
      },
      "updateGuards": {
        "Set(0)": []
      },
      "enterCallbacks": {},
      "components": {
        "default": {
          "__hmrId": "0a606064",
          "__file": "/home/kissu/code/test/n3-default/pages/about.vue"
        }
      }
    }
  ],
  "meta": {}
}

如果使用Vue devtools,还可以单击组件并通过控制台查找示例(如果希望快速检查对象,这很有用),它比Routes选项卡提供了更多的细节。

更多信息请访问:https://v3.nuxtjs.org/api/composables/use-route#useroute
使用Options API时,它将如下所示(如在控制台中)

<script>
export default {
  mounted () {
    console.log('route object', this.$.appContext.app.$nuxt._route.query)
  },
}
</script>

附言:也许有一个更短的方法,我还不知道。
PS2:我总是在query params"route params"之间混淆,因此this memento的区别可能是有用的。

zynd9foi

zynd9foi7#

据我所知,这已经是最好的方法,如果不是唯一的方法的话。但我可以建议一个稍微不同的方法,也许适合您的需要。使用asyncData方法从服务器检索数据,而不是把一个参数放在您的虚拟机和处理后,如果是你的情况。然后,您可以在表示逻辑上处理结果数据,而不是任何类型的 * 请求 *。另一方面,如果您不想向VM传递任何内容,也可以使用fetch,或者根据需要使用中间件

6ovsh4lw

6ovsh4lw8#

对我来说最好的办法是:

async asyncData(context){
      const query_params=context.route.query;
}
ssgvzors

ssgvzors9#

正在声明动态路由

在nuxt2中,下划线_用于动态路由,在nuxt3中,动态路由现在使用方括号[]代替下划线_

访问参数

在nuxt2中,可以在$route对象上访问路由参数
例如this.$route.params
在nuxt3中,参数可以从useRoute组合
例如const { params } = useRoute()

相关问题