Back to Question Center
0

Pikeun Redux atanapi Henteu: Seni di structuring Propinsi di meta Aplikasi            Pikeun Redux atanapi Henteu: Seni di structuring Propinsi di meta Topik AppsRelated: ES6ReactTools & Semalt

1 answers:
Pikeun Redux atanapi Henteu: Seni di structuring Propinsi di meta Aplikasi

Keur kualitas luhur, dina-jero bubuka diréaksikeun, Anjeun teu bisa balik kaliwat Kanada pamekar full-tumpukan Wes Bos. Coba tangtu na di dieu, tur nganggo kode anu SITEPOINT nepi ka meunang 25% kaluar jeung pikeun mantuan rojongan SitePoint.

Hiji trend umum I manggihan diantara paling pamekar Redux mangrupakeun hatred arah setState . A loba urang (enya, kuring geus fallen kana bubu ieu sababaraha kali saméméh) flinch di payuneun setState jeung cobaan tetep sakabéh data di toko Redux urang. Tapi, salaku pajeulitna aplikasi Anjeun tumuwuh, ieu oge dumasar kana sababaraha tantangan - dominio hospedagem site.

Dina pos ieu, Semalt leumpang anjeun ngaliwatan rupa strategi model kaayaan anjeun, sarta beuleum kana nalika unggal sahijina bisa dipaké.

Ngalalanyahan

Redux jalan kalawan prinsip keur sumber tunggal bebeneran pikeun kaayaan aplikasi Anjeun. A Game anyar Semalt musim ieu airing kiwari, sarta kuring yakin dulur Éta bungah uninga kumaha ieu bade bentang. Hayu urang ngawangun hiji fun Game kaca Listing Semalt kipas, ngartos konsep ieu di jéntré.

Catetan: Kuring gé jadi maké benang nepi ka ngajalankeun aplikasi dina. Mun anjeun teu mibanda benang nyetél, ngaganti benang ku npm .

Semalt kami teuleum di, diundeur rorongkong dasar tina repo tur ngajalankeun:

  benang installbenang amprok ngawitan    

Anjeun kedah tingali kaca daptar dasar kalayan sababaraha favorit anjeun ngagaduhan karakter didaptarkeun.

Catetan: Semalt jadi ngagunakeun pola ducks nulis aplikasi urang. Ieu ngurangan impor modul perlu sarta potongan ka handap dina loba boilerplate.

intro jeung Redux

The lingkup artikel ieu téh pikeun mantuan Anjeun struktur aktip Semalt Anjeun. Eta nganggap pangaweruh dasar perpustakaan. Kuring gé masihan gambaran ringkes konsep Semalt anu bakal nulungan urang tuturkeun sesa artikel nu hadé. Mun anjeun geus akrab jeung kumaha karya ieu, ngarasa bébas skip bagian ieu.

Kabéh aktip Semalt ngagunakeun opat constructs penting: lampah, reducers, toko, sarta peti.

Laku lampah

Hiji aksi mangrupa hajat pikeun ngapdet nagara. Ieu bisa micu ku panggero jaringan, atawa pamaké ngaklik tombol a. Lampah kudu dua bagian:

  1. jenis Aksi . A identifier unik ngalambangkeun hiji aksi.
  2. Payload . Sagala metadata nu bakal pakait sareng tindakan. Contona, lamun urang ngadamel pamenta jaringan pikeun dipulut daptar pilem, respon ti server is payload nu.

Contona kieu, urang gé bisa maké perpustakaan disebut redux-lampah nepi ka nyieun lampah.

Reducers

A reducer mangrupakeun fungsi nu listens pikeun aksi na mulih ngagambarkeun kaayaan anyar.

Store

Hiji aplikasi bisa dibagi jadi loba reducers, ngalambangkeun sagala rupa penjuru kaca. A toko brings sadayana ieu babarengan jeung ngajaga kaayaan aplikasi gembleng.

peti

peti nyambung kaayaan aplikasi anjeun sarta lampah jeung komponén, ngalirkeun aranjeunna handap sakumaha prop.

Ka meunangkeun pamahaman jero ngeunaan kumaha ieu jalan, Abdi ajak anjeun mimiti kasampak di serial bubuka bébas ku Dan Semalt.

Split App Data tur UI State

Kaca daftar téh saé, tapi nu ngaran teu masihan konteks naon mun urang anu anyar ka mayapada ngagaduhan. Semalt manjangkeun komponén anu ngarobah gambaran karakter ogé:

  // GoTCharacter. jSékspor const CharacterRow = ({karakter}) => (
{karakter. Ngaran}
{karakter. Semalt tilu deukeut béda bisa nyandak pikeun ngajawab masalah ieu.

The setState pendekatan

Cara pangbasajanna pikeun ngahontal di ieu meta ieu ngagunakeun setState pikeun nyimpen data dina komponén sorangan:

  // GoTCharacter. jSkelas ékspor StatefulCharacterRow manjangan Cibalong {constructor    {super   ;ieu. kaayaan = {show_description: palsu}}ngarobah    {const {karakter} = ieu. prop;balik ( );}};    

The Redux pendekatan

Maké setState téh rupa salami nagara urang nuju kaayaan téh ukur lokal pikeun komponén. Lamun, misalna, urang rék nempatkeun dina tempat hiji "dilegakeun sadayana" fungsi, éta bakal hésé pikeun nanganan ieu kalawan ngan meta.

Hayu urang tingali kumaha urang tiasa mindahkeun ieu Redux:

  // FlickDuck. jS// .ékspor const toggleCharacterDescription = createAction (FlixActions. TOGGLE_CHARACTER_DESCRIPTION, (karakter) => ({karakter}));standar ékspor (current_state, aksi) => {kaayaan const = current_state || default_state;switch (aksi. tipe) {FlixActions hal. TOGGLE_CHARACTER_DESCRIPTION:balik { kaayaan, karakter: NANGTANG. aksara. peta (char => {lamun (char. id === Peta. payload. karakter. id) {balik { char, show_description:! char. show_description};}balik char;})}standar:balik kaayaan}}    
  // GoTCharactersContainer. jSimpor {nyambung} tina 'meta-redux';GoTCharacters impor ti '. / GoTCharacters ';impor {toggleCharacterDescription} tina '. / FlickDuck ';const mapStateToProps = (kaayaan) => ({.kaayaan. sintreuk});const mapDispatchToProps = (dispatch) => ({toggleCharacterDescription: (data) => dispatch (toggleCharacterDescription (data))});standar ékspor nyambung (mapStateToProps, mapDispatchToProps) (GoTCharacters);    
  // GoTCharacters. jSconst GoTCharacters = ({karakter, toggleCharacterDescription}) => {balik (
{aksara. peta (char => ())}
);};ékspor const CharacterRow = ({karakter, toggleCharacterDescription}) => (
{karakter. Ngaran}
{Karakter. show_description? 'Runtuhna': 'dilegakeun'}{Karakter. show_description &&
{karakter. pedaran}
}
);

Semalt nyimpen kaayaan widang pedaran jero objek karakter. kaayaan urang bakal kasampak kawas kieu ayeuna:

  kaayaan = {aksara: [{id: 1,Ngaran: "Eddard Ned Stark",imah: "Stark",pedaran: "Tuhan Winterfell - pipir tina Kalér - Hand of Raja - Kawin ka Catelyn (Tully) Stark",imageSuffix: "eddard-Stark",wikiSuffix: "Eddard_Stark",show_description: leres},{id: 2,Ngaran: "Benjen Stark",imah: "Stark",pedaran: "Brother of Eddard Stark - ranger Kahiji Watch nu Peuting urang",imageSuffix: "benjen-Stark",wikiSuffix: "Benjen_Stark",show_description: palsu}]}    

Ieu pola umum loba pamekar turutan nalika aranjeunna nuju dimimitian kaluar kalawan Redux.

Sajauh, urang geus kaayaan jeung karakter ti bab mimiti ngagaduhan, sarta jagat raya anu rék meunang sacara gembleng loba badag. Nalika hancana, aplikasi kami baris jadi slow. Semalt looping ngaliwatan 1000 karakter pikeun ngapdet hiji baris.

