feragat
Tepki'deki Yuvalanmış Durum yanlış tasarım
Bu mükemmel cevabı okuyun .
Bu cevabın arkasında yatan akıl yürütme:
React's setState sadece yerleşik bir kolaylıktır, ancak yakında sınırlarının olduğunu fark edersiniz. Özel özellikleri kullanmak ve forceUpdate'in akıllı kullanımı size çok daha fazlasını sunar. Örneğin:
class MyClass extends React.Component {
myState = someObject
inputValue = 42
...
Örneğin MobX, durumu tamamen terk eder ve özel gözlemlenebilir özellikler kullanır.
React bileşenlerinde durum yerine Gözlenebilirler kullanın.
İç içe yerleştirilmiş her özelliği güncellemenin başka bir kısa yolu daha vardır .
this.setState(state => {
state.nested.flag = false
state.another.deep.prop = true
return state
})
Bir satırda
this.setState(state => (state.nested.flag = false, state))
not: Bu, Virgül operatörü ~ MDN , burada çalışırken bakın (Korumalı Alan) .
Buna benzer (bu durum durum referansını değiştirmez)
this.state.nested.flag = false
this.forceUpdate()
Bu bağlamdaki forceUpdate
ve arasındaki ince fark içinsetState
bağlanmış örneğe bakın.
Tabii ki bu, state
salt okunur olması gerektiği gibi bazı temel ilkeleri kötüye kullanıyor , ancak eski durumu hemen atıp yeni durumla değiştirdiğiniz için, tamamen tamam.
Uyarı
Hatta devlet içeren bileşen olsa edecektir güncelleyip rerender düzgün ( bu Yakaladım hariç ) , sahne olacaktır başarısız çocuklara yaymak için (aşağıda Mossad başının yorumunu bakınız) . Bu tekniği sadece ne yaptığınızı biliyorsanız kullanın.
Örneğin, kolayca güncellenen ve iletilen değiştirilmiş düz bir pervane geçirebilirsiniz.
render(
//some complex render with your nested state
<ChildComponent complexNestedProp={this.state.nested} pleaseRerender={Math.random()}/>
)
Artık complexNestedProp referansı değişmese de ( shouldComponentUpdate )
this.props.complexNestedProp === nextProps.complexNestedProp
bileşen , üst bileşen her güncelleştirildiğinde yeniden gönderilir; bu, çağrıldıktan sonra this.setState
veya üst öğe için geçerlidir this.forceUpdate
.
Devleti mutasyona uğratmanın etkileri
Kullanılması iç içe durumu farklı nesneler (bilinçli veya bilinçsiz) tutmak için farklı (daha eski) referanslar olabilir çünkü ve devleti doğrudan mutasyona tehlikelidir devlet ve ne zaman güncelleme mutlaka bilmiyor olabilir (örneğin kullanırken PureComponent
veya eğer shouldComponentUpdate
geri dönüşü uygulanmaktadır false
) YA vardır aşağıdaki örnekteki gibi eski verileri görüntülemeye yöneliktir.
Geçmiş verileri oluşturması beklenen bir zaman çizelgesini hayal edin, verileri el altında mutasyona uğratmak, önceki öğeleri de değiştireceğinden beklenmedik davranışlarla sonuçlanacaktır.
Her neyse, burada Nested PureChildClass
yayılmayan sahne nedeniyle yeniden gönderilmediğini görebilirsiniz .