Kullanan bir örnekle daha yeni yanıt React.useState
Durumu ana bileşende tutmak önerilen yoldur. Ebeveynin iki çocuk bileşeninde yönettiği için ona erişmesi gerekir. Redux tarafından yönetilen gibi küresel devlet taşıyarak, bir değil neden aynı aynı nedenle önerilen genel değişken yerel kötüdür yazılım mühendisliğinde genel olarak.
Durum üst bileşendeyken, üst öğe alt öğeye value
ve onChange
işleyiciye destek verirse çocuk bunu değiştirebilir (bazen değer bağlantısı veya durum bağlantısı deseni olarak adlandırılır ). Kancalarla nasıl yapacağınız aşağıda açıklanmıştır:
function Parent() {
var [state, setState] = React.useState('initial input value');
return <>
<Child1 value={state} onChange={(v) => setState(v)} />
<Child2 value={state}>
</>
}
function Child1(props) {
return <input
value={props.value}
onChange={e => props.onChange(e.target.value)}
/>
}
function Child2(props) {
return <p>Content of the state {props.value}</p>
}
Ana bileşenin tamamı alt öğedeki giriş değişikliğinde yeniden oluşturulur; bu, üst bileşenin yeniden oluşturulması küçük / hızlıysa sorun olmayabilir. Ana bileşenin yeniden oluşturma performansı hala genel durumda bir sorun olabilir (örneğin büyük formlar). Bu sizin durumunuzda çözülmüş bir sorundur (aşağıya bakınız).
Hookstate gibi 3. taraf kitaplığını kullanarak durum bağlantı düzenini ve üst öğeyi yeniden oluşturmayı uygulamak daha kolaydır - sizinkiReact.useState
de dahil olmak üzere çeşitli kullanım durumlarını kapsayacak şekilde süper şarj edilir. (Feragatname: Projenin yazarıyım).
Hookstate ile böyle görünecekti. Child1
girişi değiştirecek, Child2
tepki verecektir. Parent
devleti elinde tutacaktır ancak devlet değişikliğinde yeniden yaratmayacak, sadece Child1
ve Child2
yapacak.
import { useStateLink } from '@hookstate/core';
function Parent() {
var state = useStateLink('initial input value');
return <>
<Child1 state={state} />
<Child2 state={state}>
</>
}
function Child1(props) {
// to avoid parent re-render use local state,
// could use `props.state` instead of `state` below instead
var state = useStateLink(props.state)
return <input
value={state.get()}
onChange={e => state.set(e.target.value)}
/>
}
function Child2(props) {
// to avoid parent re-render use local state,
// could use `props.state` instead of `state` below instead
var state = useStateLink(props.state)
return <p>Content of the state {state.get()}</p>
}
Not: orada çoktur fazla örnek burada içe geçmiş veriler, devlet doğrulama, küresel devlet dahil olmak üzere benzer ve daha karmaşık senaryolar kapsayan setState
vb kanca, Otelde ayrıca çevrimiçi tam örnek uygulama Hookstate kullanır ve teknik yukarıda açıkladı.