GeekHub-2020.js icon indicating copy to clipboard operation
GeekHub-2020.js copied to clipboard

Домашняя работа №7 - React

Open redexp opened this issue 4 years ago • 39 comments

Видео: https://youtu.be/9qZNqjWZIdg

Хорошие статьи по теме:

  • https://uk.reactjs.org/docs/state-and-lifecycle.html
  • https://uk.reactjs.org/docs/forms.html

Основная задача:

Переделать задачу про регулярки #12 со следующими изменениями:

  • Копируете папку react-form, в ней выполняете домашку. Если я успею написать бота, то он будет проверять домашку по файлу react-form/dist/index.html
  • Дописать компонент UserForm который будет принимает атрибут user, пример https://github.com/redexp/GeekHub-2020.js/blob/e48276c17f64aafd61c14630110f3fa7640aa461/react-form/src/index.js#L5-L14
  • Поля name, email и password вам знакомы, как их валидировать вы уже знаете. На форму вам нужно добавить обработку поля phones. На каждый элемент массива должен создаваться следующий html
<div class="input-group mb-3">
  <input type="text" class="form-control">
  <select class="custom-select">
    <option value="home">Домашній</option>
    <option value="mobile">Мобільний</option>
  </select>
  <div class="input-group-append">
    <button class="btn btn-outline-secondary" type="button">Видалити</button>
  </div>
</div>
  • В инпуте соответственно выводиться значение поля number и в селект - type. По клику на кнопке, весь input-group должен удаляться. По сабмиту формы каждое инпут поле из массива phones должен валидироваться относительно того какой тип телефонного номера. Если home то номер должен состоять только из шести чисел и не начинаться с нуля, а если mobile то номер может быть либо 10 чисел и первое обязательно 0, либо 12 чисел и первое обязательно 3.
  • Под выводом массива phones должна быть кнопка, которая добавляет в массив ещё один объект {number: '', type: 'home'} и соответственно должен добавится html выше.
  • поле Опис из #12 может удалить, его повторять не нужно

Если хотите, можете вместо чистого bootstrap попробовать bootstrap-styled. Важно пробовать разные библиотеки и подходы на этапе обучения. Если вам не понравиться и будет жутко неудобно - это неплохо, самое главное, чтобы вы могли аргументировано объяснить что именно плохого в той или иной библиотеке, а не просто "та мне чот не очень".

redexp avatar Dec 05 '20 10:12 redexp

Крута бібліотека для реакту Material UI

Daniel-developer5 avatar Dec 07 '20 11:12 Daniel-developer5

Подскажите пожалуйста, домашку выполнять в папке regexp? Или создавать новую папку?

kononyukii avatar Dec 07 '20 13:12 kononyukii

@kononyukii точно, сейчас допишу задачу

redexp avatar Dec 07 '20 13:12 redexp

нас кстати уже 28, отвалилось ещё 14 студентов. С такими темпами после нового года и бота писать не нужно будет, можно будет самому проверять

redexp avatar Dec 07 '20 20:12 redexp

нас кстати уже 28, отвалилось ещё 14 студентов.

а як дізнатися, чи я залишився, чи вилетів?

Alexandr-Kravchenko avatar Dec 07 '20 20:12 Alexandr-Kravchenko

Так, теж цікаво, а то я з тих людей, які думають: "а малолі я папку не react назва..."

Daniel-developer5 avatar Dec 07 '20 20:12 Daniel-developer5

остались те у кого был файл react/dist/index.html

redexp avatar Dec 07 '20 20:12 redexp

остались те у кого был файл react/dist/index.html

Пів години тому?

andrewvoinarovskyi avatar Dec 07 '20 20:12 andrewvoinarovskyi

если вы случайно не создали этот файл, то создайте в своём репозитории issue на меня с просьбой перепроверить

redexp avatar Dec 07 '20 21:12 redexp

@redexp как только пользователь открывает страницу должны появится 3 инпута из домашки regexp(имя, имейл и пароль)? какие-то ещё поля ввода должны быть? когда должлно появится поле ввода номера?

andrewvitrenko avatar Dec 07 '20 21:12 andrewvitrenko

Поле ввода номера з'являється відразу

Daniel-developer5 avatar Dec 07 '20 21:12 Daniel-developer5

тогда объект user мы собираем по событию submit и передаем его UserForm? что UserForm с ним делает? после валидации как-то выводит?

andrewvitrenko avatar Dec 07 '20 21:12 andrewvitrenko

  1. Ми отримуємо на початку виконання програми об'єкт user та рендеремо форму на його основі
  2. При події сабміт перемальовуємо форму з бекграундами для інпутів відповідно до їньої валідності

Я це так розумію, @redexp поправте, якщо помилився

Daniel-developer5 avatar Dec 07 '20 21:12 Daniel-developer5

@Daniel-developer5 всё правильно, спасибо @AndriiVitrenko я сейчас сделаю основу, будет понятнее что нужно делать я надеюсь

redexp avatar Dec 08 '20 05:12 redexp

@redexp ооууу фейл, я делал прошлое задание, но самое главное npx webpack что бы было все в dist забыл

AndreyKondakov avatar Dec 08 '20 20:12 AndreyKondakov

@redexp в инпутах для телефонов при проверке должны окрашиватся только сами инпуты, или и весь родительский див тоже?

