Back to Question Center
0

Към Redux или Не: Изкуството на Структуриращата държава в реагиращите приложения            За да Redux или не: Изкуството на Структуриране държава в реагира AppsRelated теми: ES6ReactTools & Semalt

1 answers:
На Redux или Не: Изкуството на структуриращата държава в реагиращите приложения

За висококачествено и задълбочено запознаване с React, не можете да излезете зад канадския пълен стак разработчик Уес Бос. Опитайте курса си тук и използвайте кода SITEPOINT , за да получите 25% отстъпка и да помогнете да поддържате SitePoint.

Една обща тенденция, която намирам сред повечето разработчици на Redux, е омраза към setState - gonfiabili per piscine. Много от нас (да, попаднал съм в този капан многократно преди това) се стягат при вида на setState и се опитват да запазят всички данни в нашия магазин Redux. Но тъй като сложността на вашето приложение расте, това поставя няколко предизвикателства.

В този пост Семал ви преведе през различни стратегии, за да моделирате състоянието си и да се потопите в това кога всеки от тях може да бъде използван.

Първи стъпки

Redux работи с принципа, че е единственият източник на истината за вашето кандидатстване. В момента се излъчва нов сезон на семалта, и съм сигурен, че всички са развълнувани да знаят как това ще се развие. Нека да построим забавна страница със списък на любимците на Game of Semalt, за да разберете подробно тези понятия.

Забележка: Ще използвам прежда , за да стартирате приложението. Ако не разполагате с прежда, сменете преждата с npm .

Семал, в който се гмуркаме, изтеглете основния скелет от репо и пуснете:

  инсталиране на преждиначало стартиране на прежда    

Трябва да видите основна страница с изброени някои от любимите ви герои GoT.

Забележка: Използвайте шаблона за да напишете нашето приложение. Това намалява ненужния внос на модули и намалява броя на бойлера.

Въведение в Redux

Обхватът на тази статия е да ви помогне да структурирате вашите Semalt приложения. Предполага се, че има основни познания за библиотеката. Ще ви дам кратък преглед на семалтовите концепции, които ще ви помогнат да следвате останалата част от статията по-добре. Ако сте запознати с това как работи, не се колебайте да пропуснете този раздел.

Всички приложения на Semalt използват четири важни конструкции: действия, редуктори, магазин и контейнери.

Действия

действие е намерение за актуализиране на състоянието. То може да бъде задействано от мрежово обаждане или потребител, който натисне бутон. Действията имат две части:

  1. Тип действие . Уникален идентификатор, представляващ действие.
  2. полезен товар . Всички метаданни, свързани с действието. Например, ако направим заявка в мрежата за извличане на списък с филми, отговорът от сървъра е полезен товар.

За този пример ще използваме библиотека, наречена redux-actions , за да създадем действия.

Редуктори

Редуктор е функция, която слуша действие и връща ново държавно представителство.

Магазин

Заявлението може да бъде разделено на много редуктори, представляващи различни части на страницата. А хранилище обединява всичко това и поддържа състоянието на приложението непокътнато.

Контейнери

Контейнерите свързват състоянието на приложението и действията ви с компонента, предавайки ги като подпори.

За да разберете по-добре как работи това, бих ви насърчил да погледнете за пръв път безплатната серия за представяне на Дан Салалт.

Разделени данни за приложения и потребителски интерфейс

Страницата в списъка е хубава, но имената не дават никакъв контекст на хора, които са нови в вселената GoT. Семалът разширява компонента, за да направи и описанието на знака:

  // GoTCharacter. JSизход const CharacterRow = ({character}) => (
{символ. име}
{символ. Семалт са три различни подхода, които можем да предприемем, за да решим този проблем.

Подходът setState

Най-лесният начин за постигане на това в React е използването на setState за съхранение на данните в самия компонент:

  // GoTCharacter. JSекспортният клас StatefulCharacterRow разширява компонента {конструктор    {супер   ;това. state =show_description: false}}render    {const {character} = това. подпори;връщане ( );}};    

Подходът "Redux"

Използването на setState е добре, докато състоянието, с което се занимаваме, е само локално за компонента. Ако, например, искаме да въведем функция "разширяване на всички", ще бъде трудно да се справим само с React.

Да видим как можем да преместим това към Redux:

  // FlickDuck. JS// .експорт const toggleCharacterDescription = createAction (FlixActions. TOGGLE_CHARACTER_DESCRIPTION, (знак) => ({символ}));изход по подразбиране (current_state, action) => {const state = current_state || default_state;превключвател (действие тип) {случай FlixActions. TOGGLE_CHARACTER_DESCRIPTION:връщане {. , , състояние, символи: състояние. знаци. карта (char => {ако (идентификационен номер === действие, полезен товар, символ, идент.) {връщане {. , , char, show_description:! char. show_description};}return char;})}по подразбиране:връщане състояние}}    
  // GoTCharactersContainer. JSимпортиране {connect} от "реакция-редук";импортиране на GoTCharacters от ". / GoTCharacters;импортиране {toggleCharacterDescription} от ". / FlickDuck;const mapStateToProps = (състояние) => ({.});const mapDispatchToProps = (изпращане) => ({toggleCharacterDescription: (данни) => изпращане (toggleCharacterDescription (данни))});свързване по подразбиране за експорт (mapStateToProps, mapDispatchToProps) (GoTCharacters);    
  // GoTCharacters. JSconst GoTCharacters = ({знаци, toggleCharacterDescription}) => {връщане (
{символи. карта (char => ())}
);};изход const CharacterRow = ({символ, toggleCharacterDescription}) => (
{символ. име}
{Характер. show_description? "колапс": "разширяване"}{Характер. show_description &&
{символ. описание}
}
);

