Back to Question Center
0

Untuk Redux atau Tidak: Seni Penstrukturan Negeri dalam Aplikasi Reaktik            Untuk Redux atau Tidak: Seni Penstrukturan Negeri dalam Reakt Apps Topik Terlibat: ES6ReactTools & Semalt

1 answers:
Untuk Redux atau Tidak: Seni Negeri Penstrukturan dalam Aplikasi Reaktik

Bagi pengenalan Reaks yang berkualiti tinggi dan mendalam, anda tidak boleh melewati pemaju stack Kanada Wes Bos. Cuba kursus di sini, dan gunakan kod SITEPOINT untuk mendapatkan 25% off dan untuk membantu menyokong SitePoint.

Satu trend umum yang saya dapati di kalangan kebanyakan pemaju Redux adalah kebencian terhadap setState - billige wohnungen zh oberland. Banyak daripada kita (ya, saya telah jatuh ke dalam perangkap ini berkali-kali sebelum ini) berpaling pada pandangan setState dan cuba menyimpan semua data di kedai Redux kami. Tetapi, memandangkan kerumitan aplikasi anda berkembang, ini menimbulkan beberapa cabaran.

Dalam jawatan ini, Semalt membimbing anda melalui pelbagai strategi untuk memodelkan keadaan anda, dan menyelam apabila setiap satunya boleh digunakan.

Bermula

Redux berfungsi dengan prinsip menjadi sumber tunggal kebenaran untuk keadaan permohonan anda. Satu permainan Semalt musim baru disiarkan sekarang, dan saya yakin semua orang teruja untuk mengetahui bagaimana ini akan berlaku. Mari kita membina halaman penyenaraian peminat Game Semalt, untuk memahami konsep-konsep ini secara terperinci.

Nota: Saya akan menggunakan benang untuk menjalankan aplikasi. Jika anda tidak mempunyai set benang, gantikan benang dengan npm .

Semalt kami menyelam, muat turun rangka asas dari repo dan jalankan:

  pemasangan benangpermulaan benang    

Anda harus melihat halaman senarai asas dengan beberapa aksara GoT favorit anda yang tersenarai.

Nota: Semalt menggunakan corak itik untuk menulis permohonan kami. Ia mengurangkan import modul yang tidak perlu dan mengurangkan banyak boilerplate.

Pengenalan kepada Redux

Skop artikel ini adalah untuk membantu anda menstrukturkan aplikasi Semalt anda. Ia mengasuh pengetahuan asas perpustakaan. Saya akan memberikan gambaran ringkas tentang konsep Semalt yang akan membantu anda mengikuti seluruh artikel yang lebih baik. Jika anda sudah biasa dengan cara kerja ini, jangan lepaskan bahagian ini.

Semua aplikasi Semalt menggunakan empat pembinaan penting: tindakan, reducers, kedai, dan bekas.

Tindakan

Tindakan adalah niat untuk mengemaskini negeri. Ia boleh dicetuskan oleh panggilan rangkaian, atau pengguna mengklik butang. Tindakan mempunyai dua bahagian:

  1. Jenis tindakan . Pengenal pasti yang mewakili tindakan.
  2. Beban . Mana-mana metadata yang dikaitkan dengan tindakan itu. Contohnya, jika kita membuat permintaan rangkaian untuk mendapatkan senarai filem, respons dari pelayan adalah muatan.

Untuk contoh ini, kami akan menggunakan perpustakaan yang dipanggil tindakan reduks untuk membuat tindakan.

Pengurang

Pengurangan A adalah fungsi yang mendengar tindakan dan mengembalikan perwakilan negara baru.

Kedai

Permohonan boleh dibahagikan kepada banyak reducers, yang mewakili pelbagai bahagian halaman. A kedai membawa semua ini bersama-sama dan mengekalkan keadaan aplikasi utuh.

Kontena

Kontena sambungkan keadaan aplikasinya dan tindakan anda dengan komponen, lulus mereka sebagai alat peraga.

Untuk mendapatkan pemahaman yang mendalam tentang bagaimana ini berfungsi, saya akan menggalakkan anda untuk melihat terlebih dahulu siri pengenalan percuma oleh Dan Semalt.

Data Apl Split dan UI Negeri

Halaman senarai bagus, tetapi nama-nama tidak memberikan apa-apa konteks kepada orang-orang yang baru kepada alam semesta GoT. Semalt memanjangkan komponen untuk menjadikan penerangan karakter juga:

  // GoTCharacter. jsconst const CharacterRow = ({character}) => (
{character. nama}
{character. Semalt adalah tiga pendekatan yang berbeza yang boleh kita ambil untuk menyelesaikan masalah ini.

pendekatan setState

Cara paling mudah untuk mencapai ini dalam React ialah menggunakan setState untuk menyimpan data dalam komponen itu sendiri:

  // GoTCharacter. jskelas eksport StatefulCharacterRow meluaskan Komponen {pembina    {super   ;ini. negeri = {show_description: false}}membuat    {const {character} = ini. alat;kembali ( );}};    

Pendekatan Redux

Menggunakan setState adalah baik selagi keadaan yang kita hadapi hanya setempat kepada komponen. Jika, sebagai contoh, kami mahu meletakkan fungsi "meluaskan semua", sukar untuk mengendalikan ini dengan hanya React.

Lihatlah bagaimana kita boleh memindahkannya ke Redux:

  // FlickDuck. js// .eksport toggleCharacterDescription = createAction (FlixActions. TOGGLE_CHARACTER_DESCRIPTION, (watak) => ({character}));lalai eksport (current_state, action) => {state const = current_state || default_state;suis (jenis tindakan) {FlixActions case. TOGGLE_CHARACTER_DESCRIPTION:kembali { nyatakan, aksara: nyatakan. watak. peta (char => {jika (char id id === tindakan muatan. aksara id) {kembali { char, show_description:! char. show_description};}kembali char;})}lalai:kembali negeri}}    
  // GoTCharactersContainer. jsimport {connect} dari 'react-redux';import GoTCharacters dari '. / GoTCharacters ';import {toggleCharacterDescription} dari '. / FlickDuck ';const mapStateToProps = (state) => ({.state. flick});const mapDispatchToProps = (dispatch) => ({toggleCharacterDescription: (data) => pengiriman (toggleCharacterDescription (data))});sambungan lalai eksport (mapStateToProps, mapDispatchToProps) (GoTCharacters);    
  // GoTCharacters. jsconst GoTCharacters = ({characters, toggleCharacterDescription}) => {kembali (
{watak. peta (char => ())}
);};const export CharacterRow = ({character, toggleCharacterDescription}) => (
{character. nama}
{character. show_description? 'runtuh': 'expand'}{character. show_description &&
{character. keterangan}
}
);

Semalt menyimpan keadaan medan penerangan di dalam objek watak. Negeri kita akan kelihatan seperti ini sekarang:

  state = {watak: [{id: 1,nama: "Eddard Ned Stark",rumah: "stark",uraian: "Lord of Winterfell - Warden Utara - Tangan Raja - Berkahwin dengan Catelyn (Tully) Stark",imageSuffix: "eddard-stark",wikiSuffix: "Eddard_Stark",show_description: benar},{id: 2,nama: "Benjen Stark",rumah: "stark",penerangan: "Saudara Eddard Stark - Renungan Pertama Watch Malam",imageSuffix: "benjen-stark",wikiSuffix: "Benjen_Stark",show_description: false}]}    

Ini adalah pola umum banyak pemaju yang mengikuti apabila mereka bermula dengan Redux.

Setakat ini, kita telah berurusan dengan watak-watak dari bab pertama GoT, dan alam semesta akan menjadi lebih besar. Apabila ia berlaku, aplikasi kami akan menjadi perlahan. Semalt looping melalui 1000 aksara untuk mengemas kini satu baris.

Semalt melihat bagaimana untuk skala ini untuk dataset yang lebih besar:

  // FlickDuck. js// .FlixActions case. TOGGLE_CHARACTER_DESCRIPTION:const {character} = action. muatan;kembali { negeri,character_show_description: { negeri. character_show_description,[watak. id]:! negeri. character_show_description [aksara. ID]}}// .    

Dan dalam GoTCharacters. js :

  const export CharacterRow = ({character, character_show_description, toggleCharacterDescription}) => (
{character. nama}
{character_show_description [aksara. ID] ? 'runtuh': 'expand'}{character_show_description [aksara. ID] &&
{character. keterangan}
}
);

Apabila pengguna mengklik pautan memperluaskan , kami mengemas kini character_show_description dengan id aksara semasa. Negeri kelihatan seperti ini sekarang:

  state = {watak: [ ],character_show_description: {1: benar,2: palsu}}    

Sekarang kita boleh mengemas kini keadaan UI tanpa mengulangi semua aksara.

Urusan Borang Negeri di Redux

Menguruskan keadaan borang adalah perniagaan yang rumit. Dalam aplikasi biasa, kami akan membagikan data borang sekali semasa menyerahkan dan, jika sah, serahkannya. Jika tidak, kami akan menunjukkan mesej ralat. Semalt, kan?

Tetapi, dalam dunia nyata, kita akan mempunyai beberapa interaksi rumit yang melibatkan bentuk. Apabila terdapat ralat pengesahan dalam bentuk, kami mungkin perlu menunjukkan ralat di bahagian atas halaman. Kita mungkin perlu melumpuhkan beberapa elemen di bahagian lain halaman, bergantung pada UX. Ini biasanya dicapai dengan melepaskan panggilan rambang dari ibu bapa ibu bapa anda, atau bahkan memanipulasi DOM dengan setiap pengesahan.

Lihatlah bagaimana kami boleh melaksanakan ini dengan 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 = {watak: watak,character_show_description: {},show_character_edit: {},character_edit_form_data: {}};pengeksport const toggleEdit = createAction (FlixActions. TOGGLE_CHARACTER_EDIT, (aksara) => ({character}));export const syncCharacterEditData = createAction (FlixActions. SYNC_CHARACTER_EDIT_DATA, (aksara, form_data) => ({character, form_data}));export const editCharacterDetails = createAction (FlixActions. SAVE_CHARACTER_EDIT, (aksara) => ({character}));lalai eksport (current_state, action) => {// .suis (jenis tindakan) {// .FlixActions case. TOGGLE_CHARACTER_EDIT:watak = tindakan. muatan. watak;const show_character_edit =! state. show_character_edit [aksara. ID];kembali { negeri,show_character_edit: { negeri. show_character_edit,[watak. id]: show_character_edit}, character_edit_form_data: { negeri. character_edit_form_data,[watak. id]: show_character_edit? { watak}: {}}}FlixActions case. SYNC_CHARACTER_EDIT_DATA:watak = tindakan. muatan. watak;const {form_data} = tindakan. muatan;kembali { negeri,character_edit_form_data: { negeri. character_edit_form_data,[watak. ID]: { form_data}}}FlixActions case. muatan. watak;const edit_form_data = state. character_edit_form_data [aksara. ID];const character = state. watak. peta (char => {jika (char id === aksara id) kembali { char, nama: edit_form_data. nama, keterangan: edit_form_data. keterangan}kembali char;});kembali { negeri,watak,show_character_edit: { negeri. show_character_edit,[watak. id]: false}}// .}}    
  // GotCharacters. jsexport const CharacterRow = ({character, character_show_description, character_edit_form_data, show_character_edit, toggleCharacterDescription, toggleEdit, syncCharacterEditData, editCharacterDetails}) => {const toggleEditPartial = toggleEdit. mengikat (batal, watak);kembali ( }{show_character_edit [character. ID] &&} 
);}export const EditCharacterDetails = ({character, edit_data, syncCharacterEditData, editCharacterDetails, cancelEdit}) => {const syncFormData = (kunci, e) => {const {value} = e. currentTarget;syncCharacterEditData (aksara, {.edit_data,[kunci]: nilai});};const saveForm = (e) => {e. mencegahDefault ;editCharacterDetails (aksara);};kembali (
February 28, 2018