目录
创建页面
通知Nuxt配置
填充页面
{{ product.name }}
{{ product.price | dollar }}
首页 web前端 css教程 在NUXT应用程序中创建动态路由

在NUXT应用程序中创建动态路由

Apr 18, 2025 am 10:53 AM

Creating Dynamic Routes in a Nuxt Application

本文将通过一个部署在Netlify上的电商示例,演示如何在Nuxt应用中创建动态路由。这是一个常见的场景:您从API获取数据,而这些数据可能未知、数量庞大或随时变化。幸运的是,Nuxt使创建动态路由的过程非常流畅。

让我们开始吧!

演示站点 GitHub仓库

创建页面

本例中,我使用mockaroo创建了一些虚拟商店数据,并将其存储在静态文件夹中。通常,您会使用fetch或axios以及Vuex store中的action来收集这些数据。无论哪种方式,我们都将数据与Vuex一起存储在store/index.js中,其中包含UI状态和一个空的购物车数组。

import data from '~/static/storedata.json'

export const state = () => ({
  cartUIStatus: 'idle',
  storedata: data,
  cart: []
})
登录后复制

需要注意的是,在Nuxt中,我们只需在pages目录中创建一个.vue文件即可设置路由。因此,我们有一个index.vue页面作为主页,一个cart.vue页面作为购物车,等等。Nuxt会自动为我们生成这些页面的所有路由。

为了创建动态路由,我们将创建一个目录来存放这些页面。在本例中,我创建了一个名为/products的目录,因为路由将指向每个产品的详细信息视图。

在这个目录中,我将创建一个带有下划线的页面,以及我想要用于创建路由的每个页面的唯一标识符。如果查看购物车中的数据,它看起来像这样:

[
  {
    "id": "9d436e98-1dc9-4f21-9587-76d4c0255e33",
    "color": "Goldenrod",
    "description": "Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.",
    "gender": "Male",
    "name": "Desi Ada",
    "review": "productize virtual markets",
    "starrating": 3,
    "price": 50.40,
    "img": "1.jpg"
  },
  …
]
登录后复制

您可以看到每个条目的ID都是唯一的,因此这是一个很好的候选标识符,我们将页面命名为:

_id.vue

现在,我们可以使用路由参数在数据中存储特定页面的ID:

data() {
  return {
    id: this.$route.params.id,
  }
},
登录后复制

对于上面的条目,如果我们在devtools中查看数据,它将是:

id: "9d436e98-1dc9-4f21-9587-76d4c0255e33"
登录后复制

我们现在可以使用它从存储中检索此条目的所有其他信息。我将使用mapState

import { mapState } from "vuex";

computed: {
  ...mapState(["storedata"]),
  product() {
    return this.storedata.find(el => el.id === this.id);
  }
},
登录后复制

我们正在过滤storedata以查找具有唯一ID的条目!

通知Nuxt配置

如果我们使用yarn build构建应用程序,我们就完成了,但是我们使用Nuxt创建一个静态站点进行部署,在本例中是在Netlify上。当我们使用Nuxt创建静态站点时,我们将使用yarn generate命令。我们必须使用nuxt.config.js中的generate命令来让Nuxt知道动态文件。

此命令将期望一个函数,该函数将返回一个解析为如下所示数组的Promise:

export default {
  generate: {
    routes: [
      '/product/1',
      '/product/2',
      '/product/3'
    ]
  }
}
登录后复制

为此,我们将在文件顶部从静态目录引入数据,并创建函数:

import data from './static/storedata.json'
let dynamicRoutes = () => {
  return new Promise(resolve => {
    resolve(data.map(el => `product/${el.id}`))
  })
}
登录后复制

然后,我们将在配置中调用该函数:

generate: {
  routes: dynamicRoutes
},
登录后复制

如果您使用axios从API收集数据(这更常见),它看起来更像这样:

import axios from 'axios'
let dynamicRoutes = () => {
  return axios.get('https://your-api-here/products').then(res => {
    return res.data.map(product => `/product/${product.id}`)
  })
}
登录后复制

就这样,我们完成了动态路由的设置!如果关闭并重新启动服务器,您将看到每个产品的动态路由生效!

对于本文的最后部分,我们将继续介绍页面的其余部分是如何创建的,以及我们如何将项目添加到购物车,因为这可能是您也想学习的内容。

