【发布时间】:2019-05-28 04:31:34
【问题描述】:
我正在尝试开发一个通用过滤器组件,它可以有许多字段来过滤类似颜色, 尺寸、价格范围等,每个字段可能有不同类型的元素,如颜色可能有 复选框、单选按钮和价格范围可能有输入元素、下拉菜单等。为了支持这种多样化 在这种情况下,我尝试使用这种模式,但在这里我必须多次迭代相同的东西。
我不确定这个数据结构。如果有人有建议,请帮助我改进此代码,但是 这里的主要问题是“多次迭代”。我该如何改进这段代码?
const filterParams = {
field: {
id : 1, label : 'Field', content: <FieldFilter />
},
employee: {
id : 1, label : 'Employee', content: <Employee />
}
}
<Filter filterParams={filterParams} activeFilterParam="field" />
const Filter = ({ filterParams, activeFilterParam }) => {
const [show, setShow]=useState(false)
return (
<>
<Button secondary icon={filter} onClick={() => setShow(!show)}>Filter</Button>
{show && (
<Card style={{ marginTop: 10 }}>
<Card.Content>
<Tabs activeTab={activeFilterParam}>
<Tabs.List
render={() => {
return (
Object.keys(filterParams).map(filterParam => {
return (
<Tabs.Tab key={filterParam} id={filterParam}>{filterParams[filterParam].label}</Tabs.Tab>
)
}))
}} />
<Tabs.Panels>
{Object.keys(filterParams).map(filterParam => {
return (
<Tabs.Panel key={filterParam} panelId={filterParam}>{filterParams[filterParam].content}</Tabs.Panel>
)
})}
</Tabs.Panels>
</Tabs>
</Card.Content>
<Card.Footer>
<Button>
<Button.Content style={{ marginRight: 10 }}>Save</Button.Content>
<Button.Content secondary onClick={()=>setShow(!show)}>Cancel</Button.Content>
</Button>
</Card.Footer>
</Card>
)}
</>
)
}
【问题讨论】:
-
有点丑,但我真的看不出有什么问题。
-
你能指出丑陋的部分吗?如果您对我可以改进的地方有任何建议,请给我建议。
-
你所说的“多次迭代”是指组件映射吗?我同意@FrankerZ。我认为,如果您看到重新渲染这些过滤器的性能问题(如果您有大量过滤器),那么使用记忆化可能会有所帮助。将
Filter组件的导出包装在 react 的 memo HOC 中并传递自定义的 propsEqual 函数,或者分解并使用useMemo挂钩来计算Tabs.Tab和Tabs.Panel组件数组。
标签: javascript reactjs code-reuse