Back to Question Center
0

ເພື່ອ Redux ຫຼືບໍ່: ສິນລະປະຂອງ Structuring ລັດໃນກິດຕິກິລິຍາ            ກັບ Redux ຫຼືບໍ່: ສິນລະປະຂອງໂຄງປະກອບການລັດໃນກິດຈະກໍາປະຕິກິລິຍາຫົວຂໍ້: ES6ReactTools & Semalt

1 answers:
ເພື່ອ Redux ຫຼືບໍ່: ສິນລະປະຂອງ Structuring ລັດໃນກິດຕິກິຣິຍາ

ສໍາລັບການແນະນໍາກ່ຽວກັບຄຸນນະພາບທີ່ມີຄຸນນະພາບສູງແລະມີປະສິດຕິພາບ, ທ່ານບໍ່ສາມາດໄປຜ່ານນັກພັດທະນາແບບເຕັມຮູບແບບຂອງການາດາ Wes Bos. ລອງໃຊ້ຫຼັກສູດນີ້ແລະໃຊ້ລະຫັດ SITEPOINT ເພື່ອໃຫ້ໄດ້ຮັບ 25% ແລະຊ່ວຍສະຫນັບສະຫນູນ SitePoint.

ແນວໂນ້ມທີ່ຂ້ອຍພົບໃນບັນດານັກພັດທະນາ Redux ສ່ວນໃຫຍ່ແມ່ນຄວາມກຽດຊັງຕໍ່ setState . ພວກເຮົາຫຼາຍຄົນ (ແມ່ນແລ້ວ, ຂ້າພະເຈົ້າໄດ້ລົ້ມລົງເຂົ້າໄປໃນຄຸກຫຼາຍຄັ້ງກ່ອນ) flinch ຢູ່ sight ຂອງ setState ແລະພະຍາຍາມເກັບຮັກສາຂໍ້ມູນທັງຫມົດໃນຮ້ານ Redux ຂອງພວກເຮົາ. ແຕ່ວ່າ, ຄວາມສັບສົນຂອງຄໍາຮ້ອງສະຫມັກຂອງທ່ານເຕີບໃຫຍ່ຂຶ້ນ, ນີ້ກໍ່ເປັນສິ່ງທ້າທາຍຫຼາຍຢ່າງ.

ໃນການລົງທະບຽນນີ້, Semalt ຈະນໍາທ່ານຜ່ານກົນລະຍຸດຕ່າງໆເພື່ອສ້າງສະຖານະພາບຂອງທ່ານ, ແລະເຂົ້າໄປໃນເວລາທີ່ພວກເຂົາສາມາດນໍາໃຊ້ໄດ້.

ການເລີ່ມຕົ້ນ

Redux ເຮັດວຽກຮ່ວມກັບຫຼັກການຂອງການເປັນແຫລ່ງຄວາມຈິງດຽວສໍາລັບສະພາບການນໍາໃຊ້ຂອງທ່ານ. ເກມໃຫມ່ຂອງເກມ Semalt ແມ່ນ airing ໃນປັດຈຸບັນ, ແລະຂ້າພະເຈົ້າແນ່ໃຈວ່າທຸກຄົນຕື່ນເຕັ້ນທີ່ຈະຮູ້ວ່າວິທີການນີ້ຈະຂະຫຍາຍຕົວ. ໃຫ້ສ້າງເກມທີ່ມ່ວນຊື່ນຂອງຫນ້າການພັດທະນາ Semalt, ເພື່ອເຂົ້າໃຈແນວຄວາມຄິດເຫຼົ່ານີ້ໂດຍລະອຽດ.

ຫມາຍເຫດ: ຂ້ອຍຈະໃຊ້ ເສັ້ນດ້າຍ ເພື່ອດໍາເນີນການແອັບຯ. ຖ້າທ່ານບໍ່ໄດ້ກໍານົດເສັ້ນດ້າຍ, ໃຫ້ປ່ຽນເສັ້ນໄຍດ້ວຍ ນາທີ .

Semalt ພວກເຮົາເຊົາໃນ, ດາວໂຫຼດໂຄງຮ່າງພື້ນຖານຈາກ repo ແລະດໍາເນີນການ:

  ການຕິດຕັ້ງເສັ້ນດ້າຍເລີ່ມຕົ້ນເສັ້ນດ້າຍ    

ທ່ານຄວນຈະເຫັນຫນ້າບັນຊີລາຍຊື່ຂັ້ນພື້ນຖານທີ່ມີລັກສະນະຂອງຄຸນລັກສະນະ GoT ທີ່ທ່ານມັກ.

