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

React中给JSX标签value传对象后读取为[object Object]如何解决

问题根本原因

HTML 原生 <option> 标签的 value 属性仅支持字符串类型的值,直接传递对象时,浏览器会自动调用对象的 toString() 方法进行转换,最终存储的实际值就是固定字符串 "[object Object]"。你后续从事件对象中拿到的本身就是这个字符串,所以 JSON.stringify 处理后只会得到 "\"[object Object]\"",无法还原出原对象内容。

修复方案

提供两种常用的实现方案,按需选择即可:

  • 方案1(更推荐):通过索引/唯一标识关联原对象
    无需做序列化/反序列化操作,性能更高,无JSON转换异常风险。实现逻辑为将数组索引或数据唯一ID存入value,取值后匹配原数组得到完整对象:
const [selectedOp, setSelectedOp] = useState()

// 组件部分代码
<Form.Select 
  onChange={e => {
    const idx = Number(e.target.value)
    // 排除默认未选择的情况
    if (idx >= 0) {
      const targetItem = mainNotifications[idx]
      setSelectedOp({
        message: targetItem.message,
        type: targetItem.type
      })
    } else {
      setSelectedOp(undefined)
    }
  }} 
  className='b' 
  style={{ display: 'inline-block' }} 
  size="lg" 
  aria-label="Default select example"
>
  <option value={-1}>Click to choose message</option>
  {mainNotifications.map((n, i) =>
    <option key={i} name="selectMessage" value={i}>
      hey this is an option tag 
    </option>
  )}
</Form.Select>
  • 方案2:序列化对象存储,取值时反序列化
    如果数据不存在函数、循环引用、Symbol等无法被JSON序列化的内容,可以直接把对象转成JSON字符串存入value,取值时再解析为对象:
const [selectedOp, setSelectedOp] = useState()

// 组件部分代码
<Form.Select 
  onChange={e => {
    const valueStr = e.target.value
    if (valueStr) {
      setSelectedOp(JSON.parse(valueStr))
    } else {
      setSelectedOp(undefined)
    }
  }} 
  className='b' 
  style={{ display: 'inline-block' }} 
  size="lg" 
  aria-label="Default select example"
>
  <option value="">Click to choose message</option>
  {mainNotifications.map((n, i) =>
    <option 
      key={i} 
      name="selectMessage" 
      value={JSON.stringify({message:n.message,type:n.type})}
    >
      hey this is an option tag 
    </option>
  )}
</Form.Select>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:36:02