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

React+Redux+styled-components环境下根据屏幕宽度控制组件可见性并触发指定方法

问题描述

我有一个带筛选功能的Wrapper组件,调用openMobileFilters()方法时组件展示,调用closeMobileFilters()方法时组件隐藏。该组件为全屏展示,我需要在屏幕宽度大于993px时自动执行closeMobileFilters()方法。

openMobileFilters()和closeMobileFilters()会修改控制组件展示状态的对应state。

我的初始代码如下:

const Wrapper = styled.div`
  @media only screen and (min-width: 993px) {
    // 我可以在这里添加closeMobileFilters()方法的调用逻辑吗?
  }
`;

const mapDispatchToProps = (dispatch) => ({
  closeMobileFilters: () => dispatch(closeMobileFiltersAction()),
});

export default connect(null, mapDispatchToProps)(MobileFilters);

我使用的技术栈为React、Redux和styled-components。我知道可以在媒体查询中直接添加display: none;实现隐藏,但我需要触发执行这个方法来更新对应的状态。


已验证的解决方法

我引入了useResizeObserver实现该需求,完整实现代码如下:

  1. 封装监听元素尺寸的自定义hook
import useResizeObserver from "@react-hook/resize-observer";

const useSize = (target) => {
  const [size, setSize] = useState();

  useLayoutEffect(() => {
    setSize(target.current.getBoundingClientRect());
  }, [target]);

  useResizeObserver(target, (entry) => setSize(entry.contentRect));
  return size;
};
  1. 在组件中绑定元素引用并调用方法
const target = useRef(null);
const size = useSize(target);

// 元素宽度为0时触发关闭方法
if (size?.width === 0) {
  closeMobileFilters();
}

return <Wrapper ref={target}>{/* 组件内容 */}</Wrapper>

内容的提问来源于stack exchange,提问作者some nooby questions

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:00:06