Rumah > Soal Jawab > teks badan
P粉4410764052023-08-31 15:23:23
Boleh guna Redux
.
openAllAccordions
, gelung melalui ID, dan tetapkan akordion kepunyaan ID itu kepada open=truecloseAllAccordions
, gelung melalui ID, dan tetapkan akordion kepunyaan ID itu kepada open=falseP粉8091101292023-08-31 12:37:09
Dalam koleksi contoh komponen yang lebih kurang sewenang-wenangnya, adalah perkara biasa untuk memerlukan penyelarasan. Satu pendekatan yang saya gunakan dengan jayanya ialah mencipta Konteks dengan cangkuk berkaitan yang komponen boleh didaftarkan. Cangkuk ini mengembalikan pandangan keadaan kongsi dan fungsi yang mengubah suai keadaan itu agar sesuai dengan keperluan anda.
Di sini anda boleh mencipta Konteks yang menyimpan opener
函数并提供openAll
/closeAll
fungsi untuk setiap komponen yang didaftarkan:
const AccordionProvider = ({ children }) => { const [openers] = useState(new Set()); // 当创建时,是否应该展开新的可折叠项? //(支持递归展开是必要的) const [defaultOpen, setDefaultOpen] = useState(false); const register = useCallback( (opener) => { openers.add(opener); return () => openers.delete(opener); // 返回一个用于`useEffect`的取消注册函数 }, [openers] ); const openAll = useCallback(() => { setDefaultOpen(true); openers.forEach(opener => opener(true)), }, [setDefaultOpen, openers]); const closeAll = useCallback(() => { setDefaultOpen(false); openers.forEach(opener => opener(false)), }, [setDefaultOpen, openers]); return ( <AccordionContext.Provider value={{ register, openAll, closeAll, defaultOpen }} children={children} /> ); };
...Terdapat juga cangkuk yang dipanggil oleh setiap komponen kanak-kanak untuk mendaftar dengan konteks dan mengembalikan nilai toggle
/open
yang biasa:
const useAccordionAsClient = () => { const { register, defaultOpen } = useContext(AccordionContext); const [open, opener] = useState(defaultOpen); const toggle = useCallback(() => opener((open) => !open), [opener]); useEffect(() => register(opener), [register, opener]); return { toggle, open }; };
Terdapat juga cangkuk berasingan untuk melakukan operasi kelompok yang juga berguna:
const useAccordionAsManager = () => { const { openAll, closeAll } = useContext(AccordionContext); return { openAll, closeAll }; };
Sila ambil perhatian bahawa untuk kesederhanaan, fungsi opener
(又名setOpen
) yang berasingan digunakan di sini sebagai pengecam unik untuk setiap komponen yang didaftarkan. Alternatif yang fleksibel ialah menggunakan pengecam lain, supaya anda boleh membuka/menutup akordion sewenang-wenangnya semasa navigasi dsb.