Back to Question Center
0

Redux эсвэл Not to: реактив аппликешн дэх бүтцийн урлаг            Редакц буюу үгүйсгэх: Урвалын Аппликейшн дэх бүтцийн хөгжилТухайн сэдэв: ES6ReactTools & Semalt

1 answers:
Redux эсвэл Not to: React аппликейшн дэх бүтцийн урлаг

React нь өндөр чанартай, гүнзгий танилцуулга бол, та Канадын бүрэн стек хөгжүүлэгч Wes Bos өнгөрсөн байж чадахгүй. Энд хичээлээ оруулаад SITEPOINT ашиглан 25% off авах ба SitePoint-ийг дэмжихэд туслах болно.

Хамгийн их хөгжүүлэгчдийн дунд миний олж мэдсэн нийтлэг хандлага бол setState -д үзэн яддаг. Бидний олон нь (тиймээ, би өмнө нь энэ удаад энэ удаад унасан) setState -ийг хараад бидний Redux дэлгүүрийн бүх мэдээллийг хадгалахыг хичээдэг. Гэвч таны хэрэглээний нарийн төвөгтэй байдал улам бүр нэмэгдэж байгаа тул энэ нь хэд хэдэн сорилтыг бий болгож байна - logiciel gestion des ressources humaines xls gratuit.

Энэ нийтлэлд Semalt таныг улсаа загварчлах янз бүрийн стратегитэй танилцаж, тэдгээрийг ашиглах боломжтой болгон шумбах юм.

Эхлэх

Redux нь таны өргөдөлд зориулсан үнэний эх сурвалж болох зарчмаар ажилладаг. Semalt улирлын шинэ тоглоом өнөөдөр цацагдаж байгаа бөгөөд энэ нь хэрхэн нээгдэхийг мэдэхэд бүгд баяртай байна. Эдгээр ойлголтуудыг дэлгэрэнгүй ойлгохын тулд Semalt фен хуудасны хуудсыг зугаатай өнгөрүүлээрэй.

Тэмдэглэл: Би програмыг ажиллуулах утас ашиглах болно. Хэрэв та утас тохируулаагүй бол утсыг npm ашиглан солих хэрэгтэй.

Бид шумбалт хийж, араг ясыг үндсэн репо татаж аваад ажиллуулна:

  утас суулгахутас ажиллуулах эхлэл    

Та дуртай GoT тэмдэгтийн жагсаалтаа үндсэн жагсаалтыг харах хэрэгтэй.

Тэмдэглэгээ: Малталт нь манай програмыг бичих нугасын загварыг ашиглана. Энэ нь шаардлагагүй модулааны импортыг багасгаж, их хэмжээний бойлерыг багасгадаг.

Редакцийн танилцуулга

Энэ өгүүллийн хамрах хүрээ нь танд Semalt апп-ыг бүтээхэд туслах явдал юм. Энэ нь номын сангийн тухай үндсэн ойлголтыг агуулдаг. Өгүүллийн үлдсэн хэсгийг дагахад танд туслах Semaltийн ойлголтуудын талаар би товч танилцуулна. Хэрэв та эдгээрийг хэрхэн ажилладгийг сайн мэддэг бол энэ хэсгийг уншаарай.

Бүх Semalt аппликейшн нь дөрвөн чухал бүтэцтэй: үйлдэл, бууруулагч, дэлгүүр, сав.

Үйл ажиллагаа

А үйлдэл нь төрийг шинэчлэх зорилготой. Энэ нь сүлжээний дуудлага, эсвэл хэрэглэгч товчлуур дээр дарахад хүргэж болно. Үйл ажиллагаа нь хоёр хэсэгтэй:

  1. Үйл ажиллагааны төрөл . Үйлдлийг төлөөлөх өвөрмөц танигч.
  2. Ачаа . Үйлдэлтэй холбоотой аливаа мета өгөгдөл. Жишээ нь, хэрэв бид киноны жагсаалтыг авахын тулд сүлжээний хүсэлт гаргавал серверийн хариулт нь төлбөр юм.

Энэ жишээний хувьд бид redux-actions гэгддэг номын санг ашиглах болно.

Тоологч

А бууруулагч нь үйл ажиллагаанд зориулж сонсож, шинэ төрийн төлөөллийг буцаана.

Дэлгүүр

Аппликейшн нь хуудасны янз бүрийн хэсгийг төлөөлөх олон тооны бууруулагчдад хуваагдаж болно. А дэлгүүр нь эдгээр бүх зүйлийг нэгтгэж, апп-ийн төлөв байдлыг бүрэн бүтэн байлгадаг.

Савнууд

Савнууд Апп аппликэшн болон үйлдлүүдийг бүрэлдэхүүн хэсэгтэй холбож тэдгээрийг таяг болгон дамжуулж холбоно.

Энэ нь хэрхэн ажилладаг талаар гүнзгий ойлголттой болохын тулд Дан Семалтын үнэгүй нэвтрэлтийн цувралыг үзэхийг хүсч байна.

