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

如何通过代码修改input/select值时触发表单的onChange事件

无需用户操作触发表单onChange事件的实现方法(React场景)

我需要找到一种无需用户直接操作就能触发表单onChange事件的方案,以下用React代码举例说明我的具体场景:

自定义DropDown组件

function DropDown() {
  const [selectedPerson, setSelectedPerson] = useState(people[0])
  const selectRef = useRef()

  useEffect(() => {
    selectRef.current.value = selectedPerson.id
  }, [selectedPerson])

  return (
    <>
      <Listbox value={selectedPerson} onChange={setSelectedPerson}>
        {({ open, disabled, value }) => {
          console.log()
          return (
            <div>
              <Listbox.Button as="div">
                <span>{selectedPerson.name}</span>
              </Listbox.Button>
              <Listbox.Options static style={{ display: open ? 'block' : 'none' }}>
                {people.map(person => (
                  <Listbox.Option key={person.id} value={person} disabled={person.unavailable}>
                    {person.name}
                  </Listbox.Option>
                ))}
              </Listbox.Options>
            </div>
          )
        }}
      </Listbox>
      <div>
        <select ref={selectRef} name="test" id="">
          {people.map(person => (
            <option key={person.id} value={person.id}>
              {person.name}
            </option>
          ))}
        </select>
      </div>
    </>
  )
}

其中的原生select会被隐藏,仅用于尝试触发组件外层表单的onChange事件,外层App组件代码如下:

外层App组件

import DropDown from './DropDown'
import './App.css'

function App() {
  const onChange = ev => {
    console.log(ev)
  }
  return (
    <div className="App">
      <form onChange={onChange}>
        <DropDown />
      </form>
    </div>
  )
}

export default App

目前我已经通过useEffect成功修改了select组件的选中值,但希望能达到和用户直接操作select一样的效果——触发表单的onChange事件。需要说明的是,我不想通过Props Drilling将onChange函数传递给DropDown组件,请问有没有实现该需求的方法?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:05:11