- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有保存按钮的组件
<Button onClick={() => requestSaveAsync()}>Save</Button>
我还需要能够从应用程序的顶层调用 requestSaveAsync,因此我在名为 useEditRow 的自定义钩子(Hook)中添加了一个 useImperativeHandle 钩子(Hook)
interface Props {
ref: MutableRefObject<{
addItem: () => void
}>
}
const useEditRow = (props: Props) => {
useImperativeHandle(props.ref, () => ({
addItem: () => requestSaveAsync()
})
}
useEditRow 钩子(Hook)位于 OrderItemTable 组件内
const OrderItemTable = forwardRef(function OrderItemTable(props: Props, ref: MutableRefObject<any>) {
const editRow = useEditRow({
ref: ref
})
})
requestSaveAsync 方法使用来自 react-query 的 useMutation
useMutation(mutateFn, {
onSuccess: () => dispatch({type: 'clear', name: 'row'})
})
清除行将状态设置为初始状态。如果通过单击按钮调用 requestSaveAsync,则会清除该行。如果我通过父组件调用它,则调用 onSuccess 函数,但调度不执行任何操作。如果我在调度函数上放置一个断点,我会看到下面的代码即将从 react_devtools_backend.js 调用
useReducer: function (a, b, e) {
a = F();
b = null !== a ? a.memoizedState : void 0 !== e ? e(b) : b;
z.push({
primitive: "Reducer",
stackError: Error(),
value: b
});
// devtools show the empty function on this line will be executed next
return [b, function () {}];
},
起初我认为可能 useImperativeHandle 使用的是陈旧状态,所以我尝试返回 {...initialState} 而不是 initialState。这似乎没有帮助。我尝试添加 react-hooks/exhaustive-dep 建议的依赖项数组。那没有帮助。有谁知道为什么当从 useImperativeHandle 调用 dispatch 时,状态不会更新?
最佳答案
您的 useImperativeHandle
钩子(Hook)似乎没有使用 转发 react 引用。换句话说,React 引用 不是 子组件可以访问的常规 React Prop 。
您应该使用 React.forwardRef
将任何传递的引用正确转发到函数组件。
React.forwardRef
Forwarding Refs
您没有包含您的功能组件,但如果您按照提供的链接中的示例进行操作,则很容易弄清楚。
例子:
const MyComponentWithSaveButton = (props, ref) => {
useImperativeHandle(ref, () => ({
addItem: requestSaveAsync,
}));
const requestSaveAsync = () => { .... };
...
};
export default React.forwardRef(MyComponentWithSaveButton);
注意这里的函数组件签名不接受两个参数,
props
对象和 React
ref
正在转发,并且
useImperativeHandle
钩子(Hook)引用了转发的
ref
.
关于javascript - 在 useImperativeHandle 内部调用的调度不调用操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69261314/
我有一个带有保存按钮的组件 requestSaveAsync()}>Save 我还需要能够从应用程序的顶层调用 requestSaveAsync,因此我在名为 useEditRow 的自定义钩子(H
我在子组件的 useImperativeHandle Hook 中创建了一个方法。然后,我可以完美地从父组件访问它。就像下面的例子。但是,我无法从子组件访问它。换句话说,focus from pare
我在子组件的 useImperativeHandle Hook 中创建了一个方法。然后,我可以完美地从父组件访问它。就像下面的例子。但是,我无法从子组件访问它。换句话说,focus from pare
function App(){ const cntEl:any = React.useRef(null); // I don't know what type should be here.
我需要使用 ref获取孙组件的状态,我使用 useImperativeHandle 对其进行了自定义,简化了整个代码 here . function App() { const ref = use
我不明白为什么需要以下 useImperativeHandle、useLayoutEffect 和 useDebugValue 钩子(Hook),您能否举例说明何时可以使用它们,但请不要使用文档中的示
我需要访问子组件的位置。据我了解,要访问子属性,我需要使用 useImperativeHandle 将子 API 添加到其 ref。此外,我需要使用 forwardRef 将引用从父级传递给子级。所以
文档中提供的示例如下: function FancyInput(props, ref) { const inputRef = useRef(); useImperativeHandle(ref
我是一名优秀的程序员,十分优秀!