Adakah Anda Benar-Benar Memerlukan \'useState\' untuk Semuanya? Meneroka Alternatif

Susan Sarandon
Lepaskan: 2024-10-09 06:20:02
asal
854 orang telah melayarinya

Do You Really Need

Apabila anda mula-mula menyelami React, useState berasa seperti mantera ajaib yang membuatkan semuanya berfungsi. Inginkan butang untuk menjejak klik? Gunakan useState. Perlu menukar modal? useState sekali lagi. Tetapi apabila anda semakin mendalami pembangunan React, anda mungkin mula tertanya-tanya: Adakah useState pilihan yang tepat untuk setiap situasi?

Jawapannya, tidak menghairankan, tidak. Walaupun useState serba boleh, React menawarkan cangkuk dan corak lain yang mungkin lebih sesuai bergantung pada keperluan khusus anda. Mari terokai beberapa alternatif seperti useRef, useReducer dan useContext untuk melihat apabila ia bersinar.

Bila Menggunakan useRef Daripada useState

Ralat pemula React klasik menggunakan useState untuk nilai yang sebenarnya tidak menjejaskan pemaparan. useRef ialah pilihan yang ideal apabila anda perlu mengekalkan data merentas pemaparan tanpa mencetuskan pemaparan semula.

Contoh Praktikal:

Bayangkan anda menjejaki berapa kali butang diklik, tetapi anda tidak memerlukan komponen untuk dipaparkan semula setiap kali.

function ClickTracker() {
  const clickCount = useRef(0);

  const handleClick = () => {
    clickCount.current += 1;
    console.log(`Button clicked ${clickCount.current} times`);
  };

  return <button onClick={handleClick}>Click me</button>;
}
Salin selepas log masuk

Dalam kes ini, useRef menahan kiraan klik tanpa menyebabkan pemaparan semula yang tidak perlu. Jika anda menggunakan useState, komponen itu akan dipaparkan semula dengan setiap klik, yang tidak diperlukan di sini.

Bila Memilih useRef:

  • Nilai penjejakan yang tidak perlu mencetuskan kemas kini UI.
  • Menyimpan rujukan kepada elemen DOM atau nilai keadaan sebelumnya.

Apabila useReducer Shines Over useState

Untuk logik keadaan yang lebih kompleks, terutamanya apabila keadaan anda melibatkan berbilang subnilai atau tindakan, useReducer boleh menjadi alternatif yang berkuasa. useState mungkin mula berasa kikuk apabila anda menguruskan beberapa bahagian keadaan yang saling bergantung.

Senario Dunia Nyata:

Andaikan anda sedang membina borang di mana anda mengurus beberapa input seperti nama, e-mel dan kata laluan. Menggunakan useState untuk setiap input boleh menjadi membosankan dengan cepat.

function formReducer(state, action) {
  switch (action.type) {
    case 'SET_NAME':
      return { ...state, name: action.payload };
    case 'SET_EMAIL':
      return { ...state, email: action.payload };
    case 'SET_PASSWORD':
      return { ...state, password: action.payload };
    default:
      return state;
  }
}

function SignupForm() {
  const [formState, dispatch] = useReducer(formReducer, {
    name: '',
    email: '',
    password: ''
  });

  return (
    <>
      <input
        value={formState.name}
        onChange={(e) => dispatch({ type: 'SET_NAME', payload: e.target.value })}
        placeholder="Name"
      />
      <input
        value={formState.email}
        onChange={(e) => dispatch({ type: 'SET_EMAIL', payload: e.target.value })}
        placeholder="Email"
      />
      <input
        value={formState.password}
        onChange={(e) => dispatch({ type: 'SET_PASSWORD', payload: e.target.value })}
        placeholder="Password"
      />
    </>
  );
}
Salin selepas log masuk

Di sini, useReducer memusatkan semua kemas kini keadaan ke dalam satu fungsi, menjadikannya lebih mudah untuk diurus daripada berbilang panggilan useState.

Bila Memilih useReducer:

  • Mengendalikan logik keadaan kompleks dengan berbilang subnilai atau tindakan.
  • Apabila peralihan keadaan mengikut aliran berasaskan tindakan yang jelas (cth., TETAPKAN, TAMBAH, KELUARKAN).

Sekiranya Anda Mencapai untuk menggunakanKonteks Sebaliknya?

Jika keadaan anda dikongsi merentasi banyak komponen, penggerudian prop boleh menjadi mimpi ngeri dengan cepat. Di situlah useContext masuk—ia membantu anda berkongsi keadaan tanpa menurunkan prop ke bawah berbilang peringkat.

Contoh Kontekstual:

Bayangkan anda sedang membina troli beli-belah. Anda memerlukan keadaan troli (item yang ditambahkan, jumlah harga, dsb.) untuk boleh diakses di bahagian lain apl—mungkin pengepala, halaman daftar keluar dan pratonton troli.

const CartContext = React.createContext();

function CartProvider({ children }) {
  const [cart, setCart] = useState([]);

  return (
    <CartContext.Provider value={{ cart, setCart }}>
      {children}
    </CartContext.Provider>
  );
}

function Header() {
  const { cart } = React.useContext(CartContext);
  return <div>Items in cart: {cart.length}</div>;
}

function App() {
  return (
    <CartProvider>
      <Header />
      {/* Other components */}
    </CartProvider>
  );
}
Salin selepas log masuk

Dalam senario ini, useContext menjadikan keadaan troli tersedia kepada mana-mana komponen yang memerlukannya tanpa menghantar prop secara manual.

Bila untuk Memilih useContext:

  • Keadaan perkongsian antara komponen bersarang dalam.
  • Mengelakkan penggerudian prop untuk data global yang biasa diakses (cth., pengesahan pengguna, tema).

Pendekatan Seimbang

Walaupun useState merupakan titik permulaan yang hebat, ekosistem React menawarkan alatan berkuasa lain seperti useRef, useReducer dan useContext yang boleh memudahkan kod anda dan meningkatkan prestasi. Daripada mencapai useState secara lalai, tanya diri anda beberapa soalan penting:

  • Adakah keadaan ini perlu mencetuskan pemaparan semula? (Jika tidak, pertimbangkan useRef)
  • Adakah logik keadaan saya menjadi terlalu kompleks untuk useState? (Cuba gunaReducer)
  • Adakah saya menurunkan prop melalui terlalu banyak komponen? (Lihat ke dalam useContext)

Dengan memilih alat yang sesuai untuk tugas itu, anda akan menulis komponen React yang lebih cekap dan boleh diselenggara yang lebih mudah untuk difikirkan.

Jadi, lain kali anda mendapati diri anda lalai untuk menggunakanState, jeda seketika. Mungkin ada cara yang lebih baik untuk mengendalikan sesuatu!

Atas ialah kandungan terperinci Adakah Anda Benar-Benar Memerlukan \'useState\' untuk Semuanya? Meneroka Alternatif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan