Skip to content

Home work 3#25

Open
UladzislauKurhanovich wants to merge 3 commits intoxzfantom:mainfrom
UladzislauKurhanovich:home-work-3
Open

Home work 3#25
UladzislauKurhanovich wants to merge 3 commits intoxzfantom:mainfrom
UladzislauKurhanovich:home-work-3

Conversation

@UladzislauKurhanovich
Copy link
Copy Markdown

class components changed to functional. Form and result form are written in different components

Comment thread src/components/Form.jsx Outdated
}

if (!inputState.surname) {
tempErrorState = {
Copy link
Copy Markdown

@mariia-kiliushina mariia-kiliushina Aug 9, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И обрати внимание, что проверка пустое ли поле у тебя везде одинакова и не зависит от имени поля или чего-то еще. А это очевидное дублирование кода, значит нужно вынести в отдельную функцию
На самом деле, вся валидация для каждого конкретного поля тоже дублирование, первый и последний шаг абсолютно идентичны, а середину, которая зависит от имени поля переписать так, чтобы сама проверка и текст ошибки выдавались в зависимости от имени проверяемого поля

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо! Поправил

Comment thread src/components/Form.jsx Outdated
let tempErrorState = {...errorState};
event.preventDefault();
let isValid = true;
if (!inputState.name) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Валидацию можно бы вынести в отдельную функцию/ объект с ключами по имени и вэлью в виде функций валидаций:
validate(name) вместо 130 строк кода.
Для переиспользуемого компонента (а в этом их предназначение) лучше логику, которая может меняться в зависимости от потребностей, выносить куда-то и задавать ее потом оттуда, прокидывая в компонент или импортируя. Тогда сам компонент как бы чистенький и готов делать, что прикажут по логике, в то же время рисуя одно тот же интерфейс

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо! переписал функции валидации

<div className={styles.labelWrapper}>
<label className={styles.label} htmlFor={props.name}>
{props.label}
<textarea className={styles.areaInput} id={props.name} name={props.name} placeholder={props.placeholder} rows={7} wrap='hard' onChange={props.onChange} />
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Дело вкуса, но можно деструктуризировать пропсы, чтобы избежать props. каждый раз

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо! В следующих задания уже использовал деструктуризацию

Comment thread src/App.jsx
}
return (
<div className={styles.formWrapper}>
{inputState ? <ResultForm result={inputState} /> : <Form onSave={(form) => onSave(form)}/>}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не замечание, но мысль:
если один компонент, то ок через тернарник, но если будет что-то побольше, то, на мой взгляд, условие удобнее прописать через логическое И. Да, нужно будет написать два раза:
{inputState && }
{! inputState && }
но в нек-х случаях это может быть читабельнее, когда много JSX'а

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо! Согласен, но в данном случае решил воспользоваться тернарником, так как только 2 компоненты

Comment thread src/components/Form.jsx Outdated
}

const submit = function(event) {
let tempErrorState = {...errorState};
Copy link
Copy Markdown

@mariia-kiliushina mariia-kiliushina Aug 9, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кажется, можно было бы обойтись без временного состояния ошибок, поскольку
Если на сабмит твои валидации записывают ошибки сразу в errorState , то компонент понимает, что нужно перерендериться, ведь стейт изменился
А вот эта часть кода удалит текст ошибки если она не актуальна(только errorState вместо tempErrorState):
else {
tempErrorState = {
...tempErrorState,
nameError: '',
};
и компонент опять же отрисует уже новое состояние

Вообще все, что меняется и должно быть тут же отрисовано: через стейт или через стор(который как пропс приходит), иначе рискуешь видеть старое значение, пока не компонент не перерендерится по каким-то другим причинам

Поэтому, взаимодействие с доп. объектом, не стейтом, кажется мне неоправданным

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@mariia-kiliushina
Copy link
Copy Markdown

mariia-kiliushina commented Aug 9, 2022

На мой взгяд, все гуд
Единственное - однозначно можно улучшить валидацию и значительно сократить количество кода, создав всего одну функцию проверки

Позови Павла, пожалуйста, когда сочтешь нужным

Copy link
Copy Markdown
Collaborator

@poulkud poulkud left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

апрув, но глянь комменты

@UladzislauKurhanovich
Copy link
Copy Markdown
Author

@mariia-kiliushina @poulkud спасибо за замечания, все поправил

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants