Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

Ini adalah postingan yang diterjemahkan oleh AI.

Sunrabbit

[React Hook] useState

  • Bahasa penulisan: Bahasa Korea
  • Negara referensi: Semua negara country-flag

Pilih Bahasa

  • Bahasa Indonesia
  • English
  • 汉语
  • Español
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

Teks yang dirangkum oleh AI durumis

  • Hook yang diawali dengan "use" yang sering digunakan di React bekerja dengan menyimpan nilai status dan melakukan re-rendering saat terjadi perubahan, menggunakan dispatcher dari objek global.
  • useState merender ulang seluruh komponen, tetapi menggunakan virtual DOM untuk memodifikasi DOM yang berubah, dan meskipun dijalankan setiap re-rendering, ia mempertahankan nilai status melalui struktur daftar tertaut yang menggunakan variabel global.
  • Saat re-rendering, fungsi-fungsi seperti updateState dan rerenderState dipanggil untuk memperbarui nilai status, dan bekerja dengan memanggil fungsi lain sesuai dengan peristiwa.

Anehnya, lingkungan React sangat menyukai penggunaan awalan 'use'.

useServer, useCallback, useState, useMemo, dan lain sebagainya.

Hook kustom pun juga menggunakan awalan 'use'.

Dari mana asalnya?


useState adalah hook yang terkenal.

Menyimpan nilai keadaan dan memicu render ulang saat nilai tersebut berubah. Sangat sederhana.

