javascript - 反应:尝试将状态传递给父级时,事件为空
问题描述
当使用 React 库时,该onChange
方法可用于将状态传递给父组件,如下所示:
export class Parent extends React.Component<{}, { foo: string }> {
render() {
return (
<Input
value={this.state.foo}
onChange={this.handleFooChange}
/>
);
}
handleFooChange = (event: any) => {
this.setState({
foo: event.target.value
});
}
}
它按预期更改父级中的状态。我想将该onChange
属性用于我自己的组件,该组件包装了另一个库组件,但似乎无法让它工作。我本质上只是想Dropdown
通过Picker
.
interface Props{
onChange: any;
}
interface State{
picked: string;
}
export class PickerComponent extends React.Component<Props, State> {
constructor(props: any) {
super(props);
this.handleChange = this.handleChange.bind(this);
}
handleChange = (event: any) => {
this.setState({
picked: event.target.value, //is null
});
};
render() {
return (
<Input
value={this.state.picked}
onChange={this.handleChange}
/>
);
}
}
在上面的简化实现中,我得到了一个TypeError: Cannot read property 'target' of null
事件。handleChange
这是CodePen上类似的东西,但在这里甚至父级都包含一个bind()
有点令人困惑的调用。欢迎任何帮助或替代解决方案。
Dropdown
如果重要,Input
则取自 Fluent UI。
编辑:错字
解决方案
该错误实际上源于Input
Fluent UI 中包装组件的行为,该组件返回一个event
和data
through onChange
。而不是期望event.target.value
收到的值在于data.value
. 如果子组件和父组件中需要状态,则在子组件中handleChange
应如下所示。如果此处不需要状态,则可以完全省略它。
interface PickerProps {
onChange: any;
}
interface PickerState {
picked: string;
}
export class Picker extends React.Component<PickerProps, PickerState> {
constructor(props: any) {...}
handleChange = (e: any, data: any) => {
this.setState({
picked: data.value,
});
this.props.onChange(e, data);
};
render() {
return (
<Input
onChange={this.handleChange} //call this.props.onChange if state is only needed in parent
/>
);
}
}
父母可以通过使用完全相同的handleChange
方法来调用孩子并将其传递给孩子
<Picker
onChange={this.handleChangeButInParent}
/>
也可能只是将 data.value 传递给父级。
推荐阅读
- html - 通过 URL 选择后如何维护下拉列表?
- javascript - 导入 Vuejs 和 VueI18n
- r - R列表:如何提取固定其他列的列
- python - 比较两个数据帧
- tcp - 如何从移动热点端口转发到其本地 LAN 上的设备?
- node.js - Fastify + Boom 不返回 500 以外的任何值
- android - Android 应用程序说已发布,但同时表示它也“卡在”“待更新”中!如何解决?
- r - 我可以使用 geom_text 而不是点的大小(geom_count)绘制 ggplot2 中的数字计数吗?
- c - 为什么函数 malloc 可以这样使用?
- javascript - 在 jQuery Datatables 中添加指向 Ajax 源数据的链接