javascript - 为什么用户登录后导航栏组件不更新? (无 Redux)

标签 javascript reactjs

我希望导航栏更改状态,但我不知道如何在不使用 Redux 的情况下将状态从登录传递到导航栏。它仅在我手动刷新页面后更新导航栏的状态。不是很好。如果一旦我单击“登录”按钮,导航栏也会更新其状态,那就太好了。我怎样才能传递状态?

应用程序组件:

const App = () => {
    return (
        <BrowserRouter>
            <div className="App">
                <Navbar />
                <Switch>
                    <Login exact path="/login" component={Login} />
                    <Signup exact path="/signup" component={Signup} />
                </Switch>
            </div>
        </BrowserRouter>
    );
};

导航栏组件:

class Navbar extends React.Component {
    constructor() {
        super();
        this.state = {
            modalOpen: false,
            isAuthenticated: false,
            name: '',
        };
}

componentDidMount() {
        if (localStorage.getItem('token')) {
            this.setState({ isAuthenticated: true });
        }
    }

render() {
        return (
            <div className="navbar">
                <div className="navbar-flex">
                    {this.state.isAuthenticated && <p>Hello {this.state.name}</p>}
                    <Button onClick={this.toggleModal}>Menu</Button>
                </div>
                {this.state.modalOpen && (
                    <div className="modal" ref={this.setWrapperRef}>
                        {!this.state.isAuthenticated ? (
                            <div>
                                <Link to="/">
                                    <Button onClick={() => this.setState({ modalOpen: false })}>Home</Button>
                                </Link>
                                <Link to="/login">
                                    <Button onClick={() => this.setState({ modalOpen: false })}>Login</Button>
                                </Link>
                                <Link to="/signup">
                                    <Button onClick={() => this.setState({ modalOpen: false })}>Signup</Button>
                                </Link>
                            </div>
                        ) : (
                            <div>
                                <Link to="/">
                                    <Button onClick={() => this.setState({ modalOpen: false })}>Home</Button>
                                </Link>
                                <Link to="/">
                                    <Button onClick={this.logout}>Logout</Button>
                                </Link>
                            </div>
                        )}
                    </div>
                )}
            </div>
        );
    }

登录组件提交方法:

onSubmit = (e) => {
        e.preventDefault();

        this.setState({ loading: true });

        axios
            .post('/api/login', {
                email: this.state.email,
                password: this.state.password,
            })
            .then((res) => {
                if (res.data.token) {
                    localStorage.setItem('token', res.data.token);
                    this.setState({ loading: false });
                    this.props.history.push('/');
                } else if (res.data.status === 'fail') {
                    this.setState({ loading: false });
                }
            });
    };

最佳答案

以下是我如何控制导航栏以反射(reflect)当前状态(已验证或未验证)。

您可以创建一个方法来检查 token 的本地存储并返回 false 或 true 结果,或者您可以执行任何您想要执行的操作以确保身份验证并根据该结果返回值。

const isAuthenticated = (token) => {
     localStorage.getItem(token) ? true:false;
}

然后您可以导入它,并在 componentDidMount() 上调用该方法并存储结果,并用它做任何您想做的事情。

关于javascript - 为什么用户登录后导航栏组件不更新? (无 Redux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62127418/

相关文章:

javascript - componentDidMount 内的 "setState(…): Can only update a mounted or mounting component"

javascript - ExtJS - 堆积条形图条件着色

javascript - WebDriver:更改事件未触发

javascript - 如何使用 jQuery.validate() 检查特定文本值

javascript - 在球体上旋转玩家相机 (javascript/three.js)

javascript - React 在第三状态中合并两个状态

javascript - 无法理解 JavaScript 函数

reactjs - React-testing-library - 测试 html 元素是否不存在

javascript - 两个日期比较 - 结束日期应大于 react redux 验证中的开始日期

javascript - React dropzone 图像未在模板上更新