javascript - 避免重复的代码并提取此功能

标签 javascript reactjs ecmascript-6

如何更好地避免此处出现重复代码。我尝试使用 diff Prop 渲染 albeRow 两次,但我有 TableCell 渲染的重复代码。

{data.map((item, index) =>
    selectable && !!selected
        ? <TableRow
            hover
            onClick={() => {
                onSelect(selected.includes(index)
                    ? selected.filter(x => x != index)
                    : [...selected, index])}}
            role="checkbox"
            aria-checked={selected.includes(index)}
            tabIndex="-1"
            key={index}
            selected={selected.includes(index)}
            >
            <TableCell checkbox>
                <Checkbox checked={selected.includes(index)}/>
            </TableCell>
            {columns.map(({dataKey, cellRenderer, numeric}, index) =>
                <TableCell key={index} numeric={numeric}>
                    {(cellRenderer || defaultCellRenderer)({item, dataKey})}
                </TableCell>)}
        </TableRow>
        : <TableRow hover key={index}>
            {columns.map(({dataKey, cellRenderer, numeric}, index) =>
                <TableCell key={index} numeric={numeric}>
                    {(cellRenderer || defaultCellRenderer)({item, dataKey})}
                </TableCell>)}
        </TableRow>
)}

最佳答案

据我了解,selectable && !!selected 是处理是否选择行的选项的主要条件。在这种情况下,我会根据我的喜好使用它并将组件渲染为:

import React from 'react'
import { TableRow, TableCell, Checkbox } from 'anything'

export default function YourCompoment({
  columns,
  data,
  selectable,
  selected,
  onSelect,
}) {
  const canSelect = selectable && !!selected

  return (
    <div>
      {data.map((item, index) =>
        <TableRow
          hover
          onClick={canSelect && () => {
            onSelect(
              selected.includes(index)
                ? selected.filter(x => x != index)
                : [...selected, index]
            )
          }}
          role={canSelect ? 'checkbox' : 'anyOtherValue'}
          aria-checked={canSelect && selected.includes(index)}
          tabIndex="-1"
          key={index}
          selected={canSelect && selected.includes(index)}
        >
          {canSelect &&
            <TableCell checkbox>
              <Checkbox checked={selected.includes(index)} />
            </TableCell>}
          {columns.map(({ dataKey, cellRenderer, numeric }, columnIndex) =>
            <TableCell key={columnIndex} numeric={numeric}>
              {(cellRenderer || defaultCellRenderer)({ item, dataKey })}
            </TableCell>
          )}
        </TableRow>
      )}
    </div>
  )
}

关于javascript - 避免重复的代码并提取此功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46033213/

相关文章:

javascript - 出现错误 `Type ' { 主题 : Theme; }' is not assignable to type` when trying to pass it as a prop to App component

javascript - 在 React-Native 中检测和处理慢速互联网连接

javascript - 我如何将此 require 写为 es6 import 语句

javascript - 扩展EventEmitter时如何解析 'this is not defined'?

javascript - jQuery Validate 的奇怪行为

javascript - 键上的 JSONPath/JSONQuery 过滤器

javascript - Google Drive API - 上传音频 blob 以 base64 字符串进行转换 -drive.files.create 方法 - 找不到文件 ID

javascript - 为什么这会返回对全局窗口对象的引用,即使 'this' 在另一个函数中

javascript - ReactJS 中的 session 计时器

javascript - 纯正则表达式解决方案,用于在无法依赖 document.createElement 的环境中从 HTML 字符串获取文本内容?