使用箭头键导航 Material-ui 列表

2024-04-22

我正在使用material-ui 来制作电子应用程序。有些屏幕是主从结构,我使用列表来显示概述。我希望能够使用箭头键浏览此列表。有内置选项可以执行此操作吗?

如果它不是内置的,那么最好的方法是什么?

Update:我现在制作了自己的组件。不确定这是否是最好的解决方案,但似乎有效:

export default function NavigateList(props) {
    const { children, data, ...other } = props;
    const elements = data.map((val, i) => children(val, i));

    function gotoPrevElement() {
        const selected = elements.findIndex(e => e.props.selected);
        if (selected > 0) {
            const el = elements[selected - 1];
            el.props.onClick(data[selected - 1]);
        }
    }
    function gotoNextElement() {
        const selected = elements.findIndex(e => e.props.selected);
        if (selected > -1 && selected < elements.length - 1) {
            const el = elements[selected + 1];
            el.props.onClick(data[selected + 1]);
        }
    }

    function handleKey(e) {
        if (e.key === "ArrowDown") {
            gotoNextElement();
        }
        if (e.key === "ArrowUp") {
            gotoPrevElement();
        }
    }

    return (
        <List onKeyDown={handleKey} {...other}>
            {elements}
        </List>
    );
}

以下是如何使用它的示例:

<NavigateList data={people}>
    {(p, i) => (
        <ListItem
            button
            key={i}
            selected={checkIfSelected(p)}
            onClick={e => setSelected(p)}
        >
            <ListItemText
                primary={p.primary}
                secondary={p.secondary}
            />
        </ListItem>
    )}
</NavigateList>

你可以使用List https://material-ui.com/demos/lists/对于主接口和Card https://material-ui.com/demos/cards/对于详细信息界面。

您的父组件将处理List从主界面更改选择并负责将正确的详细数据发送到Card.

以下是使用 Material-UI 组件时此结构的外观示例:

class ParentComponent extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            currentDetailIndex: 0,
            numOfListItems: 10,
            detailData: [
                {...},
                {...},
                ...
            ]
        };
    }

    changeDetailIndex = (newIndex) => {
        this.setState({ currentDetailIndex: newIndex });
    }

    moveUp = () => {
        if (this.state.currentDetailIndex > 0) {
            this.setState({ currentDetailIndex: this.state.currentDetailIndex - 1 });
        }
    }

    moveDown = () => {
        if (this.state.currentDetailIndex < this.state.numOfListItems - 1) {
            this.setState({ currentDetailIndex: this.state.currentDetailIndex + 1 });
        }
    }

    onKeyPressed = (e) => {
        if (e.keyCode == '38') {
            // up arrow
            this.moveUp();
        }
        else if (e.keyCode == '40') {
            // down arrow
            this.moveDown();
        }
    }

    render() {
        return (
            <div>
                <List component="nav" onKeyDown={this.onKeyPressed}>
                    <ListItem onClick={() => { this.changeDetailIndex(someIndex); }}>'s... 
                </List>
                <Card>
                    <CardContent>
                        <SomeDetailComponent data={this.state.detailData[this.state.currentDetailIndex]} />
                    </CardContent>
                </Card>
            </div>
        );
    };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用箭头键导航 Material-ui 列表 的相关文章