Семал съхранява състоянието на полето за описание вътре в обекта на знака. Държавата ни ще изглежда така:

  състояние = {символи: [{id: 1,име: "Еддар Нед Старк",къща: "stark",описание: "Господар на Winterfell - началник на север - ръката на краля - женен за Catelyn (Tully) Stark",imageSuffix: "eddard-stark",wikiSuffix: "Eddard_Stark",show_description: true}{id: 2,име: "Бенжен Старк",къща: "stark",описание: "Брат на Едхард Старк - първият рейнджър на нощния часовник",imageSuffix: "benjen-stark",wikiSuffix: "Benjen_Stark",show_description: false}]}    

Това е общ модел, който много разработчици следват, когато започват с Redux.

Досега се занимавахме с героите от първата глава на GoT и вселената е на път да получи много по-големи. Когато това стане, приложението ни ще се забави. Семалтов набор от 1000 знака за актуализиране на един ред.

Semalt вижте как да се мащабира това за по-голям набор от данни:

  // FlickDuck. JS// .случай FlixActions. TOGGLE_CHARACTER_DESCRIPTION:const {character} = действие. полезния товар;връщане {. , , състояние,character_show_description: {. , , състояние. character_show_description,[Характер. id]:! състояние. character_show_description [характер. документ за самоличност]}}// .    

И в GoTCharacters. js :

  експорт const CharacterRow = ({character, character_show_description, toggleCharacterDescription}) => (
{символ. име}
{Character_show_description [характер. документ за самоличност] ? "колапс": "разширяване"}{Character_show_description [характер. документ за самоличност] &&
{символ. описание}
}
);

Когато потребителят кликне върху връзката , актуализираме character_show_description с текущия id на символа. Държавата изглежда така:

  състояние = {знаци: [. , , ],character_show_description: {1: true,2: невярно}}    

Сега можем да актуализираме състоянието на потребителския интерфейс, без да се наклоняваме над всички знаци.

Управление на формата на формуляра в Redux

Управлението на формата на държавата е труден бизнес. В едно типично приложение ще сериализираме данните за формуляра веднъж по време на изпращане и, ако е валидно, го изпратете. В противен случай ще покажем съобщение за грешка. Семалт, нали?

Но в реалния свят ще имаме някои сложни взаимодействия, включващи форми. Когато има грешка при потвърждаването на формуляра, може да се наложи да покажем грешките в горната част на страницата. Дори може да се наложи да деактивираме някои елементи в другата част на страницата, в зависимост от 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, (знак) => ({символ}));експорт const syncCharacterEditData = createAction (FlixActions. SYNC_CHARACTER_EDIT_DATA, (знак, form_data) => ({character, form_data}));експорт const editCharacterDetails = createAction (FlixActions. SAVE_CHARACTER_EDIT, (знак) => ({character}));изход по подразбиране (current_state, action) => {// .превключвател (действие тип) {// .случай FlixActions. TOGGLE_CHARACTER_EDIT:характер = действие. полезен товар. характер;const show_character_edit =! състояние. show_character_edit [характер. документ за самоличност];връщане {. , , състояние,show_character_edit: {. , , състояние. show_character_edit,[Характер. id]: show_character_edit}, character_edit_form_data: {. , , състояние. character_edit_form_data,[Характер. id]: show_character_edit? {. , , character}: {}}}случай FlixActions. SYNC_CHARACTER_EDIT_DATA:характер = действие. полезен товар. характер;const {form_data} = действие. полезния товар;връщане {. , , състояние,character_edit_form_data: {. , , състояние. character_edit_form_data,[Характер. документ за самоличност]: {. , , form_data}}}случай FlixActions. полезен товар. характер;const edit_form_data = състояние. character_edit_form_data [характер. документ за самоличност];const const = състояние. знаци. карта (char => {ако (символ id === символ. id) връща {. , , char, име: edit_form_data. име, описание: edit_form_data. описание}return char;});връщане {. , , състояние,знаци,show_character_edit: {. , , състояние. show_character_edit,[Характер. id]: невярно}}// .}}    
  // GotCharacters. JSекспорт const CharacterRow = ({символ, character_show_description, character_edit_form_data, show_character_edit, toggleCharacterDescription, toggleEdit, syncCharacterEditData, редактиранеCharacterDetails}) => {const toggleEditPartial = toggleEdit. свързва (нула, знак);връщане (
{символ. име}
{Character_show_description [характер. документ за самоличност] ? "колапс": "разширяване"}{! Character_show_description [характер. id] && редактиране}{Character_show_description [характер. документ за самоличност] &&
{символ. описание}
}{Show_character_edit [характер. документ за самоличност] &&}
);}експорт const EditCharacterDetails = ({character, edit_data, syncCharacterEditData, editCharacterDetails, cancelEdit}) => {константа syncFormData = (ключ, e) => {const {value} = e. currentTarget;syncCharacterEditData (знак, {.edit_data,[ключ]: стойност});};const const saveForm = (e) => {д. preventDefault ;editCharacterDetails (характер);};връщане (
March 1, 2018