reactjs - 作为响应策略在材料 ui 的手风琴和选项卡之间切换的最佳方式?
问题描述
我想在手风琴和选项卡之间切换,具体取决于使用材料 UI 反应实现 (MUI) 的屏幕宽度。这可能吗?文档似乎没有涵盖这个用例,但我认为它会很常见。
我目前正在这样做,它在手风琴中很好地呈现了来自我的 CMS 的 editorJs 内容块,但不知道当屏幕宽度 > 768 时如何让它进入选项卡布局。
任何帮助表示赞赏。
<Accordion>
{data.listAccordions.data.length > 0
? data.listAccordions.data
.sort((a, b) =>
parseInt(a.priority) < parseInt(b.priority) ? 1 : -1
)
.map((accordionItem, index) => {
return (
<AccordionItem
title={accordionItem.heading}
icon={<EmptyIcon />}
key={index}
>
<div>
<EditorRendererProvider
data={{ blocks: accordionItem.content }}
/>
</div>
</AccordionItem>
);
})
: null}
</Accordion>
解决方案
您基本上使用两个单独的组件;一个用于低于断点,一个用于高于断点。还有一个媒体查询钩子;网上有很多。
const isLargeScreen = useMedia('(min-width: 768px)');
return isLargeScreen ? <Tabs items={myItems} /> : <Accordion items={myItems} />;
这是您可以使用的一种钩子实现:
import { useState, useEffect } from 'react';
export const useMedia = (query: any) => {
const [matches, setMatches] = useState(window.matchMedia(query).matches);
useEffect(() => {
const media = window.matchMedia(query);
if (media.matches !== matches) setMatches(media.matches);
const listener = () => setMatches(media.matches);
media.addListener(listener);
return () => media.removeListener(listener);
}, [matches, query]);
return matches;
};
推荐阅读
- angular - 无法使用 angular-azure-blob-service 生成“sas”令牌
- java - 是否可以浅拷贝单例类对象?
- django - Django:更新/编辑填充表单和表单集
- python - Keras - TensorBoard 不保存日志文件
- google-apps-script - 每次使用 onedit 触发器时,Google App 脚本都不会触发
- c++ - 使用 R_tryEval 调用 ggplot 的问题
- wordpress - 具有新术语的自定义帖子类型未显示在存档中
- fortran - 未解析的符号 vec_add_
- c# - 具有 .NET 标准库的现有 MVC Web 应用程序,IDE 错误
- facebook - Facebook 要求我验证我的商家,但我不是商家