随机推荐

  • Android 博客应用程序,我应该使用 Sharedpreferences 还是 Intents?

    我正在构建一个android应用程序 当前用户的后续页面是可点击的 我保存点击的页面id并将其传递给打开相应的页面 打开后 用户可以查看关注者列表 页面内的帖子等 这是包含所有页面子级的根节点 数据库 Firebase 结构 pageDat
  • GO Websocket 向所有客户端发送消息

    这段代码一切正常 为了更好的阅读而缩短了它 When Client1向服务器发送请求 服务器立即响应他 但是 其他客户端看不到响应消息 所以我想更进一步 当客户端向服务器发送请求时 服务器会响应所有客户端 以便所有客户端都可以看到该消息 我
  • 尝试在Python中将wav文件转换为文本时出现wave.Error:known format:3

    我需要从麦克风录制音频并将其转换为文本 我已经使用从网上下载的几个音频剪辑尝试了此转换过程 效果很好 但是 当我尝试转换从麦克风录制的音频剪辑时 出现以下错误 回溯 最近一次调用最后一次 文件 C Users HP AppData Loca
  • Angular2 CanActivate 除一条路线之外的所有路线的守卫

    我知道我们可以将位于一个模块中的路线分组 像那样 canActivate AuthGuard children path children path crises component ManageCrisesComponent path h
  • 如何防止 java.lang.NumberFormatException: 对于输入字符串:“N/A”?

    在运行我的代码时 我得到了NumberFormatException java lang NumberFormatException For input string N A at java lang NumberFormatExcepti
  • 将统计数据整理成时间块

    我正在尝试为MySQL 制定一条SQL 语句 我有一系列服务器的一系列统计数据 每半小时报告一次 我有一个统计表 其中的列与此类似 server varchar 64 time datetime bytesIn int bytesOut i
  • 在领域表中选择随机行

    我想从领域表中选择一个随机行 就像是 SELECT FROM table ORDER BY RANDOM LIMIT 1 像这样的事情就可以了 是吗 Random random new Random RealmResults
  • 使用底图扭曲图像保持透明度

    我有一张 RGBA png 地图 所有海洋都是透明的 我想在北极立体投影中使用底图 并使用带有扭曲图像的地图 当我想保留透明度时 透明度会丢失并被黑色取代 我能做些什么 我的最终目标是在海洋中绘制颜色网格 然后在其上方绘制透明地图 from
  • 如何在 SwiftUI TextField 中将文本加粗?

    从 Xcode 11 2 1 开始 SwiftUI 中的文本字段没有内置的字体粗细修饰符 我们如何在不将 UITextField 扩展为 UIViewRepresentable 的情况下引入 font weight 使用与 SwiftUI
  • package-lock.json 中的 `"dev" true` 是做什么用的?

    什么是 dev true意味着在package lock json file 就我而言 当我执行时它会自动更新npm运营 我们怎样才能去除它呢 所以回答你的第一个问题 dev true in package lock json意味着这个依赖
  • Qt、QML 和 Windows 8 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直对Qt框架引入的QML很好奇 但从未有机会使用它 但现在随着 Windows 8 的到来 基于旧式小部件的界面将变得过时 只是我
  • Tkinter:在主循环中调用事件

    如何调用 tkinterevent来自一个单独的对象 我正在寻找类似 wxWidgets 的东西wx CallAfter 例如 如果我创建一个对象 并将我的对象传递给它Tkroot 实例 然后尝试从我的对象调用该根窗口的方法 我的应用程序锁
  • Rest API 和 Restful Web 服务之间的区别

    我是网络服务新手 有人可以帮助我理解 REST API 和 java 中的 Restful Web 服务之间的区别吗 我开发了一个仅基于 servlet 和 jsp 的 Web 应用程序 现在必须使用 REST API 开发相同的应用程序
  • 使用Prepared Statement,如何返回插入行的id?

    我想检索数据库中插入行的 ID 但我不知道该怎么做 我尝试使用 SQL 子句返回RETURNING id 但不起作用 插入行后如何返回id 拨打电话后execute 准备语句上的方法 插入行的 id 将在insert id属性 pstm g
  • 通过管道从子shell获取退出代码

    我怎样才能获得退出代码wget来自子shell进程 所以 主要问题是 等于0 哪里可以 8成立 gt OUT wget q http budueba com net tee a file txt echo 0 它的工作原理无需tee 实际上
  • 编译错误:无法打开模块文件

    我有这个代码 PROGRAM xfit driver for routine fit USE nrtype USE nrutil USE nr USE ran state ONLY ran seed IMPLICIT NONE INTEGE
  • Android AlarmManager 与 Handler 的不同情况

    有人可以通过示例向我解释使用 AlarmManager 与 Handler 的不同情况吗 使用这两者交替使用有什么缺点吗 Thanks 他们彼此之间没有什么关系 我假设你指的是使用类似的东西postDelayed on Handler用于轮
  • 如何从Python中列表的字典中的值生成所有组合

    我想生成在字典中索引的列表中的所有值组合 A D E B F G H C I J 每次 每个字典条目的一项都会被选择并与其他键中的项目组合 所以我有 D F I D F J D G I D G J D H I E H J 我知道有一些东西可
  • Unity静态工厂扩展

    我似乎无法在任何地方找到 Microsoft Practices Unity StaticFactory dll 还有其他注册静态工厂的方法吗 寻找类似的东西 容器 RegisterFactory gt FooFactory CreateF
  • 使用箭头键导航 Material-ui 列表

    我正在使用material ui 来制作电子应用程序 有些屏幕是主从结构 我使用列表来显示概述 我希望能够使用箭头键浏览此列表 有内置选项可以执行此操作吗 如果它不是内置的 那么最好的方法是什么 Update 我现在制作了自己的组件 不确定