我有一个React组件,该组件试图获取一些数据,并在成功检索数据后调用onSuccess(result)
回调。
我需要将数据保存到redux。我创建了使用useDispatch
的自定义挂钩,并且我正在尝试执行以下操作:
<MyComponent onSuccess = {res => myCustomHook(res)} />
但出现错误,因为无法在回调内部调用挂钩。
我知道挂钩只能在功能组件的顶层调用。.那么我如何才能实现所需的呢?
自定义挂钩:
export function useSaveData(type, response)
{
if(!type|| !response)
{
throw new Error("got wrong parameters for useSaveData");
}
let obj= {
myData1: response.data1,
myData2: response.data2
};
sessionStorage.setItem(type, JSON.stringify(obj));
const dispatch = useDispatch();
dispatch(actionCreator.addAction(type, obj));
}
答案 0 :(得分:0)
您的自定义钩子应返回一个可以作为回调传递的函数。
useMyCustomHook = () => {
// your hook
const onSuccess = () => {
// save data here
}
return { onSuccess };
}
在您的组件中。
function MyComponent(props) {
const { onSuccess } = useMyCustomHook();
// your component code, you have onSuccess which can be bind with button or form as per your requirement.
}
看到自定义钩子后进行编辑。
您无需在此处创建自定义钩子。您只需将调度传递到回调中即可。
const dispatch = useDispatch()
<MyComponent onSuccess={res => onSuccess(res, dispatch)} />
创建onSucces函数。
export function onSuccess(type, response, dispatch)
{
if(!type|| !response)
{
throw new Error("got wrong parameters for useSaveData");
}
let obj= {
myData1: response.data1,
myData2: response.data2
};
sessionStorage.setItem(type, JSON.stringify(obj));
dispatch(actionCreator.addAction(type, obj));
}
答案 1 :(得分:0)
父组件可以按以下方式将调度程序传递给useSaveData
。
export const useSaveData = (dispatch) => (type, response) =>
{
if(!type|| !response)
{
throw new Error("got wrong parameters for useSaveData");
}
let obj= {
myData1: response.data1,
myData2: response.data2
};
sessionStorage.setItem(type, JSON.stringify(obj));
dispatch(actionCreator.addAction(type, obj));
}
父组件变成;
function ParentComponent() {
const dispatch = useDispatch();
const myCustomHook = useSaveData(dispatch);
return <MyComponent onSuccess = {res => myCustomHook(ACTION_TYPE, res)} />
}
答案 2 :(得分:0)
useDispatch
是一个React Redux钩子,不能在功能组件主体之外的任何地方直接使用。即使从功能组件的主体中调用它,您也不能直接在另一个普通javascript函数中使用它。因此,要在其他地方使用useDispatch
钩子,可以在useDispatch
钩子中声明一个const。请注意,这只能在函数组件内部进行,如下所示:
export default function MyComponent {
const dispatch = useDispatch()
......
}
现在,此const派发可以传递到其他任何地方,包括回叫。在回叫中,您可以访问传递的dispatch
参数并在其上调用redux API,如下所示:
export function useSaveData(type, response, dispatch)
{
if(!type|| !response)
{
throw new Error("got wrong parameters for useSaveData");
}
let obj= {
myData1: response.data1,
myData2: response.data2
};
sessionStorage.setItem(type, JSON.stringify(obj));
dispatch(actionCreator.addAction(type, obj));
}