在NUXT应用程序中创建动态路由
本文将通过一个部署在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>{{ product.name }}</h1> <h4>{{ 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中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

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

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

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Themaindifferencesbetweendisplay:inline,block,andinline-blockinHTML/CSSarelayoutbehavior,spaceusage,andstylingcontrol.1.Inlineelementsflowwithtext,don’tstartonnewlines,ignorewidth/height,andonlyapplyhorizontalpadding/margins—idealforinlinetextstyling

设置访问过链接的样式能提升用户体验,尤其在内容密集型网站中帮助用户更好导航。1.使用CSS的:visited伪类可定义已访问链接样式,如颜色变化;2.注意浏览器出于隐私限制仅允许修改部分属性;3.颜色选择应与整体风格协调,避免突兀;4.移动端可能不显示该效果,建议结合其他视觉提示如icon辅助标识。

使用CSS的clip-path属性可以裁剪元素为自定义形状,如三角形、圆形缺口、多边形等,无需依赖图片或SVG。其优势包括:1.支持circle、ellipse、polygon等多种基本形状;2.可响应式调整,适配移动端;3.易于动画化,可结合hover或JavaScript实现动态效果;4.不影响布局流,仅裁剪显示区域。常见用法如圆形裁剪clip-path:circle(50pxatcenter)和三角形裁剪clip-path:polygon(50%0%,1000%,00%)。注意

要使用CSS创建响应式图片,主要可通过以下方法实现:1.使用max-width:100%和height:auto让图片在保持比例的同时自适应容器宽度;2.结合HTML的srcset和sizes属性智能加载适配不同屏幕的图片源;3.利用object-fit和object-position控制图片裁剪与焦点展示。这些方法共同确保图片在不同设备上清晰、美观地呈现。

不同浏览器对CSS解析存在差异,导致显示效果不一致,主要包括默认样式差异、盒模型计算方式、Flexbox和Grid布局支持程度及某些CSS属性行为不一致。1.默认样式处理不一致,解决方法是使用CSSReset或Normalize.css统一初始样式;2.旧版IE的盒模型计算方式不同,建议统一使用box-sizing:border-box;3.Flexbox和Grid在边缘情况或旧版本中表现有差异,应多测试并使用Autoprefixer;4.某些CSS属性行为不一致,需查阅CanIuse并提供降级

opacity是CSS中用于控制元素整体透明度的属性,取值范围为0(完全透明)到1(完全不透明)。1.常用于图片hover淡出效果,通过设置opacity过渡增强交互体验;2.制作背景遮罩层提升文字可读性;3.控制按钮或图标在禁用状态下的视觉反馈。需注意它会影响所有子元素,且与rgba不同,后者仅影响指定颜色部分。搭配transition可实现平滑动画,但频繁使用可能影响性能,建议结合will-change或transform使用。合理应用opacity能增强页面层次感和交互性,但应避免干扰用户

accent-color是CSS中用于自定义复选框、单选按钮和滑块等表单元素高亮颜色的属性;1.它直接改变表单控件选中状态的默认颜色,如将复选框的蓝色勾选标记改为红色;2.支持的元素包括type="checkbox"、type="radio"和type="range"的输入框;3.使用accent-color可避免复杂的自定义样式和额外DOM结构,保持原生可访问性;4.现代浏览器普遍支持,旧浏览器需降级处理;5.设置accent-col

The:has()pseudo-classinCSSallowstargetingaparentelementbasedonitschildelements.Itworksbyusingthesyntaxparent:has(child-selector)toapplystylesconditionally.Forexample,div:has(img)appliesstylestoadivcontaininganimage.Multipleselectorscanbeusedwithcomma
