编辑
抱歉显示错误的用例。内部的所有输入Form
都被传递this.props.children
,并且它们可以位于组件树的任何深处,因此handleChange
直接传递给输入的方法根本行不通。
这是重现问题的代码片段。
class CustomSelect extends React.Component {
items = [
{ id: 1, text: "Kappa 1" },
{ id: 2, text: "Kappa 2" },
{ id: 3, text: "Kappa 3" }
]
state = {
selected: null,
}
handleSelect = (item) => {
this.setState({ selected: item })
}
render() {
var { selected } = this.state
return (
<div className="custom-select">
<input
name={this.props.name}
required
style={{ display: "none" }} // or type="hidden", whatever
value={selected
? selected.id
: ""
}
onChange={() => {}}
/>
<div>Selected: {selected ? selected.text : "nothing"}</div>
{this.items.map(item => {
return (
<button
key={item.id}
type="button"
onClick={() => this.handleSelect(item)}
>
{item.text}
</button>
)
})}
</div>
)
}
}
class Form extends React.Component {
handleChange = (event) => {
console.log("Form onChange")
}
render() {
return (
<form onChange={this.handleChange}>
{this.props.children}
</form>
)
}
}
ReactDOM.render(
<Form>
<label>This input will trigger form's onChange event</label>
<input />
<CustomSelect name="kappa" />
</Form>,
document.getElementById("__root")
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="__root"></div>
如您所见,当您在默认输入中键入内容(受控或不受控等)时,表单会捕获冒泡onChange
事件。但是,当您以编程方式设置输入值时(state
在这种情况下使用 , ),不会触发 onChange 事件,因此我无法在表单的onChange
.
有什么办法可以解决这个问题吗?我试图在它的回调input.dispatchEvent(new Event("change", { bubbles: true }))
之后setState({ selected: input })
和内部立即进行,但没有结果。