javascript - 如何处理 onKeyDown/Up 在 React 中打开列表项

标签 javascript reactjs

我有一个体育新闻列表,当用户单击文档时 --> 文档会在“右 slider ”中打开。

需要实现当用户单击文档时,他应该能够通过按 onKeyDownonKeyUp 打开文档下方和上方的文档。

这是打开一个文档时新闻列表的外观:

enter image description here

现在,当文档打开时,如果用户单击onKeyDown 打开/选择下一个文档。

不知道如何使 onKeyDown 在这种情况下起作用。

这是一个文档组件:

const NewsItem = ({
  cover_image,
  title,
  body,
  publishing_date,
  author_name,
  topics,
  handleClick,
  isFullDocViewActive,
  isRowGridActive,
  hideText,
  style,
  className,
  id,
  type,
  isSliderView,
  newsTextCssClass,
  paragraphTextCssClass,
  permalink,
  isUnreadDoc,
  t
}) => (
  <Context.Consumer>
    {({ language }) => {
      const topicNames = topics.map((topic) => topic.name[language]);
      return (
        <div
          style={style}
          className={`${className || ''} ${
            isRowGridActive ? 'news-row-grid' : 'news-column-grid'
          } ${isUnreadDoc ? 'selected-doc' : ''}`}
          onKeyDown={(e) => {
            console.warn('on Click down', e.key);
          }}
        >
          <div className={isFullDocViewActive || isSliderView ? 'border-none' : 'border-bottom'}>
            <div className="card-labels">
              <div className="text-labels">
                {getLabelStatus(publishing_date, t)}
                {topicNames.length ? (
                  <span className="trending-label">
                    <span className="trending-icon">
                      <i className="material-icons md-19 trending-icon">trending_up</i>
                    </span>
                    <span className="topics-label" title={topicNames.join(', ')}>
                      {topicNames[0]}
                    </span>
                  </span>
                ) : (
                  ''
                )}
              </div>
              <div className="btn-icons">
                <a className="icon-btn" onClick={() => toClipboard(body[language])} role="button">
                  <i className="material-icons md-20">file_copy</i>
                </a>
                <a href={permalink} rel="noopener noreferrer" target="_blank" className="icon-btn">
                  <i className="material-icons md-21">open_in_new</i>
                </a>
              </div>
            </div>
            <div
              className="card-content-wrapper"
              role="button"
              onClick={() => handleClick && handleClick(id)}
            >
              <div className="card-content">
                <div className="card-image" style={getBackgroundImage(cover_image)} />
                <div className="card-title-section">
                  <p>
                    <span className="card-news-date">
                      {new Date(publishing_date).toLocaleDateString('ch')}
                    </span>
                    <span className="card-grey-text">
                      {type} - {author_name}
                    </span>
                  </p>
                  <p className="card-news-title" id={id}>
                    {title[language] || body[language]}
                  </p>
                </div>
              </div>
              {!hideText ? (
                <div className={newsTextCssClass || 'card-news-text'}>
                  <p className={paragraphTextCssClass}>{body[language]}</p>
                </div>
              ) : (
                ''
              )}
            </div>
          </div>
        </div>
      );
    }}
  </Context.Consumer>
);

最佳答案

假设父组件同时包含文档列表和抽屉,您可以在安装时将 keyDown 事件绑定(bind)到 document (并在卸载时取消绑定(bind)):

import React, { useEffect } from React

const parentComponent = () => {
  useEffect(() => {
    document.addEventListener('keydown', (e) => {
      handleKeyDown(e)
    })
    return (() => {
      document.removeEventListener('keydown', handleKeyDown)
    })
  })
}

然后在handleKeyDown函数中增加或减少所选文档(抽屉中的文档)的索引。并将其传递给 drawer 组件

关于javascript - 如何处理 onKeyDown/Up 在 React 中打开列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58854480/

相关文章:

javascript - 如何仅在收到 props 时渲染 React(使用 Redux)组件?

javascript - 无法读取未定义的属性 'getRequest' - 继电器

javascript - Fondation 4 通过顶部栏导航不渲染下拉菜单

javascript - 正则表达式匹配以 "/"结尾的子组

javascript - React 组件的状态在 render 中的值与 setState 中的值不同

reactjs - 开 Jest Jenkins 报道

javascript - 使用 mongoose 和 Promise.all 更新子文档

javascript - 使用导出类时在 Eclipse 中折叠方法

javascript - 在表中动态插入新行

javascript - 动态加载 javascript 文件时延迟函数调用