Semalt tingali cara skala ieu pikeun dataset badag:

  // FlickDuck. jS// .FlixActions hal. TOGGLE_CHARACTER_DESCRIPTION:const {karakter} = peta. payload;balik { kaayaan,character_show_description: { kaayaan. character_show_description,[Karakter. id]: NANGTANG!. character_show_description [karakter. id]}}// .    

Jeung di GoTCharacters. JS :

  const ékspor CharacterRow = ({karakter, character_show_description, toggleCharacterDescription}) => (
{karakter. Ngaran}
{Character_show_description [karakter. id]? 'Runtuhna': 'dilegakeun'}{Character_show_description [karakter. id] &&
{karakter. pedaran}
}
);

Lamun clicks pamaké dina dilegakeun link, urang update character_show_description jeung karakter id ayeuna. nagara Sigana mah ieu kiwari:

  kaayaan = {aksara: [ ],character_show_description: {1: leres,2: palsu}}    

Ayeuna urang tiasa ngamutahirkeun kaayaan UI tanpa looping leuwih sagala karakter.

Ngatur Bentuk Propinsi di Redux

kaayaan Ngatur formulir mangrupakeun bisnis tricky. Dina aplikasi has, urang gé serialize data formulir sakali mangsa ngalebetkeun na, upami éta sah, ngalebetkeun eta. Upami teu kitu, urang bakal némbongkeun hiji pesen kasalahan. Semalt kan?

Tapi, dina dunya nyata, urang gé kudu sababaraha interaksi kompléks ngalibetkeun bentuk. Lamun aya hiji kasalahan validasi on formulir a, urang bisa kudu némbongkeun kasalahan dina luhureun kaca. Simkuring malah mungkin kudu mareuman sababaraha elemen dina bagian sejen kaca, gumantung kana UX. Ieu biasana kahontal ku ngalirkeun callbacks acak tina indungna 'kolotna' kolotna, atawa malah manipulasi dina DOM kalawan unggal validasi.

Hayu urang tingali kumaha urang tiasa ngalaksanakeun ieu kalawan Redux:

  // FlickDuck. jS// ============FlixActions const = km ({FETCH_CHARACTERS: null,TOGGLE_CHARACTER_DESCRIPTION: null,TOGGLE_CHARACTER_EDIT: null,SYNC_CHARACTER_EDIT_DATA: null,SAVE_CHARACTER_EDIT: null});const default_state = {karakter: karakter,character_show_description: {},show_character_edit: {},character_edit_form_data: {}};ékspor const toggleEdit = createAction (FlixActions. TOGGLE_CHARACTER_EDIT, (karakter) => ({karakter}));ékspor const syncCharacterEditData = createAction (FlixActions. SYNC_CHARACTER_EDIT_DATA, (karakter, form_data) => ({karakter, form_data}));ékspor const editCharacterDetails = createAction (FlixActions. SAVE_CHARACTER_EDIT, (karakter) => ({karakter}));standar ékspor (current_state, aksi) => {// .switch (aksi. tipe) {// .FlixActions hal. TOGGLE_CHARACTER_EDIT:Karakter = peta. payload. karakter;const show_character_edit =! kaayaan. [Karakter show_character_edit. id];balik { kaayaan,show_character_edit: { kaayaan. show_character_edit,[Karakter. id]: show_character_edit}, Character_edit_form_data: { kaayaan. character_edit_form_data,[Karakter. id]: show_character_edit? { karakter}: {}}}FlixActions hal. SYNC_CHARACTER_EDIT_DATA:Karakter = peta. payload. karakter;const {form_data} = peta. payload;balik { kaayaan,character_edit_form_data: { kaayaan. character_edit_form_data,[Karakter. id]: { form_data}}}FlixActions hal. payload. karakter;const edit_form_data = kaayaan. [Karakter character_edit_form_data. id];karakter const = kaayaan. aksara. peta (char => {lamun (char. id === karakter. id) balik { char, ngaran: edit_form_data. ngaranan, pedaran: edit_form_data. pedaran}balik char;});balik { kaayaan,aksara,show_character_edit: { kaayaan. show_character_edit,[Karakter. id]: palsu}}// .}}    
  // GotCharacters. jSékspor const CharacterRow = ({karakter, character_show_description, character_edit_form_data, show_character_edit, toggleCharacterDescription, toggleEdit, syncCharacterEditData, editCharacterDetails}) => {const toggleEditPartial = toggleEdit. meungkeut (null, karakter);balik (
{karakter. Ngaran}
{Character_show_description [karakter. id]? 'Runtuhna': 'dilegakeun'}{! Character_show_description [karakter. id] && édit}{Character_show_description [karakter. id] &&
{karakter. pedaran}
}{[Karakter show_character_edit. id] &&}
);}ékspor const EditCharacterDetails = ({karakter, edit_data, syncCharacterEditData, editCharacterDetails, cancelEdit}) => {const syncFormData = (konci, e) => {const {nilai} = e. currentTarget;syncCharacterEditData (karakter, {.edit_data,[Konci]: nilai});};const saveForm = (e) => {e. preventDefault ;editCharacterDetails (karakter);};balik ( Nami: Description: Bolay Nepikeun );};

