You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中按Weight变体展示MRP失效,求助解决方法

问题描述

在React中实现根据产品Weight变体展示对应MRP的功能,手动传递产品变体Weight值时功能正常,但通过e.target.value传递值时功能失效。

问题代码
import React, { useState } from "react";

import "./App.css";

function App() {
  const product = {
    productName: "IndoPrimo Men's Regular Fit Cotton Casual Shirt",
    productCategory: "HUMJOLI",
    image: "../images/I/71ZFayjCD-L._UL1500_.jpg",
    maxQty: 5,
    minQty: 1,
    unit: "gram",
    variantNames: ["weight"],
    variants: [
      { weight: 500, mrp: 100, storePrice: 80 },
      { weight: 1000, mrp: 200, storePrice: 140 },
    ],
    productMrp: 2199,
    productStoreprice: 7189,
  };
  const [sate, setSize] = React.useState([]);
  const handleBtn = (e) => {
    const id = e.target.value;
    console.log(id);
    const updatei̥tem = product.variants.filter((r) => {
      return r.weight === id;
    });
    setSize(updatei̥tem);
   
  };

  return (
    <div>
      <select name="r" onChange={(e) => handleBtn(e)}>
        {product.variants.map((i) => (
          <option value={i.weight} key={i.weight}>
            {i.weight}
          </option>
        ))}
      </select>
      
      <div>
        {sate?.map((i) => (
          <p>{i.mrp}</p>
        ))}
      </div>
    </div>
    
  );
}
解决思路与修改方案

问题核心原因:e.target.value获取到的是字符串类型,而product.variants中的weight是数字类型,使用全等运算符===比较时类型不匹配,导致过滤结果为空。

修改步骤:

  1. 将e.target.value转换为数字类型,可使用Number(id)或+id实现。
  2. 优化状态存储:因为每次仅选择一个变体,用find替代filter更合适(find返回匹配的单个对象,而非数组),同时将状态初始值设为null或空对象,渲染时更简洁。

修改后的代码:

import React, { useState } from "react";

import "./App.css";

function App() {
  const product = {
    productName: "IndoPrimo Men's Regular Fit Cotton Casual Shirt",
    productCategory: "HUMJOLI",
    image: "../images/I/71ZFayjCD-L._UL1500_.jpg",
    maxQty: 5,
    minQty: 1,
    unit: "gram",
    variantNames: ["weight"],
    variants: [
      { weight: 500, mrp: 100, storePrice: 80 },
      { weight: 1000, mrp: 200, storePrice: 140 },
    ],
    productMrp: 2199,
    productStoreprice: 7189,
  };
  // 初始状态设为null,存储单个选中的变体对象
  const [selectedVariant, setSelectedVariant] = useState(null);

  const handleBtn = (e) => {
    // 将字符串值转为数字
    const selectedWeight = Number(e.target.value);
    // 用find匹配单个变体
    const matchedVariant = product.variants.find(r => r.weight === selectedWeight);
    setSelectedVariant(matchedVariant);
  };

  return (
    <div>
      <select name="r" onChange={handleBtn}>
        {product.variants.map((i) => (
          <option value={i.weight} key={i.weight}>
            {i.weight}
          </option>
        ))}
      </select>
      
      <div>
        {/* 直接渲染选中变体的MRP,无需map */}
        {selectedVariant && <p>{selectedVariant.mrp}</p>}
      </div>
    </div>
  );
}

内容的提问来源于stack exchange,提问作者Amit Kundu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:27:45