import { useState } from 'react';
function ExampleComponent() {
	const [count, setCount] = useState(0);
	return (
		

You clicked {count} times

);

Ini adalah contoh yang semua orang tahu.


Dikatakan bahwa render ulang terjadi saat nilai keadaan berubah, tetapi bagaimana ruang lingkup render ulang tersebut?

Hanya tag

? Atau sampai tag


Jawabannya adalah seluruh komponen tempat useState dipanggil.

ExampleComponent dirender ulang, tetapi

katanya menggunakan Virtual DOM untuk membandingkan nilai dan hanya mengubah DOM di tempat yang berbeda.


useState dipanggil pada setiap render ulang, bagaimana nilai keadaan tetap terjaga?

Jawabannya terletak pada struktur useState.

// react/packages/react/src/ReactHooks.js
export function useState(
	initialState: (() => S) | S,
): [S, Dispatch] {
	const dispatcher = resolveDispatcher();
	return dispatcher.useState(initialState);

Ini adalah kode useState React yang sebenarnya.


Dispatcher diambil dari objek global dan menembakkan useState.

Struktur ini masih belum jelas.


Mari kita selami lebih dalam, kita akan menemukan kode berikut.

function mountState(
	initialState: (() => S) | S,
): [S, Dispatch] {
	const hook = mountStateImpl(initialState);
	const queue = hook.queue;
	const dispatch: Dispatch = (dispatchSetState.bind(
		null,
		currentlyRenderingFiber,
		queue,
	): any);
	queue.dispatch = dispatch;
	return [hook.memoizedState, dispatch];

Hook diambil dan fungsi set langsung dikaitkan dengan antrian yang ada di hook.

(Bind mengikat 'this' ke fungsi yang ada, menggunakan sisa nilai argumen sebagai argumen fungsi tersebut, kemudian mengembalikan fungsi baru dengan 'this' yang terikat.)


Ini masih sulit untuk dipahami alasannya.

Mari kita selami lebih dalam lagi.

function mountStateImpl(initialState: (() => S) | S): Hook {
	const hook = mountWorkInProgressHook();
	if (typeof initialState === 'function') {
		const initialStateInitializer = initialState;
		initialState = initialStateInitializer();
	}
	hook.memoizedState = hook.baseState = initialState;
	const queue: UpdateQueue = {
		pending: null,
		lanes: NoLanes,
		dispatch: null,
		lastRenderedReducer: basicStateReducer,
		lastRenderedState: (initialState: any),
	};
	hook.queue = queue;
	return hook;


Kita dapat melihat bahwa nilai init diberikan pada setiap kali. Ini tidak menjelaskan mengapa keadaan tetap terjaga.

Mari kita selami lebih dalam lagi. Hook terlihat mencurigakan.

function mountWorkInProgressHook(): Hook {
	const hook: Hook = {
		memoizedState: null,
		baseState: null,
		baseQueue: null,
		queue: null,
		next: null,
	};
	
	if (workInProgressHook === null) {
		// This is the first hook in the list
		currentlyRenderingFiber.memoizedState = workInProgressHook = hook;
	} else {
		// Append to the end of the list
		workInProgressHook = workInProgressHook.next = hook;
	}
	return workInProgressHook;

currentlyRenderingFiber dan workInProgressHook adalah variabel global.

Ini adalah bentuk implementasi linked list menggunakan alokasi dari kanan ke kiri.


Oleh karena itu, jika kita melihat hook, struktur yang diharapkan adalah sebagai berikut.

{
	memoizedState: 0, // first hook
	baseState: 0,
	queue: { /* ... / },
	baseUpdate: null,
	next: { // second hook
		memoizedState: false,
		baseState: false,
		queue: { / ... / },
		baseUpdate: null,
		next: { // third hook
			memoizedState: {
			tag: 192,
			create: () => {},
			destory: undefined,
			deps: [0, false],
			next: { / ... */ }
			},
			baseState: null,
			queue: null,
			baseUpdate: null,
			next: null
		}
	}

Nilai di awal terus ditambahkan.


Penjelasannya masih belum jelas, setelah melihat implementasi useState lainnya

ternyata tidak semua implementasi memanggil mountState, tetapi memanggil updateState dan rerenderState saat render ulang.

Oleh karena itu, struktur tersebut adalah seperti yang ada di atas, dan fungsi lain dipanggil sesuai dengan event.

Jika Anda ingin melihat langsung kodenya, Anda dapat merujuk pada react/packages/react-reconciler/src/ReactFiberHooks.js.

Sunrabbit
Sunrabbit
More than the best, I'll do my best
Sunrabbit
[Observability] Tantangan Pengumpul Log Vector Vector, alat pengumpulan dan pemrosesan log yang dikembangkan oleh DataDog, ditulis dalam Rust, sehingga pembuatan kode konversi log lebih mudah daripada Otel, dan mendukung integrasi dengan Loki di lingkungan Kubernetes menggunakan Helm. Namun, Anda mung

9 Maret 2024

[Next.js] Injeksi Lingkungan Runtime Pelajari cara mengatur variabel lingkungan setelah build di Next.js. Kami memperkenalkan cara menginstal cross-env dan memodifikasi skrip yang mudah diikuti oleh pengguna Windows. Ini dapat digunakan untuk pengaturan variabel lingkungan yang berbeda seper

20 Maret 2024

[Efektif Java] Item 6. Hindari Pembuatan Objek yang Tidak Diperlukan Panduan tentang cara mengurangi pembuatan objek yang tidak diperlukan di Java. String, Boolean, dan objek tak berubah lainnya lebih baik menggunakan literal, dan ekspresi reguler lebih baik menggunakan instance Pattern yang di-cache. Selain itu, autoboxin
제이온
제이온
제이온
제이온

28 April 2024

[Non-Major, Survive as a Developer] 14. Ringkasan Konten Wawancara Teknis yang Sering Ditanyakan untuk Pengembang Pemula Panduan persiapan wawancara teknis untuk pengembang pemula. Area memori utama, struktur data, RDBMS dan NoSQL, berorientasi prosedur dan berorientasi objek, overriding dan overloading, algoritma penggantian halaman, proses dan thread, OSI 7 layer, TCP dan
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 April 2024

Cara Rust Mencegah Bug Konkurensi Rust adalah bahasa yang kuat untuk mengatasi tantangan pemrograman konkurensi. Sistem tipenya dan model kepemilikan membuat transfer dan berbagi data antar thread aman. Dengan pola internal mutability seperti Mutex, Channel, dan Atomic, Anda dapat mendefi
곽경직
곽경직
곽경직
곽경직
곽경직

28 Maret 2024

[Java] Konsep Refleksi dan Cara Penggunaannya Refleksi adalah API yang mendukung program Java untuk mengakses informasi kelas selama program dijalankan dan memanipulasi kelas. Pada saat runtime, Anda dapat membuat kelas, mengakses bidang dan metode, tetapi hal ini dapat melanggar enkapsulasi dan meny
제이온
제이온
제이온
제이온

25 April 2024

[Javascript] Struktur Object (V8) Object JavaScript dalam mesin V8 dioptimalkan seperti struktur berdasarkan statusnya dan diubah menjadi mode Fast yang dioptimalkan atau mode Dictionary yang beroperasi sebagai hashmap. Mode Fast cepat karena kunci dan nilainya hampir berbentuk tetap, tet
곽경직
곽경직
곽경직
곽경직
곽경직

18 Maret 2024

[Concurrency] Operasi Atomik: Memory Fence dan Memory Ordering Postingan blog ini menjelaskan cara mempertimbangkan urutan memori dalam operasi atomik, dan pentingnya opsi Ordering. Ini membahas berbagai opsi Ordering seperti Relaxed, Acquire, Release, AcqRel, SecCst, bersama dengan keuntungan dan kerugian dari masin
곽경직
곽경직
곽경직
곽경직
곽경직

12 April 2024