【发布时间】:2021-01-12 01:18:39
【问题描述】:
我尝试了很多方法,但仍然收到错误消息“[未处理的承诺拒绝:错误:无效的钩子调用。只能在函数组件的主体内部调用钩子。”。
我现在还在使用 Context API,我将我的应用程序迁移到 Redux。 我正在尝试做一件简单的事情: 当我按下一个按钮时,我希望它调用一个函数,该函数将根据输入调用我的减速器。
屏幕注册.js:
const SignUp = ({ navigation }) => {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [confirmPassword, setConfirmPassword] = useState("");
const [pseudo, setPseudo] = useState("");
const state = useSelector((state) => state.AuthReducer);
return (
<View style={styles.container}>
...other stuffs
<Button
title="test"
onPress={() => signUp({ email, pseudo, password, confirmPassword })}
/>
</View>
);
};
我的 authReducer.js
export const AuthReducer = (state = 0, action) => {
switch (action.type) {
case "signin":
return {
errorMessage: "",
token: action.payload,
};
case "add_error":
return { ...state, errorMessage: action.payload };
....Other cases....
default:
return state;
}
};
export const signUp = async ({ email, pseudo, password, confirmPassword }) => {
const dispatch = useDispatch();
try {
response = await trackerApi.post("/api/signup", {
email,
pseudo,
password,
});
await AsyncStorage.setItem("token", response.data.token);
dispatch({
type: "signin",
payload: response.data.token,
});
RootNavigation.navigate("Tabs");
} catch (err) {
const { response } = err;
const { request, ...errorObject } = response;
let message = errorObject.data;
dispatch({
type: "add_error",
payload: message,
});
}
};
即使是这样的简单功能也不起作用:
export const signUp = async ({ email, pseudo, password, confirmPassword }) => {
const dispatch = useDispatch();
dispatch({ type: "add_error", payload: "test" });
};
【问题讨论】:
-
React 函数组件和钩子不能异步,钩子只能在钩子或函数组件内调用。使用内部异步函数或其他东西。
标签: reactjs react-native redux