Back to Question Center
0

Kanggo Redux utawa Ora: Seni Strukturing Negara ing Aplikasi Reactip            Kanggo Redux utawa Ora: Seni Ngripta Negara ing Aplikasi ReactRelated Topics: ES6ReactTools & Semalat

1 answers:
Kanggo Redux utawa Ora: Seni Struktur Bangunan Negara ing Aplikasi React

Kanggo ngenalaken babagan React, sampeyan ora bisa nglangkungi pangembang lengkap stack Kanada Wes Bos. Coba tuju kene, lan gunakake kodhe SITEPOINT kanggo njaluk 25% mati lan mbantu support SitePoint.

Siji gaya umum sing ditemokake ing antarane pangembang Redux yaiku gething marang setState - velgede ja rehvide sobivustabel. Akeh kita (ya, aku wis tiba ing sworo cangkem iki pirang-pirang liyane sadurunge) flinch ing ngarsane setState lan nyoba kanggo nyimpen kabeh data ing Redux kita nyimpen. Nanging, amarga kerumitan aplikasi sampeyan mundhak, iki ndadekake tantangan.

Ing postingan kasebut, Semalt mlayu ngliwati macem-macem strategi kanggo model negara sampeyan, lan nyelehake nalika saben wong bisa digunakake.

Miwiti

Redux ngupayakake prinsip dadi sumber kebenaran kanggo negara aplikasi sampeyan. Game anyar Semt musim ditayangke saiki, lan aku manawa kabeh wong bungah kanggo ngerti carane iki bakal mbukak. Ayo nggawe game Game penggemar Semalt sing nyenengake, kanggo mangerteni konsep-konsep kasebut ing rinci.

Wigati: Aku bakal nggunakake benang kanggo mbukak app. Yen sampeyan ora nyiyapake benang, ganti benang karo npm .

Semalat kita nyelehake, download kerangka dhasar saka repo lan mbukak:

  benang nginstalbenang wiwit mbukak    

Sampeyan kudu ndeleng dhaptar dhaptar dhasar kanthi sawetara karakter GoT favorit sing kadhaptar.

Wigati: Semalat nggunakake pola bebek kanggo nulis aplikasi kita. Iku nyuda impor modul sing ora perlu lan ngeculake akeh boilerplate.

Pengantar Redux

Ruang lingkup artikel iki kanggo mbantu sampeyan ngolah aplikasi Semalt sampeyan. Iki minangka kawruh dhasar perpustakaan. Aku bakal menehi gambaran singkat babagan konsep Semalt sing bakal mbantu ngetutake sisa artikel luwih apik. Yen sampeyan lagi kenal carane kerjane iki, wenehono gratis kanggo ngliwati bagean iki.

Kabeh aplikasi Semalt nggawe nggunakake papat constructs: tumindak, reducers, nyimpen, lan kontainer.

Tindakan

Tindakan minangka niat kanggo nganyari negara. Bisa dipicu karo panggilan jaringan, utawa pangguna ngeklik tombol. Tumindak nduweni loro bagean:

  1. Jenis Tindakan . Pengenal unik sing makili sawijining tindakan.
  2. Payload . Sembarang metadata sing ana gegayutan karo tumindak. Umpamane, yen kita nggawe panjalukan jaringan kanggo njupuk dhaptar film, respon saka server yaiku mbayar.

Kanggo conto iki, kita bakal nggunakake perpustakaan sing disebut redux-actions kanggo nggawe tindakan.

Reducers

A reducer minangka fungsi sing ngrungokake tumindak lan ngasilake perwakilan negara anyar.

Toko

Aplikasi bisa dipérang dadi akeh pangurang, sing nuduhake manéka bagean bagéan kaca. A nyimpen ndadekke kabeh iki bebarengan lan terus negara app utuh.

kontainer

Kontainer sambungake app app lan tumindak karo komponen, maringake dheweke mudhun minangka prop.

Kanggo njaluk pangerten jero babagan cara iki, aku bakal nganjurake sampeyan ndeleng dhisik ing seri introduksi gratis dening Dan Semalt.

Split App Data lan UI Negara

