javascript - 重新渲染之前最初显示的登录页面 - Reactjs

标签 javascript reactjs

发生的情况是,当我的用户登录并刷新页面时,我的登录页面会短暂显示,然后再向他们显示实际页面。我希望同时显示一个空白页面或显示一个加载页面。实际上,我不太确定为什么它首先出现,因为我首先在 componentWillMount() 中进行了一些数据处理。

相关代码如下:

componentWillMount()
{
    let url = "src/php/login.php";

    axios.get(url, {
        params: {
            get_userid : ""
        }
    })
    .then( r => 
    {
        if (r.data)
        {
            console.log(r.data);
            this.props.dispatch({ type: "new_user_id", payload: { id: r.data } });
        }
    })
    .catch( error => console.log(error));       
}



render() {
    var { user_id } = this.props;
    if (!user_id)
    {
        return (
            <div>
                some login logic
                <button onClick={this.new_user_id}>New user</button>

                <div style={{color : "red"}}>
                    { this.state.error && "Could not validate username/password. Please check." }
                </div>

                <form onSubmit={this.handle_submit}>
                    <div>
                        Username: <input id="username" name="username" type="text" />
                    </div>
                    <div>
                        Password: <input id="password" name="password" type="password" />
                    </div>
                    <input type="submit" value="submit" />
                </form>
            </div>
        );
    }

    else
    {
        return (
            <div style={{padding: "0 5px"}}>
                User ID: {user_id}
                <div style={{padding: "5px 0"}}>
                    <Link activeClassName="active" className="default bottom-radius" to='main'>Main Menu</Link>
                    <Link activeClassName="active" className="default bottom-radius" to='search'>Search</Link>
                    <Link activeClassName="active" className="default bottom-radius" to="form">Form</Link>
                    <a className="bottom-radius" style={{ float: "right", color : "blue", backgroundColor: "red", padding: "5px", cursor : "pointer" }} onClick={this.logout}>Logout</a>
                </div>
                <div style={{paddingTop: "10px"}}>
                    {this.props.children}
                </div>

            </div>
        );
    }
  }

user_id 最初是 ""

最佳答案

在您的 componentWillMount() 函数中,您在 Promise 中进行数据处理,因此 React 会继续渲染,无需等待 Promise 解析/拒绝。

要显示空白页面或任何加载状态,您必须定义一些标志,例如:

状态:{加载:true}

您可以在组件的构造函数中添加加载状态标志,如下所示:

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {loading: true};
  }
}

然后在你的渲染方法中检查状态:

render(){
   ...
   if(this.state.loading){
       return <div>Loading</div>;
   }
   ...
   // all your normal render stuff.
}

在promise解析后的componentWillMount()中,将加载设置为false,如果拒绝也以同样的方式设置为false+一些错误消息。

关于javascript - 重新渲染之前最初显示的登录页面 - Reactjs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41478845/

相关文章:

javascript - CSS3 Transform Matrix3D 动画故障,为什么?

javascript - React Native - 如何将 TextInput 字段中的值放入 Text 字段

reactjs - 如何在单击按钮后禁用 React Native 中的按钮

javascript - 模拟 CSS 悬停 :before and hover:after behavior tooltips for touchscreens

java - 在 html 中嵌入 Javafx

javascript - 使用 gRPC-web 调用 google text to speech api

javascript - 防止外部源使用 Javascript 修改我的 HTML

javascript - 受控组件输入字段 onChange 行为

javascript - 重置 useState 的初始状态

javascript - 提交后,b(array_name).map 不是函数 - ReactJS