简体   繁体   English

为什么在使用 redux 时,这两种情况下的反应渲染不同?

[英]Why does react render differently in these two cases when using redux?

I was struggling with something I thought was a bug.我正在努力解决我认为是错误的事情。 I would be grateful if someone could explain why this happens.如果有人能解释为什么会发生这种情况,我将不胜感激。

In one instance, the permissions component renders every time permissions are updated in the store.在一种情况下,每次在商店中更新权限时都会呈现权限组件。 While in the second instance, the permissions component renders only once.而在第二种情况下,权限组件只呈现一次。

This is my component tree:-这是我的组件树:-

  • Layout布局
    • Sidebar侧边栏
    • Components成分
      • Auth认证
        • Permissions权限
        • Roles角色

Permissions Component权限组件

import * as React from "react";
import { useEffect } from "react";
import { useSelector } from "react-redux";
import { RouteComponentProps } from "react-router-dom";
import { fetchPermissions, launchModal } from "../store/dispatcher";
import { Permission } from "../store/types/auth";
import { GlobalState } from "../store/types/state";

import Loading from "../common/loading";

interface Props extends RouteComponentProps {}

const Permissions: React.FC<Props> = React.memo((props) => {

    const { loading, permissions } = useSelector((state: GlobalState) => ({
        loading: state.admin.permissionState?.isLoading,
        permissions: state.admin.permissionState?.permissions
    }));

    useEffect(() => {
        fetchPermissions();
    }, []);

    return (
        <div className='card'>
            <div className='card-header'>
                <div className='row'>
                    <div className='col-md-8'>
                        <h3>User Permissions</h3>
                    </div>
                </div>
            </div>
            <div className='card-body'>

            </div>
        </div>
    )

});

export default Permissions;

Case 1:-情况1:-

In this case, every time permissions are updated to the store, the permissions component rerenders.在这种情况下,每次更新存储的权限时,权限组件都会重新呈现。

import * as React from "react";
import {Route, RouteComponentProps, Switch} from "react-router-dom";
import Loadable from "react-loadable";

import Loader from "../common/Loader";

interface Props extends RouteComponentProps {}

const Auth: React.FC<Props> = React.memo((props) => {

    const Permissions = Loadable({
        loader: () => import('./permissions'),
        loading: Loader
    });

    const Roles = Loadable({
        loader: () => import('./roles'),
        loading: Loader
    });

    return (
        <div>
            <Switch>
                <Route path={`${props.match.url}/permissions`} render={(props) => <Permissions {...props} />} />
                <Route path={`${props.match.url}/roles`} render={(props) => <Roles {...props} />} />
            </Switch>
        </div>
    )

});

export default Auth;

Case 2案例二

This works as expected, the permissions component renders only ones.这按预期工作,权限组件仅呈现那些。

import * as React from "react";
import {Route, RouteComponentProps, Switch} from "react-router-dom";
import Loadable from "react-loadable";

import Loader from "../common/Loader";

interface Props extends RouteComponentProps {}

const Permissions = Loadable({
    loader: () => import('./permissions'),
    loading: Loader
});

const Roles = Loadable({
    loader: () => import('./roles'),
    loading: Loader
});

const Auth: React.FC<Props> = React.memo((props) => {

    return (
        <div>
            <Switch>
                <Route path={`${props.match.url}/permissions`} render={(props) => <Permissions {...props} />} />
                <Route path={`${props.match.url}/roles`} render={(props) => <Roles {...props} />} />
            </Switch>
        </div>
    )

});

export default Auth;

Have a look here: Functions in stateless components?看看这里: 无状态组件中的函数?

Case 1情况1

Every time Auth gets re-rendered, Permissions gets re-defined.每次重新渲染Auth时,都会重新定义Permissions Thus, it will render again, too.因此,它也会再次渲染。

Case 2案例二

Permissions gets only defined once. Permissions只定义一次。 Thus it will not re-render unnecessarily.因此它不会不必要地重新渲染。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 为什么在这两种情况下,underscore.reduce的行为有所不同? - Why does underscore.reduce acts differently in these two cases? 在有条件的情况下使用“ 0”时,为什么在React中渲染“ 0”? - When using `0` in a conditional why does the `0` render in React? 使用 react、redux 和 immer 更新状态时,组件不会重新渲染 - Component does not re-render when State is updated using react, redux and immer 当不相关的状态更改时,为什么我的redux容器会呈现? - Why does my redux container render when unrelated state changes? 使用 redux 和 react 时渲染条件 jsx 的正确方法是什么 - What is correct way to render conditional jsx when using redux with react 为什么JSFiddle以不同的方式呈现我的代码? - Why does JSFiddle render my code differently? 为什么使用$ .deferred和$ .ajax时jQuery.then()的行为不同 - Why does jQuery.then() behave differently when using $.deferred and $.ajax 为什么在@ angular / redux-store中使用@select时,Angular Guard的行为会有所不同 - Why do Angular guards behave differently when using @select from @angular/redux-store 为什么我的组件在使用 React 的 Context API 和 useEffect 钩子时渲染了两次? - Why does my component render twice when using React's Context API and the useEffect hook? 如何使用 React 动态渲染图标 Redux - How to render a icon dynamically using React Redux
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM