-1

I am checking to see if isFetchingData then don't render yet but its not re-rendering once isFetchingData is set to false. I have the useEffect in the context and i would hope that would re-render once isFetchingData is set to false. Any ideas?

When I refresh the page it renders with the data. So I think its to do with re-rendering.

I am using react context to get the data and exposing functions to filter that data and get me what i need.

Context:

import React, { useEffect, useState } from 'react';
import getAllEmployees from 'my-services/employee/getAllEmployees';
import { arrayOf, node, oneOfType } from 'prop-types';

export const EmployeeContext = React.createContext({
    allEmployees: [],
    getActiveEmployees: () => [],
    getTerminatedEmployees: () => []
});

const EmployeesProvider = ({ children }) => {
    const [isFetchingData, setIsFetchingData] = useState(true);
    const [allEmployees, setAllEmployees] = useState({});

    useEffect(() => {
        getAllEmployees().then(
            //doing something
        ).then(employees => {
            setAllEmployees(employees);
            setIsFetchingData(false);
        });
    }, [isFetchingData])


    const context = {
        isFetchingData,
        allEmployees,
        getActiveEmployees: () =>
            allEmployees.filter(x => x.status === 'Current'),

        getTerminatedEmployees: () =>
            allEmployees.filter(x => x.status === 'Terminated')
    };

    return (
        <EmployeeContext.Provider value={context}>{children}</EmployeeContext.Provider>
    );
};

EmployeesProvider.propTypes = {
    children: oneOfType([node, arrayOf(node)])
};
EmployeesProvider.defaultProps = {
    children: undefined
};

export default EmployeesProvider;

Component:

import React, { useContext } from 'react';
import styled from 'styled-components';
import { EmployeeContext } from 'my-contexts/EmployeeContext';
import EmployeeCard from '../../../components/EmployeeCard';


const EmployeesTab = () => {

    const {
        getActiveEmployees,
        getTerminatedEmployees,
        isFetchingData
    } = useContext(EmployeeContext);

    let activeEmployees = [];
    let terminatedEmployees = [];

    if (!isFetchingData) { 
        activeEmployees = getActiveEmployees(); 
        terminatedEmployees = getTerminatedEmployees();
    }

    if(isFetchingData) {
        return <p>Loading</p>;
    }

    return (
        <Outer>
            <TopHeader>
                <H3>Employees ({activeEmployees.length})</H3>
            </TopHeader>

            <Wrapper>
                {activeEmployees.map(employee => {
                    return (
                        <EmployeeCard
                            id={employee.id}
                            guid={employee.guid}
                            firstName={employee.name.first}
                            lastName={employee.name.last}
                            jobTitle={employee.jobTitle}
                        />
                    );
                })}
            </Wrapper>

            <H3>Terminated employees({terminatedEmployees.length})</H3>
            <Wrapper>
                {terminatedEmployees.map(employee => {
                    return (
                        <EmployeeCard
                            id={employee.id}
                            guid={employee.guid}
                            firstName={employee.name.first}
                            lastName={employee.name.last}
                            jobTitle={employee.jobTitle}
                        />
                    );
                })}
            </Wrapper>
        </Outer>
    );
};

export default EmployeesTab;

coding1223322
  • 321
  • 4
  • 19

1 Answers1

0

I think many problems may exist.
At first, please check whether whole component is closed by context Provider.
For example

<EmployeesProvider>
  <EmployeesTab/>
<EmployeesProvider/>

Please check this problem.
FastDev
  • 59
  • 7