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

如何在MUI Select组件中通过event.target获取Select的id?

解决Material-UI Select复用通用onChange处理器的问题

问题原因

你遇到的问题是Material-UI的Select组件触发onChange时,event.target指向的是被选中的MenuItem而非Select本身,所以拿不到你给Select设置的id值——这不是你的写法问题,是组件内部事件委托机制导致的。

解决方案:用高阶函数实现通用处理器

最简洁可靠的方式是写一个高阶函数,提前把Redux对应的键(也就是输入框/Select的id)传进去,不用依赖事件对象里的target信息,文本输入和Select都能复用同一个处理器:

const handleChange = (key) => (event) => {
  dispatch(formActions.set({ key, value: event.target.value }));
};

然后修改组件调用:

文本输入框使用:

<OutlinedInput
  id="textField"
  label="Test Text Field"
  defaultValue="Stuff"
  onChange={handleChange("textField")}
/>

Select组件使用:

<Select
  labelId="spending-plan-label"
  id="spendingPlan"
  value={state.spendingPlan}
  label="Spending Plan"
  onChange={handleChange("spendingPlan")}
>
  <MenuItem value="inflation-adjusted">Inflation Adjusted</MenuItem>
  <MenuItem value={20}>Twenty</MenuItem>
  <MenuItem value={30}>Thirty</MenuItem>
</Select>

这样你可以删掉原来的handleTextInputChange和handleSpendingPlanChange,只用这一个通用处理器,完全符合DRY原则。

额外思路:利用Select的onChange第二个参数

如果坚持想通过事件信息获取,Material-UI的Select的onChange会传入第二个参数,包含选中项的相关信息,你可以从这里拿到Select的id:

const handleChange = (event, child) => {
  const key = child.props.id;
  dispatch(formActions.set({ key, value: event.target.value }));
};

不过这种方式不如高阶函数直接传key稳定,因为Material-UI组件内部结构变化可能会影响这个参数的结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:57:34