andrewvitrenko avatar Dec 08 '20 21:12 andrewvitrenko

@AndriiVitrenko только инпут

redexp avatar Dec 09 '20 09:12 redexp

Добрый вечер, я так понимаю для индикации, что введенные данные в input валидированы, желательно использовать функционал bootstrap?

RomanTaran avatar Dec 09 '20 17:12 RomanTaran

Добрый вечер, я так понимаю для индикации, что введенные данные в input валидированы, желательно использовать функционал bootstrap?

Лучше использовать styled-components как в видео-уроке.

YuliiaKavytska avatar Dec 09 '20 19:12 YuliiaKavytska

Подскажите, пожалуйста, у нас в массиве два поля с одинаковым значением type: 'mobile'. Никак не могу сообразить как в input вставить при стартовой отрисовке второй номер мобильного телефона '380123456789'

RomanTaran avatar Dec 09 '20 19:12 RomanTaran

Подскажите, пожалуйста, у нас в массиве два поля с одинаковым значением type: 'mobile'. Никак не могу сообразить как в input вставить при стартовой отрисовке второй номер мобильного телефона '380123456789'

Попробуй использовать map

YuliiaKavytska avatar Dec 09 '20 19:12 YuliiaKavytska

@redexp для обновление страницы лучше использовать state и вручную корректировать shouldComponentUpdate(), или менять props и рендерить компонент с уже новыми props (по примеру прошлой домашки с Table)?

andrewvitrenko avatar Dec 09 '20 22:12 andrewvitrenko

@redexp Не для оновлення, а для перемальовки. Використовуємо стейт та змінюємо його при діях юзера. При зміні стейту контент перемальовується

Daniel-developer5 avatar Dec 10 '20 05:12 Daniel-developer5

@Daniel-developer5 вот тут облом. С обычным Component это работает на ура. А по условию домашки нужно использовать PureComponent. И вот обновляется только если кроме state изменить еще и props

andrewvitrenko avatar Dec 10 '20 06:12 andrewvitrenko

@AndriiVitrenko https://codesandbox.io/s/hardcore-sun-v4grq?file=/src/App.js, не правильно стейт змінюєш може

Daniel-developer5 avatar Dec 10 '20 07:12 Daniel-developer5

@AndriiVitrenko А по условию домашки нужно использовать PureComponent - не было такого условия. Твоя проблема в том, что ты передаёшь один и тот же объект, естественно, что PureComponent сравнивает предыдущий user и новый user, видит что они одинаковые и ничего не делает. Компонент UserForm должен один раз взять user, а дальше работать со state. Скопируй все поля которые должны отрисовываться из user в state

redexp avatar Dec 10 '20 08:12 redexp

Та же проблема, стейт меняется по клику на кнопку (вывожу в консоль) а страница не перерендеривается. Пробовал использовать setState через стрелочную функцию, как в документации, результат тот же. P.s. через Component работает, только что проверил

kononyukii avatar Dec 10 '20 09:12 kononyukii

@kononyukii я заметил что проявляется только при UserForm extends PureComponent. Если сделать UserForm extends Component, то проблема исчезает. Насколько я понял из Интернета это потому что PureComponent в методе shouldComponentUpdate() сравнивает и state и props. (возможно неправильно понял)

andrewvitrenko avatar Dec 10 '20 10:12 andrewvitrenko

@redexp я имел ввиду что в коде, где вы указали дописать UserFom, сказано что UserForm extends PureComponent

andrewvitrenko avatar Dec 10 '20 10:12 andrewvitrenko

Та же проблема, стейт меняется по клику на кнопку (вывожу в консоль) а страница не перерендеривается. Пробовал использовать setState через стрелочную функцию, как в документации, результат тот же. P.s. через Component работает, только что проверил

я так понял что мы оба делали что-то по типу this.setState({user: //тут объект с новыми данными по юзеру}) и оба забыли что при копировании объектов копируются и их ссылки. и получаем что что newProps === props

andrewvitrenko avatar Dec 10 '20 20:12 andrewvitrenko

Присвоював стейтам пропси напряму в конструкторі. Це вірний підхід? Чи маніпуляції такого типу краще робити через методи життєвого циклу?

Ant198 avatar Dec 15 '20 03:12 Ant198

@Ant198 так и надо

redexp avatar Dec 15 '20 15:12 redexp

@redexp А домашка новая будет?

MaksymSu avatar Dec 16 '20 08:12 MaksymSu

да, постараюсь сегодня придумать

redexp avatar Dec 16 '20 09:12 redexp

домашку №8 не придумал, но добавил react-form в examples

redexp avatar Dec 16 '20 20:12 redexp

а трансляція завтра буде?

Alexandr-Kravchenko avatar Dec 19 '20 13:12 Alexandr-Kravchenko

Извините, проспал и устал, стрим будет завтра в 10 утра

redexp avatar Dec 19 '20 13:12 redexp

return <input onChange={e => setValue(e.target.value)} />

Якщо обробник події компактний, так писати норм чи для оптимізації краще і це виносити окремо і передавати назву функції?

Daniel-developer5 avatar Dec 20 '20 13:12 Daniel-developer5

#22

redexp avatar Dec 28 '20 09:12 redexp