React Context API 的 setter 工作得非常慢

我的目标是实现这样的功能,例如根据子链接的展开/折叠来更改页面的背景渐变。为此,我使用了 useContext 钩子,但我注意到即使一切都按预期工作,背景渐变确实发生了变化,但它需要大约 20 秒才能重新呈现折叠/展开的子链接。我只看到一个关于 SO 的问题,但我真的不明白如何解决它。问题是上下文提供者的所有子级都会因为上下文中的状态改变而被重新渲染。 我会上传一个代码和框示例,但我被要求不要上传,所以这里是最可重现的代码片段。我如何使用该功能并防止孩子重新渲染,以便一切运行得更快?请帮助:)

const Wrapper = styled('div')<{linksExpanded : boolean}>`
  background-image: linear-gradient(180deg,pink 0.2%,#FFFFFF 3%);
  background-color: white;
  ${({theme})=>theme.breakpoints.up('md')} {
    background-image: linear-gradient(180deg,pink 1.5%,#FFFFFF 5.5%);
  }
  ${({linksExpanded,theme})=>linksExpanded && `
    background-image: linear-gradient(180deg,pink 2.5%,#FFFFFF 4.25%);
    ${theme.breakpoints.up('md')} {
      background-image: linear-gradient(180deg,pink 6.5%,#FFFFFF 10%);
    }
  `}
`

const Home = () =>
{
  const { linksExpanded } = useContext(HomeDataContext);
  return (
            <Wrapper linksExpanded={linksExpanded}>
              <About />
              <Links />
              <Contacts />
              <Gallery />
            </Wrapper>
  );
};

export default Home;

export const Landing: FC = () => <PageSkeleton
        pageContent={
          <HomeDataContextProvider><Home /></HomeDataContextProvider>}
      />;


const Links = () => {
  const { currentCakes,linksExpanded,setLinksExpanded } = useContext(HomeDataContext);
  const renderLinks = () => (
    <S.List style={{maxHeight: !linksExpanded ? '0px' : '1000px'}}>
      {currentCakes.map((el: CakeDescription,key : number) => (
        <li key={el.name}>
          <a href='https://google.com'>Link</a>
        </li>
      ))}
    </S.List>
  );
  const handleLinksExpand = () => {
    setLinksExpanded(!linksExpanded);
  };
  return (
    <S.Container>
        <S.ExpandableLinkContainer>
          <ExpandableLink
            onClick={handleLinksExpand}
            open={linksExpanded}
            title='Cakes'
          />
        </S.ExpandableLinkContainer>
        {renderLinks()}
    </S.Container>
  );
};
export default Links;

最后的上下文:

export type HomeDataState = {
  currentCakes: Array<CakeDescription>;
  setCurrentCakes?: any;
  linksExpanded: boolean;
  setLinksExpanded?: any;
};

const initialValue: HomeDataState = {
  currentCakes: [],linksExpanded: false,};

export const HomeDataContext = createContext(initialValue as HomeDataState);

export const HomeDataContextProvider: FC = ({ children }) => {
  const [linksExpanded,setLinksExpanded] = useState(initialValue.linksExpanded);
  const [currentCakes,setCurrentCakes] = useState<CakeDescription[]>(initialValue.cakes);
  const fetchCakes = async () => {
    setCurrCakes(
      await myAxiosConstruct.get(process.env.api);
    );
  };
  useEffect(() => {
    fetchCakes();
  },[]);
  
  return (
    <HomeDataContext.Provider
      value={{
        currentCakes,setLinksExpanded,}}
    >
      {children}
    </HomeDataContext.Provider>
  );
};
c274667915 回答:React Context API 的 setter 工作得非常慢

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/17475.html

大家都在问