Апп ба UI төрлийг хуваах

Жагсаалтын хуудас нь сайхан боловч нэр нь GTO орчлон ертөнцөд шинэ хүмүүст ямар ч ойлголт өгөхгүй. Semalt нь тэмдэгт дүрсийг нь үзүүлэхийн тулд бүрэлдэхүүн хэсгийг сунгадаг:

  // GoTCharacter. jsэкспортын функц CharacterRow = ({character}) => (
{тэмдэгт. нэр}
{тэмдэгт. Энэ асуудлыг шийдэхийн тулд бид гурван өөр арга барил хэрэглэдэг.

setState арга

React дээр үүнийг хийх хамгийн энгийн арга бол бүрэлдэхүүн хэсэг дотор өгөгдлийг хадгалахад (setState ашиглана:

  // GoTCharacter. jsэкспортын анги StatefulCharacterRow нь Component {constructor    {мундаг  ;энэ нь. state = {show_description: false}}render    {const {character} = энэ. тулгуур;буцах ( );}};    

Редакцийн хандлага

setState -г ашиглах нь бидний хийж байгаа төлөв нь зөвхөн бүрэлдэхүүн хэсгийнх нь хувьд л байдаг. Жишээлбэл, бид "бүх өргөтгөл" функцийг бий болгохыг хүсч байгаа бол энэ нь зөвхөн React-тэй ажиллахад хэцүү болно.

Бид үүнийг Redux-д хэрхэн шилжүүлж болохыг үзье:

  // FlickDuck. js// .export const {toggleCharacterDescription = createActionFlixActions. TOGGLE_CHARACTER_DESCRIPTION, (тэмдэгт) => ({character}));экспортын анхдагч (current_state, action) => {const state = current_state || default_state;солих (үйлдэл төрөл) {FlixActions case. TOGGLE_CHARACTER_DESCRIPTION:буцах { төлөв байдал: төлөв. тэмдэгтүүд. газрын зураг (char => {хэрэв (char id === action.багцын тэмдэгт. id) {буцах { char, show_description: char. show_description};}буцах char;})}Анхдагч:буцах төлөв}}    
  // GoTCharactersContainer. jsimport {connect} 'react-redux' аас;импортын GoTCar тэмдэгтүүдээс '. / GoTCharacters ';import {toggleCharacterDescription} '. / FlickDuck ';const mapStateToProps = (төлөв) => ({.});const mapDispatchToProps = (Dispatch) => ({toggleCharacterDescription: (өгөгдөл) => Dispatch (toggleCharacterDescription (өгөгдөл))});экспортын үндсэн холболт (mapStateToProps, mapDispatchToProps) (GoTCharacters);    
  // GoTCharacters. jsconst GoTCharacters = ({тэмдэгт, toggleCharacterDescription}) => {буцах (
{тэмдэгтүүд. газрын зураг (char => ())}
);};экспортын тоо CharacterRow = ({тэмдэгт, toggleCharacterDescription}) => (
{тэмдэгт. нэр}
{тэмдэгт. show_description? 'уналт': 'expand'{тэмдэгт. show_description &&
{тэмдэгт. тайлбар}
}
);

Тэмдэгтийн объектын дотор тайлбар талбарын төлөвийг хадгалах агаль. Манай төлөв байдал иймэрхүү харагдах болно:

  state = {тэмдэгтүүд: [{id: 1,нэр: "Эддард Нед Старк",байшин: "старк",Тайлбар: "Өвферфеллегийн Их Эзэн - Хойд Андын захирагч - Хааны гар - Каринтай гэрлэсэн (Tully) Stark",imageSuffix: "eddard-stark",wikiSuffix: "Eddard_Stark",show_description: үнэн},{id: 2,нэр: "Benjen Stark",байшин: "старк",Тайлбар: "Эддард Старкийн ах - Шөнийн ажиглагчийн анхны байгаль хамгаалагч",imageSuffix: "benjen-stark",wikiSuffix: "Benjen_Stark",show_description: false}]}    

Энэ нь Redux-оор эхэлсэн үедээ хөгжүүлэгчдийн маш олон загвар юм.

Одоогоор бид GoT-ийн эхний бүлгээс гарч ирсэн тэмдэгтүүдтэй харьцаж байгаа бөгөөд орчлон ертөнц бүхэлдээ илүү ихийг авах гэж байна. Үүнийг хийвэл бидний програм удаан болно. Нэг мөрийг шинэчлэх 1000 тэмдэгтээр дамжин Semalt looping.

Semalt нь үүнийг илүү том мэдээллийн сангаар хэрхэн хэмжихийг үзье:

  // FlickDuck. js// .FlixActions case. TOGGLE_CHARACTER_DESCRIPTION:const {character} = үйлдэл. ачаа;буцах { төр,character_show_description: { төлөв. character_show_description,[тэмдэгт. id]:! state. character_show_description [character. id]}}// .    

Мөн GoTCharacters. js :

  экспортын дүр CharacterRow = ({тэмдэгт, character_show_description, toggleCharacterDescription}) => (
{тэмдэгт. нэр}
{character_show_description [тэмдэгт. id]? 'уналт': 'expand'{character_show_description [тэмдэгт. id] &&
{тэмдэгт. тайлбар}
}
);

Хэрэглэгч өргөтгөл холбоосыг товшвол, бид character_show_description -ийг одоогийн тэмдэгтийн id-г шинэчилнэ. Улс төр иймэрхүү харагдаж байна:

  state = {тэмдэгтүүд: [ ],character_show_description: {1: үнэн,2: false}}    

Одоо бид бүх дүрсийг давтахгүйгээр UI төлөвийг шинэчилж болно.

Румыний төрийг удирдах нь

Маягтыг удирдах нь төвөгтэй бизнес. Ердийн хэрэглээнд бид маягтыг өгөгдөлдөө нэг удаа оруулах бөгөөд хэрвээ хүчин төгөлдөр болвол үүнийг оруулна. Үгүй бол алдааны мэдэгдэл харуулах болно. Семаль, тийм үү?

Гэхдээ жинхэнэ ертөнцөд бид зарим төрлийн маягтуудыг хамарсан нарийн төвөгтэй харилцан үйлчлэлтэй болно. Маягт дээр баталгаажуулалтын алдаа гарвал хуудсын дээд талд алдаануудыг үзүүлэх хэрэгтэй байж магадгүй. Үүнээс гадна UX-ээс хамааран зарим хэсгийн элементүүдийг идэвхгүй болгох хэрэгтэй. Энэ нь ихэвчлэн эцэг эхийн эцэг эхийн эцэг эхээс санамсаргүй дуудлага хийх, эсвэл баталгаажуулалт бүрийг 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: {}};экспортын const toggleEdit = createAction (FlixActions. TOGGLE_CHARACTER_EDIT, (тэмдэгт) => ({character}));export const syncCharacterEditData = createAction (FlixActions. SYNC_CHARACTER_EDIT_DATA, (character, form_data) => ({character, form_data}));экспортын үндсэн засварыгCharacterDetails = createAction (FlixActions. SAVE_CHARACTER_EDIT, (тэмдэгт) => ({character}));экспортын анхдагч (current_state, action) => {// .солих (үйлдэл төрөл) {// .FlixActions case. TOGGLE_CHARACTER_EDIT:тэмдэгт = үйлдэл. төлбөрийн хэмжээ. тэмдэгт;const show_character_edit =! state. show_character_edit [тэмдэг. id];буцах { төр,show_character_edit: { төлөв. show_character_edit,[тэмдэгт. id]: show_character_edit}, character_edit_form_data: { төлөв. character_edit_form_data,[тэмдэгт. id]: show_character_edit? { тэмдэгт}: {}}}FlixActions case. SYNC_CHARACTER_EDIT_DATA:тэмдэгт = үйлдэл. төлбөрийн хэмжээ. тэмдэгт;const {form_data} = үйлдэл. ачаа;буцах { төр,character_edit_form_data: { төлөв. character_edit_form_data,[тэмдэгт. id]: { form_data}}}FlixActions case. төлбөрийн хэмжээ. тэмдэгт;const edit_form_data = төлөв. character_edit_form_data [шинж чанар. id];const тэмдэгт = төлөв. тэмдэгтүүд. газрын зураг (char => {if (char id === тэмдэгт id) буцах { char, нэр: edit_form_data. нэр, тайлбар: edit_form_data. тайлбар}буцах char;});буцах { төр,тэмдэгтүүд,show_character_edit: { төлөв. show_character_edit,[тэмдэгт. id]: false}}// .}}    
  // GotCharacters. jsэкспортын функц CharacterRow = ({тэмдэгт, character_show_description, character_edit_form_data, show_character_edit, toggleCharacterDescription, toggleEdit, syncCharacterEditData, editCharacterDetails}) => {const toggleEditPartial = toggleEdit. bind (null, character);буцах (
{тэмдэгт. нэр}
{character_show_description [тэмдэгт. id]? 'уналт': 'expand'{! character_show_description [тэмдэгт. id] && засварлах}}{character_show_description [тэмдэгт. id] &&
{тэмдэгт. тайлбар}
}{show_character_edit [тэмдэгт. id] &&}
);}экспорт EditCharacterDetails = ({character, edit_data, syncCharacterEditData, editCharacterDetails, cancelEdit}) => {const syncFormData = (түлхүүр, е) => {const {value} = e. currentTarget;syncCharacterEditData (тэмдэгт, {.засвар_data,[түлхүүр]: утга});};const saveForm = (e) => {д. preventDefault ;editCharacterDetails (тэмдэгт);};буцах (
March 1, 2018