ຫມາຍເຫດ: ຂີ້ເຫຍື້ອໃຊ້ທ່ອນໄມ້ເພື່ອຂຽນຄໍາຮ້ອງຂໍຂອງພວກເຮົາ. ມັນຊ່ວຍຫຼຸດຜ່ອນການນໍາເຂົ້າໂມດູນທີ່ບໍ່ຈໍາເປັນແລະຫຼຸດລົງໃສ່ຫມໍ້ຫຸງຕົ້ມຫຼາຍ.

Intro to Redux

ຂອບເຂດຂອງບົດຄວາມນີ້ແມ່ນເພື່ອຊ່ວຍໃຫ້ທ່ານສ້າງໂຄງການຂອງທ່ານ. ມັນຄາດວ່າຈະມີຄວາມຮູ້ພື້ນຖານຂອງຫ້ອງສະຫມຸດ. ຂ້າພະເຈົ້າຈະໃຫ້ສະຫຼຸບໂດຍຫຍໍ້ກ່ຽວກັບແນວຄິດ Semalt ທີ່ຈະຊ່ວຍໃຫ້ທ່ານປະຕິບັດຕາມສ່ວນທີ່ເຫຼືອຂອງບົດຄວາມທີ່ດີກວ່າ. ຖ້າທ່ານຮູ້ຈັກວິທີການເຮັດວຽກເຫຼົ່ານີ້, ກະລຸນາໃຫ້ຂ້າມສ່ວນນີ້.

ກິດທັງຫມົດຂອງ Semalt ເຮັດໃຫ້ການນໍາໃຊ້ສີ່ສ້າງທີ່ສໍາຄັນ: ການປະຕິບັດ, ການຫຼຸດຜ່ອນ, ຮ້ານ, ແລະບັນຈຸ.

ການກະທໍາ

ການກະທໍາ ແມ່ນຄວາມຕັ້ງໃຈທີ່ຈະປັບປຸງສະຖານະການ. ມັນອາດຈະຖືກເອີ້ນໂດຍການໂທເຄືອຂ່າຍຫຼືຜູ້ໃຊ້ທີ່ກົດປຸ່ມ. ການປະຕິບັດມີສອງສ່ວນ:

  1. ປະເພດການປະຕິບັດ . ຕົວກໍານົດການເປັນເອກະລັກເຊິ່ງເປັນຕົວແທນການປະຕິບັດ.
  2. ຈ່າຍເງິນ . metadata ໃດທີ່ກ່ຽວຂ້ອງກັບການປະຕິບັດ. ຕົວຢ່າງ: ຖ້າພວກເຮົາເຮັດການຮ້ອງຂໍເຄືອຂ່າຍເພື່ອຄົ້ນຫາລາຍະການຂອງພາພະຍົນ, ການຕອບສະຫນອງຈາກເຄື່ອງແມ່ຂ່າຍແມ່ນຄ່າໃຊ້ຈ່າຍ.

ສໍາລັບຕົວຢ່າງນີ້, ພວກເຮົາຈະໃຊ້ຫ້ອງສະຫມຸດທີ່ເອີ້ນວ່າ ການປະຕິບັດການຫຼຸດຜ່ອນ ເພື່ອສ້າງການປະຕິບັດ.

Reducers

A reducer ແມ່ນຟັງຊັນທີ່ຟັງການປະຕິບັດແລະສົ່ງຄືນການເປັນຕົວແທນຂອງລັດໃຫມ່.

ຮ້ານຄ້າ

ຄໍາຮ້ອງສະຫມັກສາມາດແບ່ງອອກເປັນຜູ້ຫຼຸດຜ່ອນຈໍານວນຫຼາຍ, ເຊິ່ງສະແດງໃຫ້ເຫັນພາກສ່ວນຕ່າງໆຂອງຫນ້າ. A ຮ້ານ ເອົາທັງຫມົດເຫຼົ່ານີ້ຮ່ວມກັນແລະເຮັດໃຫ້ສະຖານະຂອງ app ຍັງ intact.

ຕູ້ຄອນເທນເນີ

ບັນຈຸ ເຊື່ອມຕໍ່ກັບສະຖານະຂອງກິດແລະກິດຈະກໍາຂອງທ່ານກັບອົງປະກອບ, ຖ່າຍທອດລົງໄປເປັນເຄື່ອງມື.

ເພື່ອໃຫ້ໄດ້ເຂົ້າໃຈຢ່າງເລິກເຊິ່ງກ່ຽວກັບວິທີການເຮັດວຽກນີ້, ຂ້າພະເຈົ້າຂໍແນະນໍາໃຫ້ທ່ານທໍາອິດເບິ່ງຊຸດການນໍາໃຊ້ຟຣີໂດຍ Dan Semalt.

Split App Data ແລະ UI State

ຫນ້າບັນຊີລາຍຊື່ແມ່ນງາມ, ແຕ່ຊື່ບໍ່ໃຫ້ສະພາບການໃດໆກັບຄົນທີ່ໃຫມ່ກັບວິທະຍາໄລ GoT. Semalt ຂະຫຍາຍອົງປະກອບເພື່ອສະແດງລາຍລະອຽດລັກສະນະເຊັ່ນ:

  // GoTCharacter jsexport const CharacterRow = ({character}) => (
{character name}
{character. Semalt ແມ່ນສາມວິທີທີ່ແຕກຕ່າງກັນທີ່ພວກເຮົາສາມາດໃຊ້ເພື່ອແກ້ໄຂບັນຫານີ້.

setState

ວິທີທີ່ງ່າຍທີ່ສຸດທີ່ຈະບັນລຸໃນ React ແມ່ນການໃຊ້ setState ເພື່ອເກັບຂໍ້ມູນພາຍໃນອົງປະກອບຂອງມັນເອງ:

  // GoTCharacter jsexport class StatefulCharacterRow extends Component {constructor    {super   ນີ້. state = {show_description: false}}render    {const {character} = this propsreturn ( )}}    

ວິທີການ Redux

ການນໍາໃຊ້ setState ແມ່ນດີກວ່າທີ່ລັດທີ່ພວກເຮົາກໍາລັງປະຕິບັດແມ່ນມີພຽງແຕ່ສ່ວນປະກອບສໍາລັບສ່ວນປະກອບ. ຖ້າຕົວຢ່າງ, ພວກເຮົາຕ້ອງການຈັດຕັ້ງປະຕິບັດຫນ້າທີ່ "ຂະຫຍາຍທັງຫມົດ", ມັນຈະມີຄວາມຫຍຸ້ງຍາກໃນການຈັດການກັບເຫດການນີ້.

ໃຫ້ເບິ່ງວິທີທີ່ພວກເຮົາສາມາດຍ້າຍນີ້ໄປ Redux:

  // FlickDuck js//export const constraint CharacterDescription = createAction (FlixActions. TOGGLE_CHARACTER_DESCRIPTION, (ຕົວອັກສອນ) => ({ຕົວອັກສອນ}))export default (current_state, action) => {const state = current_state || default_stateປ່ຽນ (ປະຕິບັດປະເພດ) {case FlixActions TOGGLE_CHARACTER_DESCRIPTION:return { ທີ່ຢູ່ ທີ່ຢູ່ ລັດ, ລັກສະນະ: ລັດ. ຕົວອັກສອນ ແຜນທີ່ (char => {ຖ້າ (char id = action payload character id) {return { ທີ່ຢູ່ ທີ່ຢູ່ char, show_description:! char show_description}}return char})}default:return state}}    
  // GoTCharactersContainer jsimport {connect} ຈາກ 'react-redux';ນໍາເຂົ້າ GoTCharacters ຈາກ '. / GoTCharacters 'ນໍາເຂົ້າ {toggleCharacterDescription} ຈາກ '. / FlickDuck 'const mapStateToProps = (state) => ({state flick})const mapDispatchToProps = (dispatch) => ({toggleCharacter ຄໍາອະທິບາຍ: (data) => dispatch (toggleCharacterDescription (data))})ການສົ່ງອອກຕົ້ນແບບການເຊື່ອມຕໍ່ (mapStateToProps, mapDispatchToProps) (GoTCharacters);    
  // GoTCharacters jsconst GoTCharacters = ({characters, toggleCharacterDescription}) => {ກັບມາ (
{characters map (char => ())}
)}export const CharacterRow = ({character, toggleCharacterDescription}) => (
{character name}
{character show_description? 'collapse': 'expand'}{character show_description &&
{character ຄໍາອະທິບາຍ}
}
)

