javascript - react 动态 tabindex 创建

标签 javascript html reactjs tabindex

我正在寻找一种方法来为我的 React 应用程序中的每个元素动态创建 tabindex。有多个组件包含我想为其创建 tabindex 的输入元素,但我不确定如何协调它们并避免冲突。

我的 React 应用程序由包含输入元素的多个表组成。在运行时,用户可以通过创建额外的输入元素来扩展表格。我想改变用户通过这些输入进行制表的方向,但我不确定如何为每个元素生成 tabindex

到目前为止我想到的方法:

  • 每个表都有一个固定的偏移量(但我不知道单个表中可能有多少输入,tabindex 应该保持在 32767 以下,所以我不能假设巨大的差距)
  • tabindex 偏移量传递给表,并从 React 对象中获取已用 tabindex 的数量以计算下一个偏移量(在我看来这会破坏模块化并且难以实现)
  • 通过全局状态跟踪下一个 tabindex(hacky,当表扩展时可能会中断)
  • 通过dom树跟踪下一个tabindex(不知道如何实现)

我缺少创建tabindex 的工具或常见做法吗?

最佳答案

我不知道你是否已经想通了这一点。但是您可以在这里使用一个技巧。

您不需要为表格中的每个单元格设置不同的 tabindex 来制作您想要的选项卡导航。您只需要为表中的每一列使用不同的 tabindex。您可以为同一列中的每个单元格重复相同的 tabindex。因为当 tabindex 相同时,浏览器只是使用 HTML 元素顺序来决定下一个控件,这就是我们在这种情况下所需要的。所以 tabindex 表的赋值将是这样的。

1   2   3   4
1   2   3   4
1   2   3   4
1   2   3   4

这是一次意义重大的胜利。因为对于 10X10 的表,我们不需要 100 个不同的选项卡索引。我们只需 10 个索引即可完成。

这是一个用 React 演示这个想法的小例子。你可以运行它看看。

// Table
class Table extends React.Component {

  generateRows(){
    const offset = this.props.tabIndexOffSet;
    const cols = this.props.cols;
    const data = this.props.data;

    return data.map(function(item) {
        const cells = cols.map(function(colData, index) {
          return (
            <td key={colData.key}>
              <input type="text"
               value={item[colData.key]}
               tabIndex={offset+index} />
            </td>
          );
        });
        return (<tr key={item.id}> {cells} </tr>);
    });
   }

  generateHeaders() {
    var cols = this.props.cols;
    return (
      <tr>
        {
          cols.map(function(colData) {
            return <th key={colData.key}> {colData.label} </th>;
          })
        }
      </tr>
    );
  }

  render(){
    const headerComponents = this.generateHeaders();
    const rowComponents = this.generateRows();;

    return (
      <table>
          <thead> {headerComponents} </thead>
          <tbody> {rowComponents} </tbody>
      </table>
    );
  }
}

// App
class App extends React.Component{

  constructor(){
    super();
    this.state = { 
      cols: [
          { key: 'firstName', label: 'First Name' },
          { key: 'lastName', label: 'Last Name' }
      ],
      data: [
          { id: 1, firstName: 'John', lastName: 'Doe' },
          { id: 2, firstName: 'Clark', lastName: 'Kent' },
          { id: 3, firstName: 'Tim', lastName: 'Walker' },
          { id: 4, firstName: 'James', lastName: 'Bond' }
      ]
    }
  }
  
  render () {
    return (
      <div>
        <Table
          tabIndexOffSet={1}
          cols={this.state.cols}
          data={this.state.data}/>
        <Table
          tabIndexOffSet={3}
          cols={this.state.cols}
          data={this.state.data}/>
      </div>
    );
  }
}


// Render
ReactDOM.render(
  <App/>,
  document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="container"></div>

如果使用这种方法可以管理列数,我建议您使用第一个选项,为每个表分配不同的偏移量(也在上面的示例中说明)。如果列数是固定的,那么它将是简单的。即使不是,您也可以尝试根据您的用例使用固定的硬编码偏移量来保持一些合理的差距。

如果这样不起作用,接下来您可以尝试根据数据计算偏移值。我假设您将拥有由该表表示的某种数据,例如对象数组或数组数组,可能处于您的应用程序状态。因此,您可以根据这些数据得出表格的偏移量。如果您正在使用像 Redux 这样的状态管理库,那将非常简单,我建议您查看 reselect可用于计算 Redux 中的派生状态。

希望这对您有所帮助!

关于javascript - react 动态 tabindex 创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44107052/

相关文章:

javascript - 第一个使用 querySelectorAll 的待办事项列表

javascript - 如何将 JWPlayer 从 5.10 版本升级到 7

html - 如何将内容包含在 anchor 标记中并进行验证?

javascript - 当焦点位于输入字段时,为什么 React 中的日期选择器会闪烁?

reactjs - React Native Redux 不更新组件

javascript - #REACT 将 JSX.Element 转换为 HTMLElement

javascript - 是否有与 Java 的 deepToString() 等效的 JavaScript?

javascript - 在图表之间切换

javascript - 提交表单数据而不刷新整个页面

javascript - 使用纯 JS 或 jQuery 使用 Alt-Tab 检测浏览器页面窗口何时失去焦点