Bagaimanakah saya boleh menetapkan butang untuk menghidupkan dan mematikan semua akordion?
P粉391677921
2023-08-30 16:57:51
<p>Saya mempunyai komponen yang mencipta akordion boleh lipat menggunakan kod berikut: </p>
<pre class="brush:php;toolbar:false;">import React, {useState} daripada 'react';
const Boleh Dilipat = (props) =>{
const [open, setOpen] = useState(false);
togol const = () =>
setOpen(!open);
}
kembali(
<div>
<button className={props.level} onClick={toggle}>{props.label}</button>
{buka &&
<div className="togol">
{props.children}
</div>
)}
</div>
)
}
eksport lalai Boleh Dilipat;</pre>
<p>Saya menggunakannya di beberapa tempat dalam aplikasi utama dan kadangkala dalam akordion lain. Dalam beberapa keadaan, saya sebenarnya tidak tahu berapa banyak akordion yang terdapat pada halaman kerana ia dipaparkan secara dinamik berdasarkan data. Dengan ini, saya ingin mencipta butang dalam aplikasi utama yang menghidupkan (dan mematikan) semua akordion tanpa perlu menetapkan nombor tetap, dan tanpa perlu membuat semua akordion dalam aplikasi utama (iaitu beberapa akordion dalam komponen lain dan kemudian diimport ke dalam aplikasi utama). </p>
<p>Saya cuba menggunakan cangkuk ref untuk mencapai ini: </p>
<ol>
<li>Tambahkan rujukan dalam butang komponen Boleh Dilipat dan aksesnya daripada komponen induk melalui prop: </li>
</ol>
<pre class="brush:php;toolbar:false;"><button className={props.level} onClick={toggle} ref={props.innerRef}>{props.label}</button> ;</pra>
<ol start="2">
<li>Tambahkan rujukan berikut dalam aplikasi utama: </li>
</ol>
<pre class="brush:php;toolbar:false;">const childRef = useRef();
const openClick = () =>
childRef.state = benar;
}
const closeKlik = () =>
childRef.state = palsu;
}</pre>
<ol start="3">
<li>Gunakan butang berikut dalam aplikasi utama: </li>
</ol>
<pre class="brush:php;toolbar:false;"><butang onClick = {openClick}>
Kembangkan Semua
</butang>
<butang onClick = {closeClick}>
Runtuhkan semua
</button></pre>
<ol start="4">
<li>Tambahkan ref pada akordion semasa membuat persembahan: </li>
</ol>
<pre class="brush:php;toolbar:false;"><Collapsible label=""level="innerRef={childRef}></pre>
<p>Ini sebenarnya tidak melakukan apa-apa, mungkin kerana cara saya cuba mengakses keadaan dalam langkah 2 adalah salah, tetapi saya fikir ia patut dicuba...</p>
<p>Ada idea sama ada ini boleh dilakukan? </p>
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=falseDalam 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:...Terdapat juga cangkuk yang dipanggil oleh setiap komponen kanak-kanak untuk mendaftar dengan konteks dan mengembalikan nilai
toggle
/open
yang biasa:Terdapat juga cangkuk berasingan untuk melakukan operasi kelompok yang juga berguna:
Kotak pasir
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.