reactjs - 如何通过反应调用父事件的子方法?
问题描述
我有一个子组件需要听其中一个的 parent event
。更准确地说,我在子组件中有一个函数,该函数event
将父组件作为参数。我想在每次event
发生时调用这个函数。
例如,下面是一个代码片段:
class Parent extends React.Component {
handleKeyDown = (event) => {
// Call the child function doSomething()
}
render() {
return (
<input
type="text"
onKeyDown={this.handleKeyDown}
>
<Child />
)
}
}
class Child extends React.Component {
doSomething = (event) => {
// Get the event from parent
}
render() {
return (
...
)
}
}
我考虑了两种方法:
ref
用于从父级调用子函数onKeyDown
(假设我可以访问它)- 使用 a
state
存储事件并将其作为 a 传递props
给孩子,然后props
使用 监听更改getDerivedStateFromProps
。
然而,这些解决方案似乎都不是很吸引人。我也考虑过使用 redux 函数,但我需要来自子组件和event
父组件的数据......我想知道是否有一种干净的方法可以做到这一点?
解决方案
更新:
我更新了我的组件以使用钩子并最终使用useRef()、useImperativeHandle()和forwardRef()来处理这种情况:
const Parent = () => {
const childRef = useRef();
const handleKeyDown = (event) => {
// Call the child function doSomething()
childRef.current.doSomething(event);
};
return (
<input
type="text"
onKeyDown={handleKeyDown}
>
<Child ref={childRef} />
);
};
const Child = forwardRef((props, ref) => {
useImperativeHandle(ref, () => ({
doSomething: (event) => {
// Get the event from parent
}
}));
return (
[...]
);
});
我决定在这篇文章1中使用Francis Malloch提供的解决方案:
class Parent extends React.Component {
childCallables = null;
setChildCallables = (callables) => {
this.childCallables = callables;
}
handleKeyDown = (event) => {
// Call the child function doSomething()
this.childCallables.doSomething(event);
}
render() {
return (
<input
type="text"
onKeyDown={this.handleKeyDown}
>
<Child setCallables={this.setChildCallables} />
)
}
}
class Child extends React.Component {
componentDidMount() {
this.props.setCallables({
doSomething: this.doSomething
});
}
doSomething = (event) => {
// Get the event from parent
}
render() {
return (
[...]
)
}
}
基本上,我使用道具来存储我需要从父级访问的子级方法。方法在子组件安装后保存在道具中。
1. 由于这是对一个完全不同的问题的答案,我认为将其标记为重复是没有意义的。
推荐阅读
- node.js - 如何删除 Post 架构内的评论?
- php - Shopware 6 中销售渠道的不同产品库存?
- vue.js - 如何替换vue-router中查询参数的值?
- javascript - 使用 gulp-svg-sprite 和基于源文件夹的动态目标
- sql-server - 确定时间范围内值班的工人
- angular - 可观察到的错误:您在哪里提供了“未定义”
- react-native - 无法从`node_modules/react-redux/lib/connect/mapDispatchToProps.js 解析模块`../../../../src/redux`
- plugins - Checkmarx 通过 CLI 插件团队 ID 扫描错误
- debugging - Nestjs如何在VS代码中编辑代码时进行调试
- c++ - 现代 GCC 将 `<` 前面的模板参数解释为运算符 `<`