需要在 ReactJS 中的 render() 之前执行函数

IT技术 javascript reactjs
2021-05-03 23:43:32

我用 React 创建了一个登录系统,它在用户登录时存储一个会话。当页面重新加载时,我添加了一个函数来检查会话是否存在,然后检查setState()totrue或 to false

由于我是 React 的新手,我不确定如何执行此功能。请参阅下面的App.js代码

import React from 'react';
import './css/App.css';
import LoginForm from "./LoginForm";
import Dashboard from "./Dashboard";

class App extends React.Component {

    constructor(props) {
        super(props)
        this.state = {
            renderLoginForm: true
        };
        this.handleLoginFormMount = this.handleLoginFormMount.bind(this);
    }

    handleLoginFormMount() {
        this.setState({
            renderLoginForm: false
        });
    }

    // Check session function.
    checkSession() {
        fetch('/check-session', {
            credentials: 'include'
        })
        .then((response) => {
            return response.json();
        })
        .then((sessionResult) => {
            if (sessionResult.username) {
                console.log('false');
                this.setState({
                    renderLoginForm: false
                });
            } else {
                console.log('true');
                this.setState({
                    renderLoginForm: true
                });
            }
        })
        .catch((error) => {
            console.log('Error: ', error);
        });
    }

    render() {

        checkSession();

        return (
            <div className="App">
                {this.state.renderLoginForm ? <LoginForm mountLoginForm={this.handleLoginFormMount} /> : null}
                {this.state.renderLoginForm ? null : <Dashboard />}
            </div>
        );
    }
}

export default App;

checkSession()在这个位置输出在加载页面时,控制台的情况如下:

Line 50: 'checkSession' is not defined no-undef

如果我将函数放在 之外class App extends React.Component {},那么它会告诉我我无法设置未定义的状态。

2个回答

checkSession()在这个位置输出在加载页面时,控制台的情况如下:

Line 50:  'checkSession' is not defined  no-undef

那是因为它是一种方法,但您像调用独立函数一样调用它。电话应该是this.checkSession();但继续阅读。

分别地:

render功能必须是纯净的,它不能有副作用,如改变状态。相反,将任何副作用代码放在componentDidMount; 来自该生命周期方法的文档:

如果您需要从远程端点加载数据,这是实例化网络请求的好地方。

确保您的组件为原始状态(在会话检查之前)以及更新状态(在会话检查之后)正确呈现。

文档中有关生命周期方法等的更多信息

或者,如果该组件在没有会话的情况下无法执行任何有用的操作,您可以将会话检查移至其父组件,并让父组件仅在具有会话检查结果时才呈现此子组件。

功能组件:就我而言,我希望我的代码在组件呈现在屏幕上之前运行。useLayoutEffect是 React 为这个确切目的提供的钩子。

import React, { useLayoutEffect } from "react";
...
const App = () => {
   
    useLayoutEffect(() => {
        //check local token or something

    }, []);
}

阅读更多:https : //reactjs.org/docs/hooks-reference.html#uselayouteffect