React'te setState ile bir nesneyi güncelleme
Nesnenin özelliklerini setState ile güncellemek mümkün müdür?
Şöyle bir şey:
this.state = {
jasper: { name: 'jasper', age: 28 },
}
Denedim:
this.setState({jasper.name: 'someOtherName'});
ve bu:
this.setState({jasper: {name: 'someothername'}})
İlki bir sözdizimi hatasıyla sonuçlanırken ikincisi hiçbir şey yapmaz. Fikri olan var mı?
211
3
Durum güncellemesi bir async işlemi olduğundan, bunu yapmanın birden fazla yolu vardır, bu nedenle durum nesnesini güncellemek için
setState
ile updater işlevi kullanmamız gerekir.1- En basit olanı:
Önce
jasper
ın bir kopyasını oluşturun, ardından değişiklikleri bu kopyada yapın:Object.assign` kullanmak yerine bu şekilde de yazabiliriz:
2- [yayma operatörünü]3 kullanma:
Not:
Object.assign
veSpread Operator
yalnızca shallow copy oluşturur, bu nedenle iç içe nesne veya nesne dizisi tanımladıysanız, farklı bir yaklaşıma ihtiyacınız vardır.İç içe geçmiş durum nesnesi güncelleniyor:
Durumu şu şekilde tanımladığınızı varsayalım:
Pizza nesnesinin extraCheese öğesini güncellemek için:
Nesne dizisi güncelleniyor:
Bir yapılacaklar uygulamanız olduğunu ve bu formdaki verileri yönettiğinizi varsayalım:
Herhangi bir todo nesnesinin durumunu güncellemek için, dizi üzerinde bir harita çalıştırın ve her nesnenin bazı benzersiz değerlerini kontrol edin,
condition=true
durumunda, güncellenmiş değere sahip yeni nesneyi döndürün, aksi takdirde aynı nesneyi döndürün.Öneri: Nesnenin benzersiz bir değeri yoksa, dizi indeksi kullanın.
İlk durum gerçekten de bir sözdizimi hatasıdır.
Bileşeninizin geri kalanını göremediğim için, burada durumunuzdaki nesneleri neden iç içe yerleştirdiğinizi görmek zor. Bileşen durumundaki nesneleri iç içe yerleştirmek iyi bir fikir değildir. Başlangıç durumunuzu şu şekilde ayarlamayı deneyin:
Bu şekilde, adı güncellemek isterseniz, sadece arayabilirsiniz:
Bu, hedeflediğiniz şeye ulaşmanızı sağlayacak mı?
Daha büyük, daha karmaşık veri depoları için Redux gibi bir şey kullanırdım. Ama bu çok daha gelişmiş bir yöntem.
Bileşen durumu ile ilgili genel kural, bunu yalnızca bileşenin kullanıcı arayüzü durumunu yönetmek için kullanmaktır (örn. etkin, zamanlayıcılar, vb.)
Bu referanslara göz atın:
Başka bir seçenek: değişkeninizi Jasper nesnesi dışında tanımlayın ve sonra sadece bir değişkeni çağırın.
Yayılma operatörü: ES6