当前位置:首页 > React

react结合antd实现sku

2026-01-27 12:22:23React

实现 React 与 Ant Design 结合的 SKU 功能

数据结构设计

SKU(Stock Keeping Unit)需要明确商品属性和组合关系。通常采用以下结构:

  • attributes: 商品属性(如颜色、尺寸)
  • skus: 具体 SKU 组合(如红色+XL)

示例数据结构:

const data = {
  attributes: [
    { name: '颜色', values: ['红色', '蓝色'] },
    { name: '尺寸', values: ['S', 'XL'] }
  ],
  skus: [
    { id: 1, attributes: { 颜色: '红色', 尺寸: 'S' }, stock: 10, price: 99 },
    { id: 2, attributes: { 颜色: '蓝色', 尺寸: 'XL' }, stock: 5, price: 129 }
  ]
}

属性选择器实现

使用 Ant Design 的 RadioSelect 组件构建属性选择器:

react结合antd实现sku

import { Radio, Card } from 'antd';

function AttributeSelector({ attributes, selected, onChange }) {
  return (
    <Card title="商品规格">
      {attributes.map(attr => (
        <div key={attr.name}>
          <h4>{attr.name}</h4>
          <Radio.Group
            value={selected[attr.name]}
            onChange={e => onChange(attr.name, e.target.value)}
          >
            {attr.values.map(value => (
              <Radio.Button key={value} value={value}>
                {value}
              </Radio.Button>
            ))}
          </Radio.Group>
        </div>
      ))}
    </Card>
  );
}

SKU 匹配逻辑

当用户选择属性后,需要匹配对应的 SKU:

function findMatchedSku(selected, skus) {
  return skus.find(sku => 
    Object.entries(selected).every(
      ([name, value]) => sku.attributes[name] === value
    )
  );
}

完整组件示例

import React, { useState } from 'react';
import { Card, Radio, Button, Tag, Divider } from 'antd';

function SkuSelector({ data }) {
  const [selected, setSelected] = useState({});
  const matchedSku = findMatchedSku(selected, data.skus);

  const handleAttributeChange = (name, value) => {
    setSelected(prev => ({ ...prev, [name]: value }));
  };

  return (
    <div>
      <AttributeSelector 
        attributes={data.attributes} 
        selected={selected}
        onChange={handleAttributeChange}
      />

      <Divider />

      {matchedSku ? (
        <div>
          <Tag color="green">库存: {matchedSku.stock}</Tag>
          <Tag color="orange">价格: ¥{matchedSku.price}</Tag>
          <Button type="primary">加入购物车</Button>
        </div>
      ) : (
        <Tag color="red">请选择完整规格</Tag>
      )}
    </div>
  );
}

禁用无库存选项

为提升用户体验,可以禁用无库存的属性组合:

react结合antd实现sku

function getDisabledValues(attributes, skus, currentSelected) {
  const disabledValues = {};

  attributes.forEach(attr => {
    disabledValues[attr.name] = attr.values.filter(value => {
      const testSelection = { ...currentSelected, [attr.name]: value };
      return !skus.some(sku => 
        Object.entries(testSelection).every(
          ([name, val]) => sku.attributes[name] === val
        )
      );
    });
  });

  return disabledValues;
}

样式优化

使用 Ant Design 的 Grid 和 Space 组件优化布局:

import { Row, Col, Space } from 'antd';

// 在 AttributeSelector 中替换布局
<Row gutter={[16, 16]}>
  {attributes.map(attr => (
    <Col span={24} key={attr.name}>
      <Space direction="vertical">
        <h4>{attr.name}</h4>
        <Radio.Group>
          {/* ... */}
        </Radio.Group>
      </Space>
    </Col>
  ))}
</Row>

价格区间显示

当存在多个 SKU 时,可以显示价格区间:

function getPriceRange(skus) {
  const prices = skus.map(sku => sku.price);
  return {
    min: Math.min(...prices),
    max: Math.max(...prices)
  };
}

响应式处理

针对移动端优化显示:

import { useBreakpoint } from 'antd';

function ResponsiveSku() {
  const screens = useBreakpoint();
  const isMobile = !screens.md;

  return (
    <Radio.Group size={isMobile ? 'small' : 'middle'}>
      {/* ... */}
    </Radio.Group>
  );
}

标签: reactantd
分享给朋友:

相关文章

react native如何启动

react native如何启动

如何启动 React Native 项目 安装 Node.js 和 npm 确保已安装 Node.js(建议版本 16 或更高)和 npm(Node.js 自带)。可通过以下命令检查版本: node…

如何评价react native

如何评价react native

React Native 的优势 跨平台开发效率高:基于 JavaScript 和 React 语法,可同时开发 iOS 和 Android 应用,减少重复代码量。性能接近原生:通过原生组件渲染,性能…

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修改…

react如何检测

react如何检测

检测 React 应用的方法 使用 PropTypes 进行类型检查 PropTypes 是 React 内置的类型检查工具,用于验证组件的 props 是否符合预期。在开发环境中,PropTypes…

react如何注销

react如何注销

React 组件的注销方法 在 React 中,组件的注销通常指的是在组件卸载时执行清理操作,例如取消订阅、清除定时器或释放资源。以下是几种常见的方法: 使用 useEffect 钩子的清理函数…

react如何发布

react如何发布

发布React应用的步骤 构建生产版本 使用以下命令生成优化后的生产版本代码,代码会被压缩并移除开发环境中的调试工具: npm run build 构建完成后会生成build文件夹,包含所有静态资源…