You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Admin组件状态变更时重新渲染资源?屏幕尺寸触发失效

解决React Admin屏幕尺寸变化时重新加载资源的问题

首先咱们拆解下问题:你通过Render Prop方式在Admin组件里动态加载资源,想在屏幕尺寸变化时重新执行loadingResources函数,但状态变更后资源没更新。核心问题在于**loadingResources没有响应screenSize的变化,或者Admin组件没感知到screenSize的变更去触发资源重载**。

步骤1:正确维护screenSize状态并传递给Admin

先确保screenSize状态在Admin的父组件(或所在组件)中管理,通过resize事件实时更新:

import { useState, useEffect } from 'react';
import { Admin } from 'react-admin';

const App = () => {
  // 初始化时获取当前屏幕尺寸
  const [screenSize, setScreenSize] = useState(() => 
    window.innerWidth < 768 ? 'small' : 'medium'
  );

  useEffect(() => {
    const handleResize = () => {
      const newSize = window.innerWidth < 768 ? 'small' : 'medium';
      setScreenSize(newSize);
    };

    window.addEventListener('resize', handleResize);
    return () => window.removeEventListener('resize', handleResize);
  }, []);

  return (
    <Admin 
      customReducers={customReducers} 
      dashboard={Dashboard} 
      restClient={restClient} 
      loginPage={CustomLoginPage} 
      authClient={authClient} 
      menu={CustomMenu}
      // 传递动态的screenSize给Admin
      screenSize={screenSize}
    >
      {/* 把screenSize作为参数传入loadingResources,让函数感知尺寸变化 */}
      {({ modules }) => loadingResources(modules, screenSize)}
    </Admin>
  );
};

步骤2:让loadingResources依赖screenSize

修改loadingResources函数,让它接收screenSize作为参数,根据屏幕尺寸动态调整返回的资源数组。这样当screenSize变化时,函数会重新执行,返回新的资源配置:

const loadingResources = (modules, screenSize) => {
  // 根据屏幕尺寸过滤/调整资源
  const adaptedModules = modules.filter(module => {
    // 示例:小屏幕隐藏特定资源
    if (screenSize === 'small' && module.name === 'large-dashboard-only') {
      return false;
    }
    return true;
  });

  // 转换为React Admin的Resource组件数组
  return adaptedModules.map(module => (
    <Resource 
      key={module.id} 
      name={module.name} 
      list={module.listComponent}
      // 其他资源配置...
    />
  ));
};

步骤3:优化resize事件性能(可选)

频繁的resize事件会导致状态频繁更新,建议添加防抖处理:

useEffect(() => {
  let timeoutId;
  const handleResize = () => {
    clearTimeout(timeoutId);
    // 200ms防抖,避免频繁触发状态更新
    timeoutId = setTimeout(() => {
      const newSize = window.innerWidth < 768 ? 'small' : 'medium';
      setScreenSize(newSize);
    }, 200);
  };

  window.addEventListener('resize', handleResize);
  return () => {
    window.removeEventListener('resize', handleResize);
    clearTimeout(timeoutId);
  };
}, []);

这样调整后,屏幕尺寸变化时screenSize状态更新,传递给Admin组件后,Render Prop函数会因依赖变化重新执行loadingResources,返回新的Resource数组,Admin就会自动重新渲染资源了。

内容的提问来源于stack exchange,提问作者Alexander Knyazev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:37:16