如果您过去或曾经在电子商务应用程序中工作过,您可能会遇到必须处理产品显示页面的情况。这是用户决定是否将产品添加到购物车之前看到的页面。与任何其他页面一样,此页面必须快速加载,并且还必须显示有关产品的重要信息,例如描述、图片和可用选项。
可用选项是产品的不同可用变体。例如,男士衬衫通常有不同尺码,但有时商店可能会缺货。对于这种情况,禁用该选择是有益的,以便用户提前知道此变体不适用于该给定产品。
解决此问题的两种方法之一是使用当前选择对后端进行 api 调用,以根据这些选择确定哪些选项可用。例如,如果我选择绿色,我应该只会看到该特定颜色可用的尺寸。如果中号尺寸不提供绿色,则只要之前选择了绿色,则应禁用选择中号的选项。使用第一种方法,将查询数据库以确定基于当前选择的选项哪些是剩余的可用选项。这将在数据库中查询 ProductSkus、ProductSkuOptions 和 ConfigurableOptions,并对这些表进行 10 个不同的查询。这将对每个用户的选择进行。
第二种方式是后端以 SKU 的形式返回可用变体的列表('ZARA-001-RED-S'、'ZARA-001-BLUE-S'、'ZARA-001-GREEN- S'、'ZARA-001-RED-M'、'ZARA-001-BLUE-M')。此 SKU 列表可以是产品详细信息 api 调用的一部分,它将添加一个数据库查询,即 ProductSkus.where(product_id:)。此查询 (ruby on Rails) 返回与产品相关的 sku 列表。
第一种方法需要在选择之间具有加载状态,这是可行的,但对于现代 Web 开发标准来说并不理想。第二种方法速度更快,几乎可以立即执行,不需要加载状态。第一种方法将繁重的工作委托给后端,而第二种方法则在前端完成所有繁重的工作,但是前端执行速度会快得多,因为不需要数据库通信。
这篇文章我将重点关注第二种方法。
const updateUIBasedOnSelection = () => { const newAvailableOptions = filterAvailableOptions( selectedOptions, Object.keys(availableOptions), product.available_skus ) // Go through each selection and see what is available according to the other selections Object.keys(availableOptions).forEach(type => { const selectedOptionsCopy = { ...selectedOptions } delete selectedOptionsCopy[type] // remove the current selection so we can see what is available according to the other selections const newAvailableOptionsWithSelf = filterAvailableOptions( selectedOptionsCopy, Object.keys(availableOptions), product.available_skus ) newAvailableOptions[type] = new Set([...newAvailableOptions[type], ...newAvailableOptionsWithSelf[type]]) return newAvailableOptionsWithSelf }) setAvailableOptions(newAvailableOptions) }
此代码在监视 selectedOptions 更改的钩子上运行。此代码与 filterAvailableOptions 函数一起确定将禁用哪些选项。这里使用的数据结构是以变体名称为键的对象(例如“颜色”和“大小”)和 javascript 集(Set),类似于数组,但值是唯一的,值在 Set 中不能重复。
可用选项由所有可用的 sku 构造而成,并使用以下值进行初始化:
{ 'color': new Set('RED', 'BLUE', 'GREEN'), 'size': new Set('S', 'M') }
另一种更可行的方法是也使用变体 id 作为键而不是变体类型。
{ 1: new Set('RED', 'BLUE', 'GREEN'), 2: new Set('S', 'M') }
这样,代码就不会受到可能显示相同类型的变体的限制。例如,也许可以有两种颜色选择。
存货
除了现有的 sku 之外,您可能还想对用户可以选择的所有可能选项进行库存检查,这样用户可以一眼看出某个选项是否可用。为此,您可以找到迄今为止与当前选择匹配的所有 sku。
如果用户已经选择了红色,则查找所有包含红色的 sku,并对所有与红色匹配的 sku 进行库存检查。这样您就可以判断下一个可能的选择选项是否可用。
但是,用户可能想要改变她/他的想法,而不是决定红色然后尺寸为 xs s/他可以选择红色,改变她/他的想法并更改为绿色。您的算法应该足够灵活,以便始终获取 sku。有时,当用户做出选择时,需要获取所有可用选项。例如,每当用户做出选择时,沃尔玛都会检查库存。
另一件事要记住是后端部分。有时即将到来的选择可能多达数百个。您的后端应该足够快速和准确,以处理如此数量的可能选择。一次快速的 GPT 聊天揭示了许多快速、准确的方法,其中许多方法包括使用事件驱动代码,在交易发生时更新库存。这很敏感,因为如果做得不正确,可能会不同步,请记住互斥并避免两个客户可能同时购买该商品的竞争条件。如果必须选择的话,我会选择 Kafka 的组合来处理事件,Redis 来缓存库存值。
就我个人而言,我不必选择其中任何一个,只需优化后端查询以确保它每 2 秒运行 20 个 sku。当用户做出选择时,我会缩小 sku 的范围,因此用户做出的选择越多,我需要检查库存的 sku 就越少,并且 api 调用的速度也越快。
无论如何,我仍然需要弄清楚是否应该获取所有 sku 匹配项或剩余等待选择的 sku。所有匹配的 sku 是与当前选择匹配的所有 sku,剩余的 sku 是用户未选择的 sku。
在电子商务中,提供高性能的代码非常重要,因为有些人依靠该服务从购买体验(有时从他们购买的商品)中获得情感安慰。使用写得不好的应用程序可能会导致情感需求得不到满足,从而毁掉某人的一天,进而导致决策能力不佳。
sku 检查只能在产品显示页面加载开始时进行,但库存检查可以在用户做出选择时进行。因此,本质上只需一次获取 sku,并多次获取库存检查。
结论
很可能有多种方法可以实现此结果。这种方式几乎是瞬时的。同一产品只有这么多不同的变体,因此不需要进一步优化。我保留了部分代码,以免给我目前工作的公司带来麻烦,但我很乐意讨论您的预期方法。
长话短说,获取所有 sku(应该随着用户选择的变化而变化),并通过查看不同的 sku 选项来构建可用的选项选择元素。
以上是根据可用产品 SKU 确定可用选择的详细内容。更多信息请关注PHP中文网其他相关文章!

C 和JavaScript通过WebAssembly实现互操作性。1)C 代码编译成WebAssembly模块,引入到JavaScript环境中,增强计算能力。2)在游戏开发中,C 处理物理引擎和图形渲染,JavaScript负责游戏逻辑和用户界面。

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

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

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Atom编辑器mac版下载
最流行的的开源编辑器

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。