React Hooks的使用问题

发布于 2022-09-12 03:28:57 字数 4089 浏览 28 评论 0

一个登录页面,分为父组件LoginPage和子组件LoginForm。在父组件中把onSubmit方法传递给子组件,然后子组件点登录的时候把用户名和密码传递父组件。在onSubmit中判断用户名和密码是否为空,如果不是,就在这个方法里发送请求。
LoginPage

import useFetch from '@/hooks/useFetch';


const LoginPage = props => {
  const [ errors, setErrors ] = useState({});
  onSubmit = (userName, password) => {
    const errs = {
        userName: false,
        password: false
    }
    !userName && (errs.userName = true);
    !password && (errs.password = true);
    Object.keys(errs).length && setErrors({...errors,...errs})
    //* 登录请求,这里报错:只能在函数组件中调用hooks
    userName && password && useFetch(`${LOGIN_URL}?username=${userName}&password=${password}`, 'POST')
  };
  return LoginForm({ ...props, onSubmit, errors });
};
export default LoginPage;

LoginForm

const LoginForm = props => {
  const { onSubmit, errors } = props;
  const [ userName, setUserName ] = useState('');
  const [ password, setPassword ] = useState('');

  return (
    <Container>
        <Content>
          {/* <Image source={loginCover} style={styles.cover} resizeMode="cover" /> */}
          <View style={styles.logoWrapper}>
            <Image
              source={loginLogo}
              style={styles.logo}
              resizeMode="contain"
            />
          </View>
          <Form style={{ marginLeft: 50, marginRight: 50 }}>
            <Item
              error={errors.userName}
              style={{ marginBottom: 20 }}
            >
              <Icon active name="user" type="FontAwesome" />
              <Input
                placeholder="用户名"
                autoCorrect={false}
                autoCapitalize="none"
                value={userName}
                returnKeyType="next"
                onChangeText={text => setUserName(text)}
                //onSubmitEditing={() => this.focusInput("password")}
                blurOnSubmit={false}
              />
            </Item>
            <Item error={errors.password}>
              <Icon active name="lock" type="FontAwesome" />
              <Input
                placeholder="密码"
                secureTextEntry={true}
                value={password}
                returnKeyType="done"
                onChangeText={text => setPassword(text)}
                onSubmitEditing={onSubmit}
              />
            </Item>
          </Form>
          <View style={{alignItems: 'center', marginTop: 80}}>
            <LinearGradient
              start={{ x: 0, y: 0 }}
              end={{ x: 1, y: 0 }}
              style={styles.linearGradient}
              colors={["#0067FF", "#199EFF"]}
            >
              <Button color="#fff" title="登录" onPress={() => onSubmit(userName, password)} />
            </LinearGradient>
          </View>
        </Content>
      </Container>
  )
}
export default LoginForm;

报错
image.png
自定义hook:useFetch

const useFetch = (url, method = 'GET', params = {}) => {
    const [ response, setResponse ] = useState(null);
    const [ error, setError ] = useState(null);
    useEffect(() => {
      const fetchData = async () => {
        try {
          const options = {
            method,
            headers: { 'Content-Type': 'application/json;charset=utf-8' },
            body: params
          }
          const res = await fetch(getUrl(url), options);
          const json = await res.json();
          setResponse(json);
        } catch (error) {
          setError(error);
        }
      };
      fetchData();
    }, []);
    return { response, error };
  };

  export default useFetch;

按报错的意思应该是不能在onSubmit方法里调用hook,应该在它的外面使用。但是我需要在onSubmit里边判断并获取用户名和密码再发送请求。这个怎么搞,我把onSubmit方法拿到loginPage外面去然后在把用户名和密码return出来吗,在LoginPage里面调用useFetch,感觉不太对。第一次用hooks开发,好多问题

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

残龙傲雪 2022-09-19 03:28:57

你在事件回调函数中调用了 自定义 Hooks useFetch() 违反了 Hooks 使用规则。最好根据业务重新思考下这块逻辑怎么去拆分。
还有 使用Hooks 的话,建议开启 eslint 并安装插件 eslint-plugin-react-hooks

✌️ Hook 使用规则

Hook 就是 JavaScript 函数,但是使用它们会有两个额外的规则:

  • 只能在函数最外层调用 Hook。不要在循环、条件判断或者子函数中调用。
  • 只能在 React 的函数组件中调用 Hook。不要在其他 JavaScript 函数中调用。(还有一个地方可以调用 Hook —— 就是自定义的 Hook 中,我们稍后会学习到。)

详细的使用规则,见官方文档=》https://zh-hans.reactjs.org/d...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文