我尝试了很多方法,但仍然收到错误消息“[未处理的承诺拒绝:错误:钩子调用无效。只能在函数组件的主体内部调用钩子。”。
我现在仍在使用 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" });
};
答案 0 :(得分:1)
useDispatch
是一个钩子,因此只能在功能组件内部调用。您正在调用注册方法中的钩子,这就是它抛出错误的原因。
在您的 SignUp
组件中试试这个 -
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);
const dispatch = useDispatch();
return (
<View style={styles.container}>
...other stuffs
<Button
title="test"
onPress={() => signUp({ email, pseudo, password, confirmPassword }, dispatch)}
/>
</View>
);
};
在signup
中,像这样 -
export const signUp = async ({ email, pseudo, password, confirmPassword }, dispatch) => {
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,
});
}
};