Rumah >hujung hadapan web >tutorial js >Pengurusan Negeri di React Native
mata teras
setState()
Cara yang paling biasa untuk menetapkan keadaan dalam React Native adalah dengan menggunakan kaedah React's
. Kami juga boleh menggunakan API konteks untuk mengelakkan penggerudian prop dan lulus keadaan berbilang lapisan tanpa lulus kepada subkomponen individu di dalam pokok. setState()
Dalam tutorial ini, kita akan mempelajari apa sebenarnya yang dimaksudkan dengan keadaan, serta kaedah
, API konteks, dan cangkuk React. Ini adalah asas untuk menetapkan keadaan dalam React Native. Semua perpustakaan dibina berdasarkan konsep asas di atas. Oleh itu, apabila anda memahami konsep -konsep ini, mudah untuk memahami perpustakaan atau membuat perpustakaan pengurusan negeri anda sendiri. setState()
Ingin belajar React Native dari awal? Artikel ini dikutip dari Perpustakaan Lanjutan kami. Sertai SitePoint Premium sekarang untuk koleksi buku asli yang lengkap yang meliputi asas, projek, tip, dan alat, hanya $ 9 sebulan.
Apakah status?
apa -apa yang berubah dari masa ke masa dipanggil keadaan. Jika kita mempunyai permohonan kaunter, negara adalah kaunter itu sendiri. Jika kita mempunyai aplikasi tugasan, senarai tugasan berubah dari masa ke masa, jadi senarai ini akan menjadi status. Malah elemen input adalah keadaan dalam erti kata, kerana ia berubah dari masa ke masa apabila pengguna menaipnya.
SetState PENGENALAN Sekarang kita tahu apa keadaan, mari kita faham bagaimana React menyimpannya. Pertimbangkan aplikasi kaunter yang mudah: Dalam permohonan ini, kami menyimpan Negeri dalam objek dalam pembina dan menyerahkannya kepada ingat bahawa keadaan hanya boleh menjadi satu objek. Anda tidak boleh menyimpan nombor secara langsung. Inilah sebabnya kami membuat pembolehubah Dalam kaedah anda juga boleh menulis negeri di luar pembina seperti berikut: sekarang anggap kita mahu butang "" dan "-" berfungsi. Kita perlu menulis beberapa kod di dalam pengendali Sekarang, apabila kita mengklik butang "" "dan"-", bertindak balas semula komponen. Ini kerana kaedah jadi jika kita mengklik ", ia akan meningkatkan kaunter dengan 1. Jika kita mengklik "-", ia akan mengurangkan kaunter dengan 1. ingat bahawa anda tidak boleh mengubah status secara langsung dengan menukar sejurus selepas memanggil seperti yang ditunjukkan di bawah: - sebagai parameter kepada kaedah
Apa itu cangkuk?
di atas ke
React. Dalam contoh kaunter kami, ia mengambil nombor dan mengembalikan array yang mengandungi dua nilai. nilai pertama dalam array ialah nilai keadaan semasa. Oleh itu, nilai kedua dalam array adalah fungsi yang membolehkan anda mengemas kini nilai keadaan. Dalam dan fungsi penurunan kami menjadi , dan
cangkuk panggilan dari fungsi React sahaja. Jangan panggil cangkuk dari fungsi JavaScript biasa. Sebaliknya, anda boleh memanggil cangkuk dari komponen fungsi React atau dari cangkuk tersuai.
cangkuk sangat mudah difahami dan berguna apabila menambah keadaan untuk berfungsi komponen.
Konteks Api
. Biasanya, jika kita tidak menggunakan konteks, kita akan lulus melalui setiap peringkat pertengahan, seperti:
Berikut adalah cara menggunakan API konteks: Pertama, kami menggunakan API Kemudian, kita menggunakan
Negeri dikongsi di seluruh komponen
Komponen
Dengan cara ini, anda tidak membuat komponen induk objek negara besar. Kesimpulan semua dalam semua, kita faham apa keadaan dan bagaimana untuk menetapkan nilai negeri menggunakan API kami mempelajari API Konteks Baru dan versi cangkuknya Akhirnya, kita belajar bagaimana untuk memperbaiki keadaan untuk berkongsi keadaan di kalangan komponen saudara. React menjadi sangat mudah apabila anda memahami konsep teras ini. Ingatlah untuk menjaga negeri tempatan ke komponen sebanyak mungkin. Gunakan API konteks hanya jika penggerudian prop menjadi masalah. Menggalakkan keadaan hanya jika diperlukan. Akhir sekali, apabila aplikasi anda menjadi rumit dan sukar untuk debug perubahan keadaan, periksa perpustakaan pengurusan negeri seperti Redux dan Mobx.
), redux, mobx, dan API konteks. Pilihan bergantung kepada kerumitan dan keperluan khusus permohonan.
<code class="language-javascript">import React from 'react';
import { Text, Button } from 'react-native';
class Counter extends React.Component {
state = {
counter: 0,
};
render() {
const { counter } = this.state;
return (
<>
<text>{counter}</text>
<button title="Increment" onpress="{()"> this.setState({ counter: counter + 1 })} />
<button title="Decrement" onpress="{()"> this.setState({ counter: counter - 1 })} />
</>
);
}
}</button></button></code>
this.state
. counter
di dalam objek. render
, kita membongkar atribut this.state
dari counter
dan menjadikannya dalam <h1></h1>
. Perhatikan bahawa pada masa ini ia hanya akan memaparkan nilai statik (0). <code class="language-javascript">import React from 'react';
import { Text, Button } from 'react-native';
class Counter extends React.Component {
state = { counter: 0 };
render() {
const { counter } = this.state;
return (
<>
<text>{counter}</text>
<button title="Increment" onpress="{()"> this.setState({ counter: counter + 1 })} />
<button title="Decrement" onpress="{()"> this.setState({ counter: counter - 1 })} />
</>
);
}
}</button></button></code>
onPress
masing -masing: <code class="language-javascript">import React from 'react';
import { Text, Button } from 'react-native';
class Counter extends React.Component {
state = { counter: 0 };
render() {
const { counter } = this.state;
return (
<>
<text>{counter}</text>
<button title="Increment" onpress="{()"> this.setState(prevState => ({ counter: prevState.counter + 1 }))} />
<button title="Decrement" onpress="{()"> this.setState(prevState => ({ counter: prevState.counter - 1 }))} />
</>
);
}
}</button></button></code>
setState()
digunakan. setState()
membentuk semula sebahagian daripada pokok yang diubah. Dalam kes ini, ia semula menjadi <h1></h1>
. this.state
; this.state = counter 1
this.setState
, ia tidak akan mencerminkan perubahan terkini. this.state
setState()
<code class="language-javascript">import React from 'react';
import { Text, Button } from 'react-native';
class Counter extends React.Component {
state = { counter: 0 };
render() {
const { counter } = this.state;
return (
<>
<text>{counter}</text>
<button title="Increment" onpress="{()"> this.setState(prevState => ({ counter: prevState.counter + 1 }))} />
<button title="Decrement" onpress="{()"> this.setState(prevState => ({ counter: prevState.counter - 1 }))} />
</>
);
}
}</button></button></code>
"Fungsi sebagai panggilan balik" Sintaks menyediakan keadaan terkini - dalam kes ini prevState
. setState()
Counter
komponen fungsi dan gunakan cangkuk reaksi: Counter
<code class="language-javascript">import React from 'react';
import { Text, Button } from 'react-native';
const Counter = () => {
const [counter, setCounter] = React.useState(0);
return (
<>
<text>{counter}</text>
<button title="Increment" onpress="{()"> setCounter(counter + 1)} />
<button title="Decrement" onpress="{()"> setCounter(counter - 1)} />
</>
);
};</button></button></code>
Perhatikan bahawa kami mengurangkan bilangan baris kod untuk komponen kelas dari 18 hingga hanya 12 baris. Di samping itu, kod itu lebih mudah dibaca. useState
boleh menjadi jenis -jenis seperti nombor, rentetan, array, boolean, objek, atau apa -apa jenis data -tidak seperti useState
, setState()
hanya boleh mempunyai satu objek. setState()
counter
kini 0. onPress
kami, kami boleh menggunakan setCounter
untuk mengemas kini counter
secara langsung. setCounter(counter 1)
. setCounter(counter - 1)
useState
, useEffect
, useContext
, useReducer
, useCallback
, useMemo
, useRef
, useImperativeHandle
, useLayoutEffect
, useDebugValue
,
useState
useEffect
theme
Dalam aplikasi Native React biasa, data diluluskan dari atas ke bawah melalui prop. Sekiranya terdapat pelbagai tahap komponen dalam aplikasi React dan komponen kanak -kanak yang terakhir dalam pokok komponen ingin mengambil data dari komponen induk paling teratas, anda mesti lulus prop ke bawah secara individu. App
Pic
Pertimbangkan contoh berikut. Kami mahu lulus nilai <code class="language-javascript">import React from 'react';
import { Text, Button } from 'react-native';
class Counter extends React.Component {
state = {
counter: 0,
};
render() {
const { counter } = this.state;
return (
<>
<text>{counter}</text>
<button title="Increment" onpress="{()"> this.setState({ counter: counter + 1 })} />
<button title="Decrement" onpress="{()"> this.setState({ counter: counter - 1 })} />
</>
);
}
}</button></button></code>
ke komponen theme
<code class="language-javascript">import React from 'react';
import { Text, Button } from 'react-native';
class Counter extends React.Component {
state = {
counter: 0,
};
render() {
const { counter } = this.state;
return (
<>
<text>{counter}</text>
<button title="Increment" onpress="{()"> this.setState({ counter: counter + 1 })} />
<button title="Decrement" onpress="{()"> this.setState({ counter: counter - 1 })} />
</>
);
}
}</button></button></code>
React.createContext
untuk membuat ThemeContext
. Kami menetapkan light
ke nilai lalai. theme
untuk membungkus elemen akar komponen ThemeContext.Provider
dengan App
apabila kami menyediakan ThemeContext.Consumer
Akhirnya, kami menggunakan theme
sebagai prop rendering untuk mendapatkan nilai dark
adalah ThemeContext.Consumer
Rendering mod prop adalah baik, tetapi jika kita mempunyai banyak konteks, ia boleh menyebabkan neraka panggil balik. Untuk mengelakkan neraka panggil balik, kita boleh menggunakan cangkuk dan bukannya Profile
Satu -satunya perkara yang perlu kita ubah ialah Butiran Pelaksanaan Komponen <code class="language-javascript">import React from 'react';
import { Text, Button } from 'react-native';
class Counter extends React.Component {
state = { counter: 0 };
render() {
const { counter } = this.state;
return (
<>
<text>{counter}</text>
<button title="Increment" onpress="{()"> this.setState({ counter: counter + 1 })} />
<button title="Decrement" onpress="{()"> this.setState({ counter: counter - 1 })} />
</>
);
}
}</button></button></code>
<code class="language-javascript">import React from 'react';
import { Text, Button } from 'react-native';
class Counter extends React.Component {
state = { counter: 0 };
render() {
const { counter } = this.state;
return (
<>
<text>{counter}</text>
<button title="Increment" onpress="{()"> this.setState(prevState => ({ counter: prevState.counter + 1 }))} />
<button title="Decrement" onpress="{()"> this.setState(prevState => ({ counter: prevState.counter - 1 }))} />
</>
);
}
}</button></button></code>
AddTodo
Sekarang, jika kita mahu menambah tugasan dari komponen TodoList
, bagaimanakah ia akan dipaparkan dalam komponen todos
<code class="language-javascript">import React from 'react';
import { Text, Button } from 'react-native';
class Counter extends React.Component {
state = { counter: 0 };
render() {
const { counter } = this.state;
return (
<>
<text>{counter}</text>
<button title="Increment" onpress="{()"> this.setState(prevState => ({ counter: prevState.counter + 1 }))} />
<button title="Decrement" onpress="{()"> this.setState(prevState => ({ counter: prevState.counter - 1 }))} />
</>
);
}
}</button></button></code>
App
di sini, kami menyelamatkan keadaan dalam komponen useState
. Kami menggunakan React Hook todos
untuk menyimpan addTodo
maka kita lulus kaedah AddTodo
ke komponen todos
dan lulus array TodoList
ke komponen AddTodo
addTodo
menerima kaedah TextInput
Kami juga mempunyai elemen useState
, yang juga menggunakan cangkuk React TextInput
untuk menjejaki nilai perubahan App
Selepas menekan butang, kami akan memanggil kaedah addTodo
yang diluluskan dari ibu bapa todos
. Ini memastikan bahawa item tugasan ditambah ke senarai TextInput
. Kami akan membersihkan kotak TodoList
todos
Komponen menerima <code class="language-javascript">import React from 'react';
import { Text, Button } from 'react-native';
const Counter = () => {
const [counter, setCounter] = React.useState(0);
return (
<>
<text>{counter}</text>
<button title="Increment" onpress="{()"> setCounter(counter + 1)} />
<button title="Decrement" onpress="{()"> setCounter(counter - 1)} />
</>
);
};</button></button></code>
setState()
yang disediakan oleh React. Kami juga belajar tentang cangkuk React, yang menjadikannya mudah untuk menambah keadaan untuk berfungsi komponen tanpa menukarnya ke dalam komponen kelas. useContext
, yang membantu kami mengelakkan memberikan neraka panggil balik prop. Soalan Lazim Mengenai React Native State Management
useState
Atas ialah kandungan terperinci Pengurusan Negeri di React Native. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!