redux 在React中使用window.location.reload是否正确?

6jygbczu  于 2022-12-19  发布在  React
关注(0)|答案(3)|浏览(207)

当你打开reactjs.org时,在“声明性”标题下,有一句话:当您的数据发生更改时,React将高效地更新和呈现正确的组件。
对于我的几个应用程序,我使用以下结构:应用程序|AppContainer(所有应用程序逻辑,登录前受保护)|登录(登录表单)
如果您根据用户的凭据在App的render中返回2个不同的组件,则此结构可以正常工作。

render(){
   if(isUserLoggedIn()){
       return <AppContainer />;
   }

   return <Login />;
}

Login组件中,我使用window.location.reload刷新页面,这样应用程序的render将被触发,我将获得AppContainer组件。

  • 但感觉有点像jQuery + Angular。* 有没有更好(更React)的方式来触发呈现函数,或者事情就应该是这样的?
prdp8dxp

prdp8dxp1#

有没有更好的(更多的React)方式来触发渲染功能...
通常的方法是使用state,在本例中至少使用一个布尔值表示用户是否登录,并在用户成功登录或注销时更新该状态。
在您的示例中,由于您使用的是Redux,因此可能会在那里显示您的状态。
我没有使用Redux(还没有?),这是它看起来模糊的样子,粗略地(如果你使用一个类组件,因为你似乎是):

class App extends Component {
    constructor(props) {
        super(props);
        this.state = {
            loggedIn: /*...initial value, perhaps from web storage or cookie...*/;
        };
        this.onLogin = this.onLogin.bind(this);
        this.onLogout = this.onLogout.bind(this);
    }

    onLogin() {
        // ...probably stuff here, then:
        this.setState({loggedIn: true});
    }

    onLogout() {
        // ...probably stuff here, then:
        this.setState({loggedIn: false});
    }

    render() {
        if (this.state.logedIn) {
            return <AppComponent onLogout={this.onLogout}/>;
        }
        return <Login onLogin={this.onLogin}/>;
    }
}

或带钩:

const App = () => {
    const [loggedIn, setLoggedIn] = useState(/*...initial value, perhaps from web storage or cookie...*/);

    const onLogin = useCallback(() => {
        // ...probably stuff here, then:
        setLoggedIn(true);
    }, [loggedIn]);

    const onLogout = useCallback(() => {
        // ...probably stuff here, then:
        setLoggedIn(false);
    }, [loggedIn]);

    if (this.state.logedIn) {
        return <AppComponent onLogout={onLogout}/>;
    }
    return <Login onLogin={onLogin}/>;
}

(再次粗略)

bgtovc5b

bgtovc5b2#

如果您需要更新组件状态,那么您可以传递一个可观察对象并侦听更改,或者使用某个状态管理库。
下面是一个可能的解决方案:
1.创建可观察类

declare type IObserverHandler = (event: any) => void;
export class Observable {
    private observers: IObserverHandler[] = [];

    public subscribe(observer: IObserverHandler) {
        if (!this.observers.includes(observer)) {
            this.observers.push(observer);
        }
    }
    public unsubscribe(observer: IObserverHandler) {
        this.observers = this.observers.filter(o => o !== observer);
    }
    public publish(event: any) {
        for (const observer of this.observers) {
            observer(event);
        }
    }
}

1.创建将发布登录或注销等操作事件的Login类

class Login extends Observable {

    public login() {
        this.publish({ value: true });
    }

    public logout() {
        this.publish({ value: false });
    }
}

1.在组件中订阅观察器并使用事件值更新组件状态

export abstract class Component extends React.Component<any, any> {
    private observer: IObserverHandler;
    private observable: Login;

    constructor(props: any) {
        super(props);
        this.observable = this.props.observable;
        this.state = { isAuthenticated: false }

        this.observer = (event) => {
            this.setState({ isAuthenticated: event.value })
        }
        this.observable.subscribe(this.observer);
    }

    componentWillUnmount() {
        this.observable.unsubscribe(this.observer);
    }
}
um6iljoc

um6iljoc3#

您可以使用useNavigate并导航到您所在的同一url。例如,您可以使用navigate("/...your current url....")来代替window.location.reload()
window.location.reload()并不是每次都是最好的选择。它可以在localhost上工作,但是例如当你通过使用“Netlify”等服务将它部署到互联网上时,它可能会导致“找不到url”错误
创建一些额外的状态并跟踪它们以重新呈现页可能会不必要地使代码复杂化。

相关问题