【问题标题】:Invalid hook call. useDispatch . Redux无效的挂钩调用。使用调度。还原
【发布时间】: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


【解决方案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,
    });
  }
};

【讨论】:

  • 谢谢你,但如果我希望我的所有功能都在功能组件之外,我该怎么办?我希望我的注册屏幕干净
  • 您可以随时制作自定义挂钩 - reactjs.org/docs/hooks-custom.html
猜你喜欢
  • 2020-08-13
  • 2021-12-07
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
相关资源
最近更新 更多