【发布时间】:2022-01-02 04:05:59
【问题描述】:
这是一个简单的任务,但我做错了,不知道如何正确地做。感谢您的帮助。
我需要做的就是将一些表单数据发送给一个 thunk。 thunk 中有 useSelector() ,我已经构建了四五个类似的切片,没有问题。但这一次我是在‘打破钩子的规则’,我想我明白了,但我不知道如何解决问题并完成任务。
这是一些代码
shippingInfo.js:
从表单的 onSubmit(在名为 ShippingInfoDisplay.js 的组件中)调用此函数。它调度 'saveAddress',它存在于 thunk 中:
function handleSaveShippingInfo(e) {
e.preventDefault();
// many form fields taken from e.target and assigned to variables
dispatch(saveAddress({ list of form variables })); // <<< this crashes the thunk. 'breaking the rules of hooks'
}
这里是'saveAddress' thunk 的前几行。尝试使用选择器获取令牌时会中断:
addressSlice.js:
export const saveAddress = createAsyncThunk (
'addresses/saveAddress',
async ( props, thunkAPI ) => {
const { list of form variables } = props;
let theApiUrl = API_BASE_URL + '/api/v1/address'
authToken = useSelector(selectJwtToken) // <<< 'breaking rules of hooks' error
很可能我是问题的根源,因为我对钩子的理解还不够好。到目前为止,我知道需要另一块来解决问题,但我不知道那块是什么。我最好的猜测是,发送到“saveAddress”需要在“handleSaveShippingInfo(e)”函数之外,但我不知道把它放在哪里,或者还需要什么让它工作。
与此同时,我需要完成此表单提交并尝试了我能想到的一切。非常感谢任何指导/帮助。
感谢您的时间和关注。
【问题讨论】:
-
useSelector是一个钩子。第二个rule of hooks(你可以谷歌“钩子规则”)是从 React 功能组件的顶层调用它们。您还没有在这里发布大量上下文,但我可以肯定地说,您传递给createAsyncThunk的回调函数可能不是 React 函数组件的顶层。有没有其他方法可以在回调之前获取 authToken?
标签: reactjs redux react-hooks dispatch thunk