Kaca dhaptar apik, nanging jeneng ora menehi konteks menyang wong sing anyar menyang universitas GoT. Semalt ngluwihi komponen kanggo menehi gambaran karakter uga:

  // GoTCharacter. jsekspor const CharacterRow = ({karakter}) => (
{karakter. jeneng}
{karakter. Semalat minangka telung pendekatan sing bisa kita lakokake kanggo ngatasi masalah iki.

Pendekatan setState

Cara paling gampang kanggo entuk iki ing React yaiku nggunakake setState kanggo nyimpen data ing komponen dhewe:

  // GoTCharacter. jskelas Export StatefulCharacterRow ngluwihi Komponen {Konstruktor    {super   ;iki. negara = {show_description: false}}nerjemahake    {const {character} = iki. alat;bali ( );}};    

Pendekatan Redux

Nggunakake setState apik wae sakwene negara kita ngurusi mung lokal kanggo komponen. Yen, umpamane, kita pengin nggawe fungsi "nggedhekake kabeh", bakal angel ditangani kanthi React.

Ayo ndeleng carane kita bisa mindhah iki kanggo Redux:

  // FlickDuck. js// .ekspor const toggleCharacterDescription = createAction (FlixActions. TOGGLE_CHARACTER_DESCRIPTION, (karakter) => ({karakter}));standar ekspor (current_state, action) => {const state = current_state || default_state;switch (action type) {FlixActions case. TOGGLE_CHARACTER_DESCRIPTION:bali { negara, karakter: negara. karakter. peta (char => {yen (char id === aksi muatan payload karakter id) {bali { char, show_description:! char. show_description};}bali char;}}}gawan:bali negara}}    
  // GoTCharactersContainer. jsngimpor {connect} saka 'react-redux';ngimpor GoTCharacters saka '. / GoTCharacters ';ngimpor {toggleCharacterDescription} saka '. / FlickDuck ';const mapStateToProps = (negara) => ({.});const mapDispatchToProps = (dispatch) => ({toggleCharacterDescription: (data) => dispatch (toggleCharacterDescription (data))});export default connect (mapStateToProps, mapDispatchToProps) (GoTCharacters);    
  // GoTCharacters. jsconst GoTCharacters = ({karakter, toggleCharacterDescription}) => {bali (
{aksara. peta (char => ())}
);};ekspor const CharacterRow = ({karakter, toggleCharacterDescription}) => (
{karakter. jeneng}
{karakter. show_description? 'runtuh': 'nggedhekake'}Panjenengan saged mbiyantu{karakter. show_description &&
{karakter. description}
}
);

Semal nyimpen kahanan bidang deskripsi ing sajrone obyek karakter. Negara kita bakal katon kaya saiki:

  negara = {karakter: [{id: 1,jeneng: "Eddard Ned Stark",house: "stark",description: "Lord of Winterfell - Warden of the North - Hand of the King - Married to Catelyn (Tully) Stark",imageSuffix: "eddard-stark",wikiSuffix: "Eddard_Stark",show_description: bener},{id: 2,jeneng: "Benjen Stark",house: "stark",deskripsi: "Kakang Eddard Stark - Ranger pisanan saka Watch Wengi",imageSuffix: "benjen-stark",wikiSuffix: "Benjen_Stark",show_description: false}]}    

Iki pola umum akeh pangembang ngetut nalika lagi mulai karo Redux.

Mangkene, kita wis nemokake karakter-karakter saka bab pisanan saka GoT, lan alam semesta bakal luwih gedhe. Nalika iku, aplikasi kita bakal dadi alon. Semalt nggeluwar liwat 1000 karakter kanggo nganyari siji baris.

Semalat ndeleng ukuran kanggo didefinisian luwih dhuwur:

  // FlickDuck. js// .FlixActions case. TOGGLE_CHARACTER_DESCRIPTION:const {character} = action. payload;bali { negara,character_show_description: { negara. character_show_description,[karakter. id]:! state. character_show_description [karakter. id]}}// .    

lan ing GoTCharacters. js :

  ekspor const CharacterRow = ({karakter, character_show_description, toggleCharacterDescription}) => (
{karakter. jeneng}
{character_show_description [karakter. id]? 'runtuh': 'nggedhekake'}Panjenengan saged mbiyantu{character_show_description [karakter. id] &&
{karakter. description}
}
);

Nalika pangguna klik ing nggedhekake link, kita nganyari character_show_description karo id karakter saiki. Negara iki katon kaya saiki:

  negara = {karakter: [ ],character_show_description: {1: bener,2: palsu}}    

Saiki kita bisa nganyari negara UI tanpa nggulingake kabeh karakter.

Ngatur Formulir Negara ing Redux

Ngatur wangun negara minangka bisnis angel. Ing aplikasi khas, kita bakal nyiut seri data formulir sakwisé ngirim lan, yen sah, ngirim. Yen ora, kita bakal nuduhake pesen kesalahan. Semalat, kan?

Nanging, ing donya nyata, kita bakal duwe interaksi rumit sing nglibatno formulir. Nalika ana kesalahan validasi ing formulir, kita kudu nuduhake kasalahan ing ndhuwur kaca. Kita bisa uga kudu ngaktifake sawetara unsur ing sisih liyane, gumantung ing UX. Iki biasane ditindakake kanthi ngliwati panggilan balik acak saka tuwane wong tuwane 'wong tuwane, utawa malah manipulasi DOM kanthi saben validasi.

Ayo ndeleng carane kita bisa ngleksanakake iki karo Redux:

  // FlickDuck. js// ============const FlixActions = 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: {},karakter_edit_form_data: {}};ekspor const toggleEdit = createAction (FlixActions. TOGGLE_CHARACTER_EDIT, (karakter) => ({karakter}));export const syncCharacterEditData = createAction (FlixActions. SYNC_CHARACTER_EDIT_DATA, (karakter, form_data) => ({karakter, form_data}));ekspor const editCharacterDetails = createAction (FlixActions. SAVE_CHARACTER_EDIT, (karakter) => ({karakter}));standar ekspor (current_state, action) => {// .switch (action type) {// .FlixActions case. TOGGLE_CHARACTER_EDIT:karakter = tumindak. payload. karakter;const show_character_edit = negara. show_character_edit [karakter. id];bali { negara,show_character_edit: { negara. show_character_edit,[karakter. id]: show_character_edit}, character_edit_form_data: { negara. karakter_edit_form_data,[karakter. id]: show_character_edit? { karakter}: {}}}FlixActions case. SYNC_CHARACTER_EDIT_DATA:karakter = tumindak. payload. karakter;const {form_data} = action. payload;bali { negara,character_edit_form_data: { negara. karakter_edit_form_data,[karakter. id]: { form_data}}}FlixActions case. payload. karakter;const edit_form_data = state. character_edit_form_data [karakter. id];const karakter = state. karakter. peta (char => {yen (char id === karakter id) bali { char, name: edit_form_data. jeneng, katrangan: edit_form_data. description}bali char;});bali { negara,karakter,show_character_edit: { negara. show_character_edit,[karakter. id]: false}}// .}}    
  // GotCharacters. jsexport const CharacterRow = ({karakter, karakter_show_description, karakter_edit_form_data, show_character_edit, toggleCharacterDescription, toggleur, syncCharacterEditData, editCharacterDetails}) => {const toggleEditPartial = toggleEdit. ikatan (null, karakter);bali (
{karakter. jeneng}
{character_show_description [karakter. id]? 'runtuh': 'nggedhekake'}Panjenengan saged mbiyantu{! character_show_description [karakter. id] && suntingSandi{character_show_description [karakter. id] &&
{karakter. description}
}{show_character_edit [karakter. id] &&}
);}export const EditCharacterDetails = ({karakter, edit_data, syncCharacterEditData, editCharacterDetails, cancelEdit}) => {const syncFormData = (tombol, e) => {const {value} = e. saikiTarget;syncCharacterEditData (karakter, {.edit_data,[key]: value});};const saveForm = (e) => {e. preventDefault ;editCharacterDetails (karakter);};bali (

March 1, 2018