构建可重用、可链接的过滤器组件的最“react”方式是什么?
假设我有一个输入数组:
[
{name: 'Generic t-shirt', size: 'xxl', available: 35},
{name: 'Generic t-shirt', size: 'md', available: 2},
{name: 'Generic t-shirt', size: 'sm', available: 5},
{name: 'Really awesome shirt', size: 'md', available: 0}
]
以及名称的关键字搜索、大小的下拉菜单以及可用性的“售罄”布尔复选框。
现在,我在渲染循环中有过滤代码:
const [productsFilteredByFullText, setProductsFilteredByFullText] = useState;
const [productsFilteredBySize, setProductsFilteredBySize] = useState;
const [productsFilteredByAvailability, setProductsFilteredByAvailability] = useState;
const searchResults = useMemo(() => {
let filteredProducts = eventsFromAPI; // array of products as input
filteredProducts = filteredEvents.filter(product => fullTextFilter(product));
filteredProducts = filteredEvents.filter(product => sizeFilter(product));
filteredProducts = filteredEvents.filter(product => availabilityFilter(product));
return filteredProducts;
}, [productsFilteredByFullText, productsFilteredBySize, productsFilteredByAvailability]);
JSX 中的 UI:
<div>
// Fulltext search
<input
type="text"
placeholder="Keyword search"
value={searchTerm}
onChange={fullTextHandler}
/>
// Size dropdown
<Dropdown
options={allAvailableSizes}
onChange={sizeHandler}
/>
// Sold out checkbox
<input
name="soldout"
type="checkbox"
checked={productsFilteredByAvailability}
onChange={availabilityHandler}
/>
<h1>Results</h1>
{filteredProducts.map(item => (
<Product item={item} />
))}
</div>
这有效,但根本不是很可重用。假设我有另一个产品类别,围巾,它们都是一个尺寸,但我仍然希望能够重新使用过滤器组件和逻辑来确定名称和可用性。
有没有办法将过滤器逻辑和表示 JSX module化/组件化为单独的过滤器组件,并能够任意将它们链接在一起?像这样的伪代码:
<TShirtList>
<NameFilter/>
<SizeFilter/>
<AvailabilityFilter/>
</TShirtList>
<ScarfList>
<NameFilter/>
<AvailabilityFilter/>
</ScarfList>
<ServicesList>
<NameFilter/>
</ServicesList>
所以每个过滤器都是它自己的组件,能够插入到任何地方的任何产品阵列中?就像 React 组件如何还提供其他组件可以使用的自己的逻辑/功能(产品数组输入,过滤后的产品数组 + JSX UI 输出,但可链接)。
这是思考这个问题的正确方式吗……?我对如何在架构上最好地构建这个感到困惑。