我正在研究数据表组件的render方法,其中我必须过滤一些标头。
我有这个:
<TableRow>
{headers.map(header =>
checkboxes.map(checkbox =>
// HERE I NEED TO FILTER IT
checkbox.value === header.key && checkbox.checked && (
<TableHeader {...getHeaderProps({ header })}>
{header.header}
</TableHeader>
),
),
)}
</TableRow>
您在上面看到的checkbox.checked
返回true
或false
,我需要2个键来忽略这些条件。是否满足条件都没关系。
在这里,我正在检查checkbox
和header
的值是否是相同的checkbox.value === header.key
,但是我需要排除2个header.key
和{ {1}}。
所以我需要做类似的事情:
header.key === device
我的意思是,我在上面的代码中提到的那两个标头永远都不应从UI中隐藏。满足此条件header.key === ticketNumber
时,它将用 <TableRow>
{headers.map(header =>
checkboxes.map(checkbox =>
// HERE I NEED TO FILTER IT
checkbox.value === header.key && checkbox.checked && (ignore header.key === 'device' && header.key === 'ticketNumber' from the conditionals above) (
<TableHeader {...getHeaderProps({ header })}>
{header.header}
</TableHeader>
),
),
)}
</TableRow>
隐藏所有标题,但我需要一个适当的条件/函数来忽略标题键checkbox.value === header.key && checkbox.checked
和checkbox.checked === true
。这2个标头应始终存在于UI中。
我正在使用lodash,我不知道是否可以在其中使用它或是否有其他选择?
答案 0 :(得分:3)
如果我正确理解了您的要求,我认为这应该可行:
<TableRow>
{headers.map(header =>
(['device', 'ticketNumber'].includes(header.key) || checkboxes.find(checkbox => header.key === checkbox.value).checked) &&
<TableHeader {...getHeaderProps({ header })}>
{header.header}
</TableHeader>
)}
</TableRow>
答案 1 :(得分:1)
您可以在组件外部创建一个简单的shouldShow()
方法。该方法应包括您的条件,并返回一个布尔值。
由于您有3个复选框,并且只想显示相关的列,所以当选中其中一个时,您应该删除第二个地图,并使用Array.some()
检查其中至少一个是checked
,并且value
与密钥相同value
。
注意:您不需要实际过滤数组,因为react在渲染中会忽略false
的值(请参见conditional rendering)。它还会忽略undefined
和null
。
const shouldShow = ({ key }, checkboxes) =>
key === 'device' ||
key === 'ticketNumber' ||
checkboxes.some(({ checked, value }) => checked && value === key);
<TableRow>
{headers.map(header =>
shouldShow(header, checkboxes) && (
<TableHeader {...getHeaderProps({ header })}>
{header.header}
</TableHeader>
),
)}
</TableRow>
更好的解决方案是使用Array.reduce()
创建一组检查键,然后在渲染列时检查其中是否存在该键:
// in the render method
const shouldRenderSet = checkboxes.reduce((r, { checked, value }) =>
checked ? r.add(value) : r
, new Set(['device', 'ticketNumber']))
<TableRow>
{headers.map(header =>
shouldRenderSet.has(header.key) && (
<TableHeader {...getHeaderProps({ header })}>
{header.header}
</TableHeader>
),
)}
</TableRow>