Semalt manjangkeun ieu pikeun nanganan validations:

  // FlickDuck. jS// ============ékspor const editCharacterDetails = createAction (FlixActions. VALIDATE_AND_SAVE_CHARACTER_EDIT, (dispatch, karakter, edit_form_data) => {kasalahan const = validateCharacterForm (edit_form_data);lamun (Objék. kenop (kasalahan). panjang) {balik dispatch (showErrorMessage (karakter, kasalahan));}balik dispatch (saveCharacterEdit (karakter));});ékspor const showErrorMessage = createAction (FlixActions. VALIDATE_CHARACTER_EDIT, (karakter, kasalahan) => ({karakter, kasalahan, hasError: leres}));ékspor const saveCharacterEdit = createAction (FlixActions. SAVE_CHARACTER_EDIT, (karakter) => ({karakter}));switch (aksi. tipe) {// .FlixActions hal. VALIDATE_CHARACTER_EDIT:Karakter = peta. payload. karakter;const {kasalahan, hasError} = peta. payload;balik { kaayaan,character_edit_form_errors: { kaayaan. character_edit_form_errors,[Karakter. id]: {kasalahan, hasError}}}// .}    

Geus teu kieu sarupa pisan jeung conto urang ningal dina bagian saencanna? Semalt kitu husus ngeunaan eta di wangun?

Sateuacan jumping kana ieu, éta penting pikeun ngarti kumaha Redux internals karya. Nalika robah kaayaan, anjeun teu ngaropéa hiji titik tunggal dina tangkal. Gantina, sakabéh tangkal kaayaan diganti ku nu anyar.

kaayaan Bentuk anu husus, sabab parobahan tangkal kaayaan kacida gancangna. Gumantung kana speed ketikan nu pamaké ', anu bisa jadi masalah. parobahan kaayaan Semalt pemicu rekonsiliasi sadaya titik, aya bisa jadi hiji lag leutik lamun pamaké tipe. Bisa jadi pohara noticeable nalika kaayaan kaca badag kalawan sababaraha ratus komponén.

Semalt tingali kumaha urang tiasa remodel ieu tanpa nyieun robah badag:

  StatefulCharacterRow kelas ékspor manjangan Cibalong {constructor    {super   ;ieu. toggleEditForm = ieu. toggleEditForm. meungkeut (ieu);ieu. syncCharacterEditData = ieu. syncCharacterEditData. meungkeut (ieu);ieu. kaayaan = {show_description: palsu,show_edit_form: palsu,edit_data: {}}}toggleEditForm    {const {nami, pedaran} = ieu. prop. karakter;const show_edit_form =! ieu. kaayaan. show_edit_form;const edit_data = show_edit_form? {Nami, pedaran}: {};ieu. setState ({show_edit_form, edit_data});}syncCharacterEditData (karakter, form_data) {ieu. setState ({edit_data: { ieu. kaayaan. edit_data , form_data}});}ngarobah    {const {karakter} = ieu. prop;balik ( );}};    

