رنج از حفاری پروانه را متوقف کنید: به 5 نکته مراجعه کنید که می تواند کد شما را ذخیره کند

مشکل: حفاری پروپ چیست؟
“حفاری پروانه” (یا “حفاری های غرفه”) روند انتقال داده ها از یک جزء پدر به کودک ، سپس به یک نوه ، نوه بزرگ ، تاتارانتو و غیره است ، تا زمانی که پروپا به مؤلفه ای برسد که واقعاً به آن احتیاج دارد. با رشد درخت مؤلفه ، این می تواند تکراری و دشوار باشد.
نمونه عملی حفاری پروانه
function App() {
const msg = "Passei pelo Header e pelo Wrapper e cheguei no Button!";
return <Main msg={msg} />;
}
function Main({ msg }) {
return <Header msg={msg} />;
}
function Header({ msg }) {
return (
<div>
<h1>Header aquih1>
<Wrapper msg={msg} />
div>
);
}
function Wrapper({ msg }) {
return (
<div>
<h2>Wrapper aquih2>
<Button msg={msg} />
div>
);
}
function Button({ msg }) {
return (
<div>
<h3>Componente Buttonh3>
<button onClick={() => alert(msg)}>Clique em mim!button>
div>
);
}
پیام باید در مؤلفه استفاده شود Button
، اما از آنجا عبور داده شد Main
با Header
اشمیه Wrapper
، این واقعاً از آن استفاده نمی کند. این مورد کلاسیک است حفاریبشر
راه حل هایی برای جلوگیری از حفاری پروانه
1. زمینه API
API زمینه ای برای واکنش نشان می دهد و به شما امکان می دهد داده ها را با چندین مؤلفه بدون عبور دستی در هر سطح به اشتراک بگذارید.
import { createContext, useContext } from 'react';
const MessageContext = createContext();
function App() {
const msg = "Passei pelo contexto até chegar no Button!";
return (
<MessageContext.Provider value={msg}>
<Main />
MessageContext.Provider>
);
}
function Main() {
return <Header />;
}
function Header() {
return (
<div>
<h1>Header aquih1>
<Wrapper />
div>
);
}
function Wrapper() {
return (
<div>
<h2>Wrapper aquih2>
<Button />
div>
);
}
function Button() {
const msg = useContext(MessageContext);
return (
<div>
<h3>Componente Buttonh3>
<button onClick={() => alert(msg)}>Clique em mim!button>
div>
);
}
2. Usando Jotai
Jotai یک کتابخانه مدیریت دولتی مدیریت ، سبک و اتم است. این یک جایگزین مدرن برای API زمینه است و از ظرافت و ظرافت جلوگیری می کند.
نصب
npm install jotai
مثال با Jotai
import { atom, useAtom } from 'jotai';
// Criando o átomo (estado global)
const messageAtom = atom("Passei via Jotai e cheguei no Button!");
function App() {
return <Main />;
}
function Main() {
return <Header />;
}
function Header() {
return (
<div>
<h1>Header aquih1>
<Wrapper />
div>
);
}
function Wrapper() {
return (
<div>
<h2>Wrapper aquih2>
<Button />
div>
);
}
function Button() {
const [msg] = useAtom(messageAtom);
return (
<div>
<h3>Componente Buttonh3>
<button onClick={() => alert(msg)}>Clique em mim!button>
div>
);
}
در مثال بالا ، مقدار اتم messageAtom
بدون نیاز به انتقال به عنوان prop ، می توان آن را مستقیماً از هر مؤلفه درخت دسترسی پیدا کرد.
3. شرایط اوساندو
Zustand یک جایگزین سبک برای مدیریت جهانی دولت است. در بعضی موارد ساده تر از کاهش ، مستقیم تر از زمینه.
نصب
npm install zustand
از مثال استفاده کنید
import create from 'zustand';
const useStore = create((set) => ({
msg: 'Passei via Zustand!',
}));
function App() {
return <Main />;
}
function Main() {
return <Header />;
}
function Header() {
return (
<div>
<h1>Headerh1>
<Wrapper />
div>
);
}
function Wrapper() {
return (
<div>
<h2>Wrapperh2>
<Button />
div>
);
}
function Button() {
const msg = useStore((state) => state.msg);
return (
<div>
<h3>This is the Button componenth3>
<button onClick={() => alert(msg)}>Click me!button>
div>
);
}
پایان
حفاری پروانه یک مشکل شایع در برنامه های React پیچیده تر است. اگرچه در ساختارهای کوچک به خوبی کار می کند ، با افزایش برنامه ، حفظ کد دشوارتر می شود.
خوشبختانه راه حل های ساده ای برای این کار وجود دارد:
- API متن برای به اشتراک گذاشتن مقادیر بین مؤلفه های مختلف.
- چیزی برای کنترل دانه ای و مقیاس پذیر تر از دولت.
- وضعیت این سبک و مستقیم به کشورهای جهانی ساده است.
رویکردی را انتخاب کنید که به بهترین وجه متناسب با اندازه و پیچیدگی پروژه شما باشد. برای پروژه های ساده ، زمینه ممکن است کافی باشد. برای پروژه های بزرگتر یا بالاتر که نیاز به کنترل دولت بالاتری دارند ، Jotai یا Zustand می تواند یک جایگزین عالی باشد.
اوه … و redux ؟؟ tchacalma! سپس در مورد او صحبت می کنیم. او در جعبه دیگری است.
آیا محتوا را دوست داشتید؟
اگر این مقاله به شما کمک کرده است تا مشکل حفاری پروانه و نحوه حل آن را با ابزارهای مدرن مانند زمینه ، Zustand و Jotai بهتر درک کنید:
⭐ مانند یا واکنش خود را ترک کنید
💬 نظر شما از کدام راه حل استفاده می کنید (یا می خواهید استفاده کنید)
🔁 با تیم یا جامعه خود به اشتراک بگذارید
برای محتوای بیشتر مانند این ، مرا در Dev.to (یا LinkedIn) دنبال کنید!