填充页面

现在,我们可以使用任何我们想要的格式来填充页面,因为我们可以通过product计算属性访问所有信息:

<main><img src="/static/imghw/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Creating Dynamic Routes in a Nuxt Application "><h1 id="product-name">{{ product.name }}</h1>
  <h4 id="product-price-dollar">{{ product.price | dollar }}</h4>
  <p>{{ product.description }}</p>

 ...
</main>
登录后复制

在本例中,我们还希望将项目添加到存储中的购物车中。我们将添加添加和删除项目的功能(同时不允许减少数量低于零)

<p>
  <button> 0 ? quantity-- : quantity = 0">-</button>
  {{ quantity }}
  <button> </button>
</p>
...
<button>Add to Cart</button>
登录后复制

在该组件的方法中,我们将项目加上一个新字段(数量)添加到一个数组中,我们将该数组作为有效负载传递给存储中的mutation。

methods: {
  cartAdd() {
    let item = this.product;
    item.quantity = this.quantity;
    this.tempcart.push(item);
    this.$store.commit("addToCart", item);
  }
}
登录后复制

在Vuex存储中,我们将检查项目是否已存在。如果存在,我们将只增加数量。如果不存在,我们将添加包含数量的整个项目到购物车数组。

addToCart: (state, payload) => {
  let itemfound = false
  state.cart.forEach(el => {
    if (el.id === payload.id) {
      el.quantity  = payload.quantity
      itemfound = true
    }
  })
  if (!itemfound) state.cart.push(payload)
}
登录后复制

我们现在可以使用存储中的getter来计算总计,这最终将传递给我们的Stripe无服务器函数(关于此的另一篇文章即将推出!)。我们将为此使用reduce,因为reduce非常擅长从许多值中检索一个值。(我在这里写了更多关于reduce如何工作的细节)。

cartTotal: state => {
  if (!state.cart.length) return 0
  return state.cart.reduce((ac, next) => ac   next.quantity * next.price, 0)
}
登录后复制

演示站点 GitHub仓库

就是这样!我们已经设置了各个产品页面,Nuxt会在构建时为我们生成所有各个路由。您一定会想自己尝试一下Nuxt。?

以上是在NUXT应用程序中创建动态路由的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1663
14
CakePHP 教程
1420
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
Google字体可变字体 Google字体可变字体 Apr 09, 2025 am 10:42 AM

我看到Google字体推出了新设计(Tweet)。与上一次大型重新设计相比,这感觉更加迭代。我几乎无法分辨出区别

如何使用HTML,CSS和JavaScript创建动画倒计时计时器 如何使用HTML,CSS和JavaScript创建动画倒计时计时器 Apr 11, 2025 am 11:29 AM

您是否曾经在项目上需要一个倒计时计时器?对于这样的东西,可以自然访问插件,但实际上更多

HTML数据属性指南 HTML数据属性指南 Apr 11, 2025 am 11:50 AM

您想了解的有关HTML,CSS和JavaScript中数据属性的所有信息。

使Sass更快的概念证明 使Sass更快的概念证明 Apr 16, 2025 am 10:38 AM

在一个新项目开始时,Sass汇编发生在眼睛的眨眼中。感觉很棒,尤其是当它与browsersync配对时,它重新加载

我们如何创建一个在SVG中生成格子呢模式的静态站点 我们如何创建一个在SVG中生成格子呢模式的静态站点 Apr 09, 2025 am 11:29 AM

格子呢是一块图案布,通常与苏格兰有关,尤其是他们时尚的苏格兰语。在Tar​​tanify.com上,我们收集了5,000多个格子呢

如何在WordPress主题中构建VUE组件 如何在WordPress主题中构建VUE组件 Apr 11, 2025 am 11:03 AM

内联式模板指令使我们能够将丰富的VUE组件构建为对现有WordPress标记的逐步增强。

php是A-OK用于模板 php是A-OK用于模板 Apr 11, 2025 am 11:04 AM

PHP模板通常会因促进Subpar代码而变得不良说唱,但这并不是这样的情况。让我们看一下PHP项目如何执行基本的

静态表单提供商的比较 静态表单提供商的比较 Apr 16, 2025 am 11:20 AM

让我们尝试在这里造成一个术语:“静态表单提供商”。你带上html

See all articles