Saya ingin membuat pengait khusus yang akan melewati render useEffect pertama dan menggunakannya kembali di mana-mana.
Saya membuat contoh pengait khusus yang berfungsi:
function useEffectSkipFirst(fn, arr) {
const isFirstRun = useRef(true);
useEffect(() => {
if (isFirstRun.current) {
isFirstRun.current = false;
return;
}
fn();
}, [...arr]);
}
Cara Penggunaan:
useEffectSkipFirst(fn, []);
Masalahnya adalah saya mendapat beberapa peringatan yang saya coba pahami dan berharap Anda dapat membantu saya:
React Hook useEffect memiliki ketergantungan yang hilang: 'fn'. Sertakan atau hapus larik ketergantungan. Jika 'fn' berubah terlalu sering, temukan komponen induk yang mendefinisikannya dan gabungkan definisi itu dalam useCallback. (react-hooks / exhaustive-deps) eslint
React Hook useEffect memiliki elemen penyebaran dalam larik ketergantungannya. Ini berarti kami tidak dapat memverifikasi secara statis apakah Anda telah meneruskan dependensi yang benar. (react-hooks / exhaustive-deps)
Contoh Codesandbox.
Kode contoh lengkap:
import React, { useRef, useEffect, useState } from "react";
import ReactDOM from "react-dom";
function useEffectSkipFirst(fn, arr) {
const isFirstRun = useRef(true);
useEffect(() => {
if (isFirstRun.current) {
isFirstRun.current = false;
return;
}
fn();
}, [...arr]);
}
function App() {
const [clicks, setClicks] = useState(0);
const [date, setDate] = useState(Date.now());
const [useEffectRunTimes, setTseEffectRunTimes] = useState(0);
useEffectSkipFirst(() => {
addEffectRunTimes();
}, [clicks, date]);
function addEffectRunTimes() {
setTseEffectRunTimes(useEffectRunTimes + 1);
}
return (
<div className="App">
<div>clicks: {clicks}</div>
<div>date: {new Date(date).toString()}</div>
<div>useEffectRunTimes: {useEffectRunTimes}</div>
<button onClick={() => setClicks(clicks + 1)}>add clicks</button>
<button onClick={() => setDate(Date.now())}>update date</button>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Saya melihat satu solusi untuk masalah Anda.
Pertama, Anda perlu mengurangi larik dependensi useEffect menjadi satu nilai (dengan menggunakan hook useMemo).
Kemudian pada efeknya, Anda harus menggunakan useRefuntuk menyimpan nilai lama dari nilai ketergantungan ini, sehingga Anda akan dapat memanggil fnfungsi hanya ketika ketergantungan telah berubah .
Berikut adalah kode pengait khusus:
function useEffectSkipFirst(fn, depValue) {
const oldDepValueRef = useRef(depValue);
useEffect(() => {
if (depValue !== oldDepValueRef.current) {
// Note that this code will not be executed the first time as
// we initialized oldDepValueRef with depValue
fn();
oldDepValueRef.current = depValue;
}
}, [fn, depValue]);
}
Berikut adalah kode untuk mengurangi dep array menjadi satu nilai menggunakan useMemo:
// I decided the return an object but it could be an array or something else
const depValue = useMemo(() => ({}), [clicks, date]);
useEffectSkipFirst(addEffectRunTimes, depValue);
function addEffectRunTimes() {
// When the value depends on the previous value,
// you can use a function to update the state value
setTseEffectRunTimes(v => v + 1);
}
Ngomong-ngomong jika addEffectRunTimesfungsinya hanya digunakan dalam efek, Anda bisa langsung menulis:
useEffectSkipFirst(() => setTseEffectRunTimes(v => v + 1), depValue);
Fungsi fn yang Anda ambil sebagai panggilan balik untuk useEffectSkipFirstperubahan pada setiap render. Juga karena fungsi ini dipanggil di dalam useEffectSkipFirst, linter meminta Anda untuk mendefinisikannya sebagai dependensi.
Namun, cara Anda mengimplementasikannya, terserah kode yang diimplementasikan useEffectSkipFirstuntuk memastikan bahwa semua nilai memiliki closure yang benar dan Anda bisa melewati mendefinisikannya sebagai dependensi ke useEffect. Namun jika Anda melakukannya, ini mungkin mengarah ke loop tak terbatas.
Anda dapat memeriksa posting ini juga untuk lebih jelasnya: Bagaimana cara memperbaiki peringatan ketergantungan yang hilang saat menggunakan useEffect React Hook?
Peringatan pertama pada dasarnya berarti bahwa semua dependensi yang direferensikan di dalam useEffectcallback harus dideklarasikan di dalam larik dependensinya. Dokumentasi resmi memberikan penjelasan lebih lanjut tentang menambahkan fungsi ke larik ketergantungan.
Waring kedua berarti bahwa Anda tidak dapat menentukan dependensi secara dinamis, misalnya dengan cara membuatnya tidak diketahui hingga runtime. Ini karena dependensi dibandingkan secara statis sebelum eksekusi kode dan oleh karena itu harus dieja secara eksplisit.
Jana Duggar terbuka tentang pencarian cintanya. Inilah semua yang dia katakan tentang topik dan jendela lima tahun untuk menikah.
Bintang 'Outlander' Sam Heughan baru-baru ini mengungkapkan apa yang akan dia ambil dari lokasi syuting untuk mengingat Jamie Fraser, peran yang membuatnya menjadi bintang.
'She Loves You' ditulis dalam satu jam, direkam dalam sehari, dan merupakan lagu The Beatles dengan salah satu penampilan terbaik dalam karir mereka.
Dolly Parton dan Nenek Bessie memiliki hubungan khusus. Nenek Parton sakit parah, tapi itu tidak menghentikan Dolly untuk mengerjainya.
Anda mungkin mengira kayu ek atau hickory kuat, tetapi jika berbicara tentang kayu terkeras di dunia, keduanya tidak ada yang mendekati.
Lautan memang penuh keindahan, tetapi juga menyembunyikan beberapa makhluk laut paling menakutkan di planet ini. Banyak dari hewan ini bersembunyi jauh di bawah permukaan laut, di dunia laut dalam yang gelap dan bertekanan tinggi.
Jika Anda sedang melawan monster musuh atau bersiap untuk skenario PvP, mengetahui pesona pedang terbaik di Minecraft dapat memberi Anda keuntungan besar. Memikat pedang memungkinkan Anda menghasilkan lebih banyak kerusakan, meningkatkan jumlah monster yang dijatuhkan, dan memperpanjang daya tahan pedang Anda.
Ketika orang berbicara tentang negara sosialis, mereka sering membayangkan kendali penuh pemerintah dan tanpa kepemilikan swasta. Namun dalam praktiknya, ekonomi sosialis sangat bervariasi.
“Children” merilis cameo dengan nama besar dan beberapa berita buruk
RAV4 ini diklaim dalam kondisi sangat baik dan siap digunakan untuk permainan kursi musik.
Rekaman drone memperlihatkan petugas pemadam kebakaran yang tampak kesulitan memadamkan api.
Eyes of Wakanda terhubung langsung dengan MCU, ditambah pembaruan tentang X-Men '97, What If..., Daredevil, dan banyak lagi.
'Laguna Beach' mengikuti kehidupan siswa sekolah menengah Lauren Conrad, Kristin Cavallari, Stephen Colletti, dan banyak lagi pada pertengahan tahun 2000-an. Berikut ini adalah tempat tinggal para pemeran serial realitas MTV tersebut sekarang.
Ava Gardner pernah menikah dengan Mickey Rooney dan Frank Sintra, dan ia pernah berpacaran dengan beberapa bintang Hollywood lainnya. Berikut ini kilas balik riwayat berpacaran Ava Gardner.
John Cleese menikahi istrinya, Jennifer Wade, pada tahun 2012. Berikut semua yang perlu Anda ketahui tentang istri John Cleese, Jennifer Wade.
Berikut semua yang perlu Anda ketahui tentang Francie Frane, mantan peternak yang menikah dengan Dog the Bounty Hunter.
Itu mengejutkan saya Tiba-tiba seperti yang sering terjadi Ini di tengah jalan lagi <Tidak, bukan yang di pasifik Anda merah marun, yang di karnaval> Setiap berita utama keras…..
Di tahun 2022, dengan dirilisnya GPT-3, kemampuan menulis sepertinya menjadi kurang penting. Dengan AI, orang dengan tulisan yang buruk juga dapat menghasilkan staf yang berkualitas.
Di dunia yang serba cepat dan kompetitif saat ini, karier seseorang memainkan peran penting dalam pertumbuhan pribadi, stabilitas keuangan, dan kepuasan hidup secara keseluruhan. Namun, banyak orang menemukan diri mereka terjebak dalam siklus stagnasi dan ketidakpuasan tanpa henti, secara bertahap menyia-nyiakan kehidupan profesional mereka.
Minggu lalu saya melihat siaran pers, dikirim melalui PressGazette (situs web berita media Inggris). Artikel tersebut mengumumkan bahwa Acast, perusahaan hosting dan periklanan podcast Scandi, akan memimpin konsorsium penerbit "mungkin yang paling berpengaruh" dalam podcasting.