Semalt ເກັບສະຖານະຂອງເຂດຄໍາອະທິບາຍພາຍໃນວັດຖຸລັກສະນະ. ລັດຂອງພວກເຮົາຈະມີລັກສະນະເຊັ່ນນີ້:

  state = {ຕົວອັກສອນ: [{id: 1,ຊື່: "Eddard Ned Stark",ເຮືອນ: "stark",ລາຍລະອຽດ: "Lord of Winterfell - Warden of the North - ມືຂອງຄົນ - ແຕ່ງງານກັບ Catelyn (Tully) Stark",imageSuffix: "eddard-stark",wikiSuffix: "Eddard_Stark",show_description: true},{id: 2,ຊື່: "Benjen Stark",ເຮືອນ: "stark",ລາຍລະອຽດ: "ອ້າຍຂອງ Eddard Stark - Ranger ທໍາອິດຂອງ Watch ກາງຄືນຂອງ",imageSuffix: "benjen-stark",wikiSuffix: "Benjen_Stark",show_description: false}]}    

ນີ້ແມ່ນຮູບແບບທົ່ວໄປທີ່ນັກພັດທະນາຫຼາຍຄົນປະຕິບັດຕາມເມື່ອພວກເຂົາກໍາລັງເລີ່ມຕົ້ນດ້ວຍ Redux.

ຈົນກ່ວາມານີ້, ພວກເຮົາໄດ້ຈັດການກັບລັກສະນະຂອງບົດທໍາອິດຂອງ GoT, ແລະຈັກກະວານແມ່ນກ່ຽວກັບການທີ່ຈະໄດ້ຮັບຫຼາຍກວ່າທັງຫມົດ. ເມື່ອມັນບໍ່, app ຂອງພວກເຮົາຈະກາຍເປັນຊ້າ. Semalt looping ຜ່ານ 1000 ຕົວອັກສອນເພື່ອອັບເດດຫນຶ່ງແຖວ.

Semalt ເບິ່ງວິທີການຂະຫນາດນີ້ສໍາລັບຊຸດຂໍ້ມູນຂະຫນາດໃຫຍ່:

  // FlickDuck js//case FlixActions TOGGLE_CHARACTER_DESCRIPTION:const {character} = action payloadreturn { ທີ່ຢູ່ ທີ່ຢູ່ state,character_show_description: {. ທີ່ຢູ່ ທີ່ຢູ່ state character_show_description,[ລັກສະນະ. id]:! state character_show_description [character id]}}//    

ແລະໃນ GoTCharacters. js :

  export const CharacterRow = ({character, character_show_description, toggleCharacterDescription}) => (
{character name}
{character_show_description [character id]? 'collapse': 'expand'}{character_show_description [character id] &&
{character ຄໍາອະທິບາຍ}
}
)

ເມື່ອຜູ້ໃຊ້ຄລິກໃສ່ການເຊື່ອມຕໍ່ ຂະຫຍາຍ , ພວກເຮົາປັບປຸງ character_show_description ກັບ id ຕົວອັກສອນໃນປັດຈຸບັນ. ລັດເບິ່ງຄືວ່ານີ້ຕອນນີ້:

  state = {ຕົວອັກສອນ: [. ທີ່ຢູ່ ທີ່ຢູ່ ],character_show_description: {1: ຈິງ,2: false}}    

ໃນປັດຈຸບັນພວກເຮົາສາມາດປັບປຸງລັດ UI ໄດ້ໂດຍບໍ່ຕ້ອງກັງວົນຫຼາຍກວ່າລັກສະນະທັງຫມົດ.

ການຄຸ້ມຄອງແບບຟອມລັດໃນ Redux

ການຄຸ້ມຄອງລັດແບບຟອມແມ່ນທຸລະກິດທີ່ຫຍຸ້ງຍາກ. ໃນຄໍາຮ້ອງສະຫມັກແບບປົກກະຕິ, ພວກເຮົາຈະຄັດລອກຂໍ້ມູນໃນແບບຟອມຄັ້ງຫນຶ່ງໃນລະຫວ່າງການສົ່ງແລະຖ້າມັນຖືກຕ້ອງສົ່ງມັນ. ຖ້າບໍ່ດັ່ງນັ້ນ, ພວກເຮົາຈະສະແດງຂໍ້ຄວາມສະແດງຂໍ້ຜິດພາດ. Semalt, right?

