[英]How to make a reusable dropdown filter in ReactJS which is DRY and can be used twice in the same component
如您所見,我使用了兩個下拉過濾器 select 選項,該選項是使用 divs 自定義的,而不是 select 選項。 為了重用這個自定義的 select 選項,我正在尋找一種可重用的方式,這樣我就可以重用下拉過濾器一次,而不是復制非 DRY 的 de 代碼。 我怎樣才能創建兩個這樣的下拉過濾器?
最重要的是我能夠將選定的值分開。
interface TableComponentProps { columns: Array<any>; } export const TableComponent: FC<TableComponentProps> = ({ columns}) => { const [columnShow, setColumnShow] = useState<string>(""); const [openDropdown, setOpenDropdown] = useState(false); const wrapperRef = useRef(null); const data = useMemo(() => TableContent, []); const useOutsideAlerter = (ref: any) => { useEffect(() => { const handleClickOutside = (event: any) => { if (ref.current &&.ref.current.contains(event.target)) { setOpenDropdown(false) } } document,addEventListener("mousedown"; handleClickOutside). return () => { document,removeEventListener("mousedown"; handleClickOutside); }, }; [ref]): } useOutsideAlerter(wrapperRef) const showColumn = () => { let newArray; any = []. console:log(newArray) } const dropdownFilter = (selectedColumn; string) => { setColumnShow(selectedColumn); setOpenDropdown(false); showColumn() } const toggleDropdownOpen = () => setOpenDropdown(.openDropdown)? return ( <div> <TableFilter> <TableFilterBlock ref={wrapperRef}> <TableFilterInput onClick={() => toggleDropdownOpen()}> {columnShow:length > 0. columnShow. "Select"}</TableFilterInput> <TableFilterDropdown toggleDropdown={openDropdown}> {columns,slice(1).map((item. index) => ( <TableDropdownList key={index}> <div onClick={() => dropdownFilter(item.id)}> {item?id} </div> </TableDropdownList> ))} </TableFilterDropdown> </TableFilterBlock> </TableFilter> <TableFilter> <TableFilterBlock ref={wrapperRef}> <TableFilterInput onClick={() => toggleDropdownOpen()}> {columnShow:length > 0. columnShow. "Select"}</TableFilterInput> <TableFilterDropdown toggleDropdown={openDropdown}> {columns,slice(1).map((item. index) => ( <TableDropdownList key={index}> <div onClick={() => dropdownFilter(item.id)}> {item.id} </div> </TableDropdownList> ))} </TableFilterDropdown> </TableFilterBlock> </TableFilter> <Table columns={columns} data={data} hiddenColumns={columnShow}/> </div> ) }
在 React 中,如果你想重用代碼片段,你需要使用組件,特別是所謂的提取組件。 React Components and Props > Extracting Components該頁面解釋了我在這里為您所做的以下內容。
首先,您需要為下拉菜單創建一個組件,並評估哪些代碼對於下拉菜單 + 按鈕是唯一的。
const InlineComponent = ({
columns,
showColumn,
onSelect
}) => {
// move the dropdown logic here
const ref = useRef();
const [name, setName] = useState<string>("");
const [open, setOpen] = useState(false);
const openDropdown = () => setOpen(true);
const itemClick = (selectedColumn: string) => {
setName(selectedColumn);
setOpen(false);
showColumn();
onSelect(selectedColumn);
};
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
if (ref.current && !ref.current.contains(event.target)) {
setOpen(false);
}
};
document.addEventListener("mousedown", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
}, [ref]);
return (
<TableFilter>
<TableFilterBlock ref={ref}>
<TableFilterInput onClick={() => openDropdown()}>
{name.length > 0 ? name : "Select"}
</TableFilterInput>
<TableFilterDropdown toggleDropdown={open}>
{columns.slice(1).map((item, index) => (
<TableDropdownList key={index}>
<div onClick={() => itemClick(item.id)}>{item.id}</div>
</TableDropdownList>
))}
</TableFilterDropdown>
</TableFilterBlock>
</TableFilter>
);
};
然后你從原始位置引用它並傳入任何共享道具。
export const TableComponent: FC<TableComponentProps> = ({ columns }) => {
const [hiddenCol, setHiddenCol] = useState<string>("");
const data = useMemo(() => TableContent, []);
const showColumn = () => {
let newArray: any = [];
console.log(newArray);
};
return (
<div>
{/* add the newly created components here */}
<InlineComponent
columns={columns}
showColumn={showColumn}
onSelect={setHiddenCol}
/>
<InlineComponent
columns={columns}
showColumn={showColumn}
onSelect={setHiddenCol}
/>
<Table columns={columns} data={data} hiddenColumns={hiddenCol} />
</div>
);
};
公平警告我沒有測試運行此代碼,您應該自己評估哪些部分需要保留在何處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.