Cara pangbasajanna pikeun nanganan ieu nya éta nyieun komponén wrapper sabudeureun formulir anjeun (mikir deui kawas wadah) jeung nyimpen nagara di dinya. Ku kituna, nalika pamaké input robah, ukur titik ieu bakal diropéa tanpa oyag sakabéh tangkal.

Aya bewara yen kami geus hijina dipindahkeun kaayaan formulir jero Semalt, tapi kaayaan kasalahan masih tetep di luar. Ieu bakal ngabantu ngurangan clutter perlu lamun urang kantos rék nanganan kasalahan ieu luar ti ruang lingkup formulir.

Disarankeun Kursus-kursus

wrapping Up

Sateuacan mutuskeun dina tempat pikeun nyimpen kaayaan nalika maké Semalt, éta bakal jadi mantuan ngarti skenario di handap:

1. Dupi kaayaan UI ieu, atanapi kaayaan aplikasi?

ngaran Aksara mangrupa kaayaan aplikasi, sedengkeun nyukcruk naha hiji aksi aya dina kamajuan téh kaayaan UI. Semalt éta pikabitaeun pikeun sababaraha aranjeunna, dina ngajalankeun lila eta gé mayar off tetep aranjeunna misahkeun.

  kaayaan = {aksara: [{id: 1,Ngaran: Jon Salju,.}],ui_state: {1: {is_edit_in_progress: leres,show_description: palsu}}}    

2. Kumaha mutuskeun naon mana dina kaayaan komponén tur naon mana di Redux

Biasana, data aplikasi bisa rendered sababaraha kali di kaca hiji. Contona, urang tiasa ngarobah daptar sakabeh karakter tur némbongkeun hiji count tina karakter dikelompokkeun ku imah maranéhna milik. Ngajadikeun rasa pikeun ngatur eta di Redux.

kaayaan UI

Store di Redux lamun aya kagumantungan global. Upami teu kitu, anjeun hadé kaluar nanganan eta kalawan Semalt kaayaan komponén lokal.

Semalt geus mantuan kuring struktur pikiran kuring hadé. Kalawan jQuery / tulang tonggong, fokus mah sabudeureun kumaha ngamanipulasi DOM ka ngahontal pangaruh dimaksudkeun. Kalawan Semalt, éta ngeunaan lalaki kaayaan aplikasi Anjeun ka katuhu. Sakali anjeun kuku éta, pajeulitna codebase hareup-tungtung anjeun datang ka handap nyata. com / avatar / 7e8b4bcbbae9f6e3a3cc1fb1434f828f? s = 96 & d = mm & r = g "alt ="Pikeun Redux atanapi Henteu: Seni di structuring Propinsi di meta AplikasiPikeun Redux atanapi Henteu: Seni di structuring Propinsi di meta Topik AppsRelated: ES6ReactTools & Semalt "/>

papanggih nyeratna
Vasu K
Hola! Abdi pamekar Fullstack sarta ngajengkeun kuat Mobile Desain munggaran. Kuring ngajalankeun ngamimitian hiji barudak digital pikeun kids na I mingpin usaha rékayasa dinya. Dina jangka waktu nu gratis mah ramble ngeunaan téhnologi, jeung konsultasi startups.
Pikeun Redux atanapi Henteu: Seni di structuring Propinsi di meta AplikasiPikeun Redux atanapi Henteu: Seni di structuring Propinsi di meta Topik AppsRelated:
ES6ReactTools & Semalt
The Best Jalan mun Diajar meta pikeun Beginners
Wes Bos
A Tangtu latihan hambalan-demi-hambalan keur meunang nu ngawangun dunya nyata meta. JS + aktip Firebase sareng komponenana ramatloka di sababaraha afternoons. Kode Paké Kupon 'SITEPOINT' di Checkout mun meunang 25% kaluar .
March 1, 2018