Yura
всем привет, вопрос как я могу после отправки формы на сервер показать спинер(я уже это сделал) и после этого сразу перейти на главную страницу? Буду благодарен😉
Danila
это не может быть ей
Окончательно я запутался, блин
Sergey
Короче. Никакой декларативности я не вижу в хуках. Это тоже самое апи на классах, просто его чуть доработали и спрятали this поглубже, чтобы особо нежные хейтеры ооп не бушевали.
разница: классы — пишешь где хранится стейт, и как его обновлять, описываешь методы хуки — объявляешь, что здесь есть стейт, он сам тебе дает способ со стейтом работать
Sergey
буквально, декларируешь "ДА БУДЕТ ЗДЕСЬ СОСТОЯНИЕ!"
Sergey
в остальном useState императивен
Andrey
самое главное - глубокий академический опыт, полученный в ходе дискуссии (</sarcasm>)
Evgeniy 🍀
Если моя бизнес-логика - это перебор массива, то это таки что
Короч, декларативность - это когда программа представлена в виде набора действий, которые необходимо применить к входным данным для получения требуемого результата. В случае с реактом - в виде функции, трансформирующей состояние стора в определенный html. Императивность - это когда ты пытаешься реализовать в коде какие-то абстрактные объекты и описать их взаимодействие (а-ля эмулировать поведение вещей в "реальном мире"). Когда ты пишешь цикл, твои объекты - это числа, и ты описываешь то, как они влияют на какой-то "внешний мир", находящийся за его пределами. Используя map/reduce - ты оперируешь только входными и выходными параметрами. функций, больше ничего для тебя не существует
Sergey
Anonymous
как еще есть варианты отследить изменение определенного пропса, чтобы вызвать функцию которая передается в этом пропсе
artalar
Про декларативность тут затрагивал https://youtu.be/rVFW009olAI
Anonymous
Гайсыы, ну хелпаните плз В ContentEditable не меняется значение даже при onChange https://codesandbox.io/embed/modern-wind-gjjq3
Решение: надо было передать event и брать его value и ставить его в стэйт
Anonymous
Спасибо всем
Anonymous
useEffect
хуки же только в функциональном компоненте
Anonymous
в чем проблема?
компонент === Class
Sergey
компонент === Class
и в чем проблема переписать?
Sergey
уменьшить количество кода и упростить себе жизнь
Aleksey Isaev
всегда черный ящик
У нас данные идут из redux и вытаскиваются с useSelector. Просто покидать тестовые пропсы не выходит
Sergey
У нас данные идут из redux и вытаскиваются с useSelector. Просто покидать тестовые пропсы не выходит
эт вы собрались писать юнит тесты на компоненты подключенные к стору?)
Danila
Пойду чё-нить почитаю.
Alexander
Значит, a = 1+2+3 - это императивно, а const summ = (...args) => args.reduce((t,i)=>t+i,0) a = summ(1,2,3) - это декларативно?
summ(1,2,3) декларативно, тебе не нужно смотреть саму функцию что бы понять что она делает
Sergey
юнит тестирование это тестирование независимых юнитов
Sergey
все что к чему-то подключено тестируется интеграционными
Aleksey Isaev
кек
Да и ещё и функциональные с хуками))
Danila
summ(1,2,3) декларативно, тебе не нужно смотреть саму функцию что бы понять что она делает
Ага, только вот, например, Сергей сказал, что я всё ещё описываю что делать а не как делать. Чем это отличается от userInstance({name:'name'})? Я описал что мне надо, а как это достать скрыто за интерфейсом.
Danila
как ты собираешься этот инстанс потом использовать?
Вот это вопрос. Предположим, если я сделаю transport.send(userInstance) - что получится?
Aleksey Isaev
юнит тестирование это тестирование независимых юнитов
Ну, данные можно замокать через redux-mock-store например. И тестить с ними
Danila
А если бы я написал operationResult = transportSend(userInstance)?
Sergey
А если бы я написал operationResult = transportSend(userInstance)?
Глаго́л — самостоятельная часть речи, которая обозначает состояние или действие предмета и отвечает на вопросы что делать? что сделать?[1].
Sergey
даже 1 + 2 + 3 это декларативно
1 плюс 2 плюс 3 это не декларация, это последовательные операции, а значит императивщина
Danila
Send — глагол
Как бы это примерно тогда выглядело по-декларативному? sendOperationResult(userInstance)?
{ NeFFeX }
)
Anonymous
и в чем проблема переписать?
Ну судя по всему как я вижу useEffect аналогично работает?
Danila
Точнее, OperationResult('send', UserInstance)
Danila
Или типа того
Sergey
Алексей
понятно
Sergey
ты тралишь, да?
1 * 2 + 3 декларативно?
Алексей
да
Sergey
кек
Sergey
нет
Danila
persistent(userInstance)
То есть, типа, есть какой-то такой уровень, когда код становится декларативным и больше над ним не построить абстрации?
Sergey
да
потому что имеет силу порядок
Sergey
ты не можешь взять и поменять операции местами потому что тут 2 операции зависящие друг от друга
wolfe
если ещё умножение и суммирование поменять местами, то станет понятно, почему
Sergey
То есть, типа, есть какой-то такой уровень, когда код становится декларативным и больше над ним не построить абстрации?
суть этого метода в том, что ты где-то объявляешь, что инстансы User должны сохраняться в базу при изменении. а не вызываешь каждый раз метод send/save/update руками
wolfe
1 + 2 * 3
Evgeniy 🍀
Короч, вот вам ссылка на декларативные хуки, но Дэнчику они не понравились: https://paulgray.net/an-alternative-design-for-hooks/
Алексей
ты не можешь взять и поменять операции местами потому что тут 2 операции зависящие друг от друга
Ага, вот только эти операции и в африке операции, и числа в африке числа. У них нет скрытого мутабельного состояния, благодаря которому 1 становится вдруг 2, или вообще не позволяет себя использовать за пределами функциональных компонент.
Sergey
декларативность > функциональность
Алексей
ну сложновато сделать декларативно и не функционально
Andrey
Короч, вот вам ссылка на декларативные хуки, но Дэнчику они не понравились: https://paulgray.net/an-alternative-design-for-hooks/
Там надо имитацию do нотации хаскельной в бабель впихивать чтобы это работать могло
Sergey
сами по себе useState, use*** это декларации
Алексей
ну componentDidMount тоже декларация
Sergey
ну componentDidMount тоже декларация
и что она объявляет?)
Алексей
условно говоря, обработчик события
Sergey
обработчик — уже не декларация
Sergey
в декларации не может быть событий ты объявляешь результат, который хочешь получить
Алексей
то есть хуки, содержащие обработчики - не декларации
Sergey
jsx без on* пропс это декларация <Element size={20} /> ты не рассказываешь как и куда рендерить, лишь что хочешь получить
Sergey
то есть хуки, содержащие обработчики - не декларации
сам вызов хука это декларация, ты говоришь, что хочешь получить что-то;
Sergey
в классе ты описываешь сам обработчик
Sergey
то есть хуки, содержащие обработчики - не декларации
под капотом вполне может быть императивный код, это неважно
Алексей
под капотом вполне может быть императивный код, это неважно
А что важно? В чём настолько принципиальное отличие хуков от методов класса?