React-Redux: Tüm bileşen durumları Redux Mağazasında tutulmalı mı


90

Basit bir geçişim olduğunu varsayalım:

Düğmeye tıkladığımda, Renk bileşeni kırmızı ve mavi arasında değişiyor

Böyle bir şey yaparak bu sonuca ulaşabilirim.

index.js

Button: onClick={()=>{dispatch(changeColor())}}
Color: this.props.color ? blue : red

container.js

connect(mapStateToProps)(indexPage)

action_creator.js

function changeColor(){
 return {type: 'CHANGE_COLOR'}
}

redüktör.js

switch(){
case 'CHANGE_COLOR':
return {color: true}

ama bu jQuery, bazı sınıflar ve bazı css ile 5 saniyede elde edebileceğim bir şey için yazmak için çok fazla kod.

Sanırım gerçekten sorduğum şey, burada neyi yanlış yapıyorum?


7
react-redux, jquery'den daha kısa bir şey olarak satılmaz. Çalıştırmak ve çalıştırmak için kesinlikle biraz koda ihtiyacı var.
zerkms

Yanıtlar:


161

Redux, öncelikle "uygulama durumu" için tasarlanmıştır. Yani, uygulama mantığınızla ilgili her şey. Bunun üzerine inşa edilen görüş, bu durumun bir yansımasıdır, ancak yaptığı her şey için bu durum kapsayıcısını özel olarak kullanmak zorunda değildir.

Sadece şu soruları sorun: Bu durum başvurunun geri kalanı için önemli mi? Uygulamanın diğer bölümleri bu duruma göre farklı davranacak mı? Pek çok küçük durumda durum böyle olmayacaktır. Bir açılır menüyü seçin: Açık veya kapalı olması, muhtemelen uygulamanın diğer bölümlerini etkilemeyecektir. Yani, onu mağazanıza kablolamak muhtemelen aşırıdır. Kesinlikle geçerli bir seçenektir, ancak size herhangi bir fayda sağlamaz. this.stateKullanıp bir gün demsen daha iyi .

Sizin örneğinizde, uygulamanın diğer bölümlerinde herhangi bir fark yaratmak için bu düğmenin rengi değiştiriliyor mu? Uygulamanızın büyük bir kısmı için bir tür küresel açma / kapama geçişiyse, kesinlikle mağazaya aittir. Ancak düğmeyi tıkladığınızda yalnızca bir düğme rengini değiştiriyorsanız, renk durumunu yerel olarak tanımlanmış olarak bırakabilirsiniz. Düğmeye tıklama eyleminin, bir eylem gönderimi gerektiren başka etkileri olabilir, ancak bu, hangi renk olması gerektiği sorusundan ayrıdır.

Genel olarak, başvurunuzun durumunu olabildiğince küçük tutmaya çalışın. Orada her şeyi itmek zorunda değilsin . Yapmanız gerektiğinde yapın yoksa bir şeyi orada tutmak çok mantıklıdır. Veya Geliştirme Araçlarını kullanırken hayatınızı kolaylaştırırsa. Ancak önemini çok fazla yüklemeyin.


Hey, bu soruya asla kesin bir cevap olmayacağını biliyorum, ama bence burada mantığınız çok sağlam
l2silver

IMO, mükemmel bir cevap değil. Değişir. Kullanıcı arabirimi durumunu react durumunda depolamak, redux deposunu temiz hale getirecek, ancak test edilmesi zor olan, işlevsel olmayan bileşenle sonuçlanacaktır. UI durumunu react durumunda depolarken, dev üzerinde çok çaba sarf edecektir, çünkü fazladan indirgeyiciler yazmamız gerekir. Ancak, kullanıcı arabirimi durumunuzu yeniden depolamayı çok daha kolay hale getirmenize yardımcı olabilecek birçok paket vardır, daha fazla ayrıntı için redux.js.org/docs/faq/OrganizingState.html adresini kontrol edin .
Ron

21

Redux SSS: Organizing State
redux official doc'un bu bölümü sorunuzu iyi cevapladı.

Yerel bileşen durumunu kullanmak iyidir . Bir geliştirici olarak, başvurunuzu ne tür bir devletin oluşturduğunu ve her bir devlet parçasının nerede yaşaması gerektiğini belirlemek sizin işinizdir. Size uygun bir denge bulun ve onunla devam edin.

Redux'a ne tür verilerin konulması gerektiğini belirlemek için bazı genel kurallar:

  • Uygulamanın diğer bölümleri bu verilerle ilgileniyor mu?
  • Bu orijinal verilere dayanarak daha fazla türetilmiş veri oluşturabilmeniz gerekiyor mu?
  • Birden çok bileşeni sürmek için aynı veriler mi kullanılıyor?
  • Bu durumu belirli bir zaman noktasına geri yükleyebilmenin sizin için bir değeri var mı (yani, zaman yolculuğu hata ayıklaması)?
  • Verileri önbelleğe almak istiyor musunuz (yani, yeniden istemek yerine zaten oradaysa, durumda olanı kullanın)?

7

@ AR7 tarafından sağlanan harika bağlantıyı vurgulamak amacıyla ve bu bağlantı bir süre geri taşındığı için:

Küresel olarak uygulama için önemli olmayan ve karmaşık şekillerde değişmeyen geçici durum için React'i kullanın. Örneğin, bazı UI öğelerinde bir geçiş, bir form giriş durumu. Redux'u küresel olarak önemli olan veya karmaşık şekillerde değişime uğrayan durumlar için kullanın. Örneğin, önbelleğe alınmış kullanıcılar veya bir gönderi taslağı.

Bazen Redux durumundan React durumuna geçmek isteyebilirsiniz (Redux'da bir şeyi saklamak garipleştiğinde) veya tam tersi (daha önce yerel olan bir duruma daha fazla bileşenin erişime sahip olması gerektiğinde).

Temel kural şudur: daha az garip olanı yapın.

Dan Abramov: https://github.com/reactjs/redux/issues/1287#issuecomment-175351978


-9

Evet, tüm bileşen durumlarını Redux'da depolamaya değer . Bunu yaparsanız, Redux'un zaman yolculuğu hata ayıklama ve tekrar oynatılabilir hata raporları gibi birçok özelliğinden yararlanacaksınız. Aksi takdirde, bu özellikler tamamen kullanılamaz hale gelebilir .

Her zaman sen yok değişim Redux yığın değiştirir tamamen kaybolur ve uygulama UI mağaza ile senkronizasyon dışı olacağını, Redux bir bileşen durum değişikliği saklayın. Bu sizin için önemli değilse, neden Redux kullanıyorsunuz? Onsuz başvurunuz daha az karmaşık olacaktır!

Performans nedenleriyle, this.setState()birçok eylemi tekrar tekrar gönderebilecek herhangi bir şey için geri dönmek isteyebilirsiniz . Örneğin: kullanıcı bir anahtarı her yazdığında bir girdi alanının durumunu Redux'te depolamak performansın düşmesine neden olabilir. Bunu bir işlem gibi ele alarak çözebilirsiniz: kullanıcı eylemi "tamamlandığında", son durumu Redux'a kaydedin.

Orijinal gönderiniz, Redux yönteminin nasıl "yazılacak çok fazla kod" olduğundan bahsediyor. Evet, ancak yerel bileşen durumu gibi yaygın modeller için soyutlamalar kullanabilirsiniz.


İyileştirilmiş hata ayıklama yararlı bir amaç ve yeniden düzenlemenin güzel bir özelliğidir, ancak sinyal-gürültü oranının da önemli olduğunu düşünüyorum. Bir kod tabanındaki her değişkeni günlüğe kaydedebilir, ancak bu, gerçek kodun okunmasını zorlaştıran çok fazla kod ekleyecektir ve günlüğe kaydetmenin araştırılması zor olacaktır. Aynı şeyin redux kullanmak için de geçerli olduğunu düşünüyorum. Tüm durumların yeniden düzenlenmesinde olması hata ayıklamayı geliştirebilir, ancak ek kod ve soyutlamaların maliyeti, kodun okunmasını ve hatta bazı hata giderme görevlerini daha da zorlaştırabilir. (Ve redux geliştirme araçları
çöktüğünde

1
Öyleyse neden Redux kullanıyorsunuz? Her şeyi Redux'a koymazsanız, devtools gibi tüm özellikleri kaybedersiniz. Ya ya hepsi ya hiç. Bu gönderiye verilen en üstteki yanıtta olduğu gibi bir açılır menü için setState () kullanırsanız, kullanıcılarınızın açılır menüde karşılaşabilecekleri sorunları gidermek için devtools kullanamazsınız. Bir kaplama için setState () kullanmanız daha kötüdür çünkü kaplama gösterilmeden önce ve sonra zaman yolculuğunun bir yolu yoktur. SetState () burada serpilir ve hataya çok açıktır çünkü geliştirici sürekli olarak neyin bozulabileceğini düşünmek zorundadır.
kumar303

Daha spesifik bir yanıt olarak, bir kod tabanındaki her değişkenin günlüğe kaydedilmesi yararlı bir metafor değildir, çünkü soru kullanmak this.setState()veya kullanmakla ilgilidir dispatch(action...). this.setState()Her yerde kullanmanıza gerek yok ama ihtiyaç duyduğunuzda önerim, this.setState()performans kaygılarına dayalı olarak% 1'e geri dönerek vakaların% 99'u yerine Redux'u kullanmaktır .
kumar303

Her değişkeni günlüğe kaydetmek, bana her şeyi Redux'a koymakla benzer ve genel bir kural olarak eşit derecede tavsiye edilemez görünüyor. Redux dışına bazı şeyler bırakmak her şey için özelliklerini ortadan kaldırmamaktadır olduğu uzun devlet ayrılır kadar Redux. Yani, bir seçim kutusunun durumu olmasa bile Redux aracılığıyla iletilen API çağrı mantığımın hatalarını ayıklayabilirim. OP'nin bir noktası var - Redux'u kullanmak için birden fazla yerde daha fazla kod gerektiriyor ve belki de listeledikleri belirli örnekte bu haklı gösterilmiyor.
JD Sandifer

Aslında API mantığınızda hata ayıklayamayabilirsiniz. Benim amacım bu. Zaman yolculuğunu kıracağınız senaryoları önceden tahmin etmek gerçekten zordur, bu nedenle bir performans sorunu olana kadar tüm durumu (seçim kutusu durumu dahil) Redux'a koymak daha iyidir.
kumar303
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.