react 必须点击一下才能网络请求?

发布于 2022-09-05 09:34:05 字数 3160 浏览 13 评论 0

我想点击按钮loading:true显示loading界面
然后请求数据 有结果loading:false 跳转页面。

现在输入用户名密码点击登录显示loading页面 然后就一直loading 并没有去网络加载数据,导致loading一直为true。必须点击一下才可以去请求数据。
如果将注释的地方去掉 就可以正常去加载数据。
求解怎么回事?
如图:
图片描述

    handLogin = async() => {
        console.log('handLogin');
        let data = {'email': this.state.username, 'password': this.state.password};
        
        
        //把这里注释掉
        this.setState({
            loading:true,
        });
        //
        
        
        console.log('网络请求');
        const flag = await Post(URL.login,ToQueryString(data));
        console.log('flag',flag);
        if (flag&&flag.status==='000000') {
            this.toDrawer();
        }else{
            Toast.show('邮箱或密码错误', {
                duration: Toast.durations.LONG,
                position: Toast.positions.BOTTOM,
                shadow: true,
                animation: true,
                hideOnPress: true,
                delay: 0
            });
        }
    };

    check =()=>{
        console.log('username',this.state.username);
        console.log('password',this.state.password);
        if (!this.state.username || !this.state.username.trim()) {
            Toast.show('请输入您的邮箱', {
                duration: Toast.durations.LONG,
                position: Toast.positions.BOTTOM,
                shadow: false,
                animation: true,
                hideOnPress: true,
                delay: 0
            });
            return;
        }
        if (!this.state.password || !this.state.password.trim()) {
            Toast.show('请输入您的密码', {
                duration: Toast.durations.LONG,
                position: Toast.positions.BOTTOM,
                shadow: false,
                animation: true,
                hideOnPress: true,
                delay: 0
            });
            return;
        }
        
        //把这里注释掉
        this.setState({
            loading:true,
        });
        //
        
        this.handLogin();
    };
   render() {
        //把这里注释掉
        if(this.state.loading){
            return (<LoadingSpinner
                text={'正在登录...'}/>)
        }
        //
        
        
        return (<Button block info onPress={() => this.check()} style={commonStyles.button}>
                            <Text>立即登录</Text>
                        </Button>)
    }

网络请求函数

export async function Post(url,params) {
    try {
        let res = await api.post(url, {
            body:params,
        });
        console.log('response', res);
        const resJson = JSON.parse(res.body);
        console.log('response.body', resJson);
        console.log('resJson',resJson.result);
        if (res.err)
            throw res.err;
        if(resJson.status !== '000000'&&resJson.status !== 200){
            return false;
        }
        return resJson;
    } catch (err) {
        console.log(err);
        throw err;
    }
}

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

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

发布评论

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

评论(3

非要怀念 2022-09-12 09:34:05

这个问题 还是没有办法解决 不过貌似只在debug状态出现 将debug状态关闭就好了
应该是rn的bug 算了反正也不影响.

冬天的雪花 2022-09-12 09:34:05

你注释的地方是state的重新赋值,这样这个组件就会重新渲染
建议:onPress改成onclick 改变state的位置,其实只需要一处即可,在handLogin里面

差↓一点笑了 2022-09-12 09:34:05

你好,根据你的代码,大致修改如下:

  • check() 中去除 this.setState({loading:true})

  • handLogin() 中在 const flag = await Post(URL.login,ToQueryString(data)); 之后添加this.setState({loading:false})

思路

  • check() 作为登录之前前置验证,没必要加入更改组件状态的操作(不过得结合你的业务,起码单从你的代码段来说)

  • handLogin() 才是登录的主逻辑,可以去变更登录相关的状态,比如:请求之前setState({loading:true}),请求结束后setState({loading:false});

希望能帮到你~

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