ແຕ່ໃນໂລກທີ່ແທ້ຈິງ, ພວກເຮົາຈະມີການພົວພັນທີ່ສັບສົນບາງຢ່າງທີ່ກ່ຽວຂ້ອງກັບແບບຟອມ. ເມື່ອມີຂໍ້ຜິດພາດກ່ຽວກັບການກວດສອບໃນແບບຟອມ, ພວກເຮົາອາດຈະຕ້ອງສະແດງຂໍ້ຜິດພາດຢູ່ດ້ານເທີງຂອງຫນ້າ. ພວກເຮົາອາດຈໍາເປັນຕ້ອງປິດອົງປະກອບບາງຢ່າງຢູ່ໃນສ່ວນອື່ນຂອງຫນ້າ, ຂຶ້ນກັບ UX. ນີ້ແມ່ນປະສົບຜົນສໍາເລັດໂດຍຜ່ານການຕອບສະຫນອງການແຈກຢາຍ Random ຈາກພໍ່ແມ່ຂອງພໍ່ແມ່ຂອງພໍ່ແມ່ຂອງທ່ານ, ຫຼືແມ້ກະທັ້ງການຄຸ້ມຄອງ DOM ກັບການກວດສອບທຸກຄັ້ງ.

ໃຫ້ເບິ່ງວິທີທີ່ພວກເຮົາສາມາດນໍາໃຊ້ນີ້ກັບ 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 = {ຕົວອັກສອນ: ລັກສະນະ,character_show_description: {},show_character_edit: {},character_edit_form_data: {}}export const constanteEdit = createAction (FlixActions. TOGGLE_CHARACTER_EDIT, (ຕົວອັກສອນ) => ({ຕົວອັກສອນ}))export const syncCharacterEditData = createAction (FlixActions. SYNC_CHARACTER_EDIT_DATA, (ຕົວອັກສອນ, form_data) => ({character, form_data}))export const editCharacterDetails = createAction (FlixActions. SAVE_CHARACTER_EDIT, (ຕົວອັກສອນ) => ({ຕົວອັກສອນ}))export default (current_state, action) => {//ປ່ຽນ (ປະຕິບັດປະເພດ) {//case FlixActions TOGGLE_CHARACTER_EDIT:character = action payload ລັກສະນະ;const show_character_edit =! state show_character_edit [character id]return { ທີ່ຢູ່ ທີ່ຢູ່ state,show_character_edit: { ທີ່ຢູ່ ທີ່ຢູ່ state show_character_edit,[ລັກສະນະ. id]: show_character_edit}, character_edit_form_data: { ທີ່ຢູ່ ທີ່ຢູ່ state character_edit_form_data,[ລັກສະນະ. id]: show_character_edit? { ທີ່ຢູ່ ທີ່ຢູ່ ຕົວອັກສອນ}: {}}}case FlixActions SYNC_CHARACTER_EDIT_DATA:character = action payload ລັກສະນະ;const {form_data} = action payloadreturn { ທີ່ຢູ່ ທີ່ຢູ່ state,character_edit_form_data: {. ທີ່ຢູ່ ທີ່ຢູ່ state character_edit_form_data,[ລັກສະນະ. id]: {. ທີ່ຢູ່ ທີ່ຢູ່ form_data}}}case FlixActions. payload ລັກສະນະ;const edit_form_data = state character_edit_form_data [character id]const characters = state ຕົວອັກສອນ ແຜນທີ່ (char => {ຖ້າ (char id = character id) return { ທີ່ຢູ່ ທີ່ຢູ່ char, name: edit_form_data ຊື່, ຄໍາອະທິບາຍ: edit_form_data. ລາຍລະອຽດ}return char})return { ທີ່ຢູ່ ທີ່ຢູ່ state,ຕົວອັກສອນ,show_character_edit: { ທີ່ຢູ່ ທີ່ຢູ່ state show_character_edit,[ລັກສະນະ. id]: false}}//}}    
  // GotCharacters jsexport const CharacterRow = ({character, character_show_description, character_edit_form_data, show_character_edit, toggleCharacterDescription, toggleEdit, syncCharacterEditData, editCharacterDetails}) => {const switch toggleEditPartial = toggleEdit bind (null, character)return (
{character name}
{character_show_description [character id]? 'collapse': 'expand'}{! character_show_description [character. id] & & ແກ້ໄຂ}{character_show_description [character id] &&
{character ຄໍາອະທິບາຍ}
}{show_character_edit [character id] &&}
)}export const EditCharacterDetails = ({character, edit_data, syncCharacterEditData, editCharacterDetails, cancelEdit}) => {const syncFormData = (key, e) => {const {value} = e currentTargetsyncCharacterEditData (ຕົວອັກສອນ, {ແກ້ໄຂ _data,[ຄີ]: ມູນຄ່າ})}const saveForm = (e) => {e preventDefault editCharacterDetails (character)}ກັບມາ (
March 1, 2018