🦜
он будет валидировать только те поля которые изменились
вытащите валидатор из рендера, он должен быть статичен, а не каждый раз создаваться
Alex
вытащите валидатор из рендера, он должен быть статичен, а не каждый раз создаваться
его инстанс создается 1 раз, если нужны хуки есть еще https://github.com/nullgr/instant-validation/blob/development/docs/recipes.md
🦜
render () { const { validator } = this.props; const { errors } = validator.validate(this.state); }
🦜
не надо вот так делать
🦜
в том, что на каждый рендер, зачем-то будет возвращаться ошибки, которые статичны
Vadim
что ты имеешь в виду
вызов валидации на каждый рендер
Alex
вызов валидации на каждый рендер
там есть мемоизация и правила чекаются только те где изменились значения полей
Vadim
а ну хотя в какой момент валидировать?
🦜
но точно не вызывать в рендере
Alex
я замерял на 5000 полей, изменения в поле емейла с регекспом на емейл, перевалидация занимает гдето 1.5 мс
Vadim
errors же меняется постоянно
🦜
наоборот ошибки НЕ статичны)
errors это объект, в котором message ошибки статичен. Зачем каждый раз возвращать новую ссылку на него?
Китикет
а почему нет, это классический случай как в примерах https://reactjs.org/
Если так написано в туториале на сайте реакта, это не значит что так пишут в реальных приложениях
Китикет
Там контент для новичков, разжеванный чтобы работало всегда, даже когда нет класс проперти
Alex
Если так написано в туториале на сайте реакта, это не значит что так пишут в реальных приложениях
мы тоже не используем конструкор и байнд мы вобще на TS пишем и да ты прав "Там контент для новичков, разжеванный чтобы работало всегда" - у нас тоже такая цель в примере
Китикет
Ну вот, не удалось нигде найти React.Component
Китикет
Ни в формике ни в фф
Китикет
Интересно, почему они функциями пишут, надо же наверное extends Component, новичкам же будет понятнее
Китикет
Китикет
Про конструктор и бинды
Китикет
Ну может это и выглядело как "классы не тру", но я такого не говорил)
Den
Ну может это и выглядело как "классы не тру", но я такого не говорил)
А конструкторы вроде в экземплярах класса только?
Alex
Про конструктор и бинды
а я их до сих пор люблю хоть и не использую, мне кажется это более явно чем класс пропертя
Alex
И очень сильно увеличивает обьем кода
ну у нас в примере вообще ... стоит для функциональных компонентов https://github.com/nullgr/instant-validation/blob/development/docs/recipes.md#usevalidator-hook
Китикет
А конструкторы вроде в экземплярах класса только?
function Something() { // constructor } class Something { constructor() { // constructor } }
Den
function Something() { // constructor } class Something { constructor() { // constructor } }
Я новичек в js. Подскажи, во втором случае содержимое в constructor() {} вызовется перед созданием Something - это же лучше, когда ты это контролируешь?
Andrei
@js_noobs_ru
Den
Бл%, начинается xD
Den
только реакт. я понял )
Den
никакого js
Andrei
тут и за реакт ругают
Andrei
иногда
Den
Ну вот и во вью формируются такие, не интересующиеся что там под капотом.
Artem
Товарисчи! Сделал в компонентах пока тестовую задержку рендеринга в 3 секунды чз useEffect. Но фоллбэк не подгружается, просто проходит задержка и компонет отрисовывается. Вот код: const Home = lazy(() => import('./pages/Home')); const About = lazy(() => import('./pages/About')); const Skills = lazy(() => import('./pages/Skills')); const MyWork = lazy(() => import('./pages/MyWork')); const Contact = lazy(() => import('./pages/Contact')); const NoMatch = lazy(() => import('./pages/NoMatch')); function App() { return ( <div className="app"> <Toolbar /> <div className="app__page-container"> <Suspense fallback={Fallback}> <Switch> <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> <Route path="/skills" component={Skills} /> <Route path="/mywork" component={MyWork} /> <Route path="/contact" component={Contact} /> <Route component={NoMatch} /> </Switch> </Suspense> </div> </div> ); }; Ну и, соответственно, пример дочернего: function Home() { const [load, setLoad] = useState(false) useEffect(() => { setTimeout(() => { setLoad(true); }, 2000); }); if (load === true) { return ( <div>Home</div> ); } return null };
Artem
Как сделать так, чтобы фоллбэк понял, что компонент рано отрисовывать
Daniil
load && Home
Artem
load && Home
а, вспомнил, условный рендеринг, я тупица, спасибо, сча полезу в доку
Alexander
Как сделать так, чтобы фоллбэк понял, что компонент рано отрисовывать
Так компонент же отрисовывается. Только с null. А через таймаут ты ему не говоришь отрисоваться, а что отрисовать
Alexander
а как ему запретить отрисовку до окончания таймаута (ну до load === true) ?
Таймаутом надо не состояние менять. Не в курсе динамических импортов
Alexander
Я так вонял, ты хочешь, пока все данные не подгрузятся, страницу не показывать?
Artem
Artem
просто, чтобы видно было, что прелоад есть и он работает
Stanislav
Почему не сделать статический импорт и не отрисовать какой нибудь лоадер до того как не подгрузятся данные
Alexander
да, все верно, но пока заглушка в виде таймаута
А причём тут динамический импорт? Он тебе здесь ничего не сделает
Stanislav
Ну я вот и не понимаю почему не сделать так
Alexander
Ну не единственный
Stanislav
Ну не единственный
Это адекватный способ
Stanislav
Либо я не шарю)
Alexander
просто, чтобы видно было, что прелоад есть и он работает
Короче у тебя компонент Home сам должен решать, когда показывать контент, а когда прелоадер
Artem
просто отрисовывать в каждом компоненте прелоадер пока не подгрузятся данные?
Alexander
Да
Artem
дак а смысл тогда в фоллбэке? если сам компонент будет рисовать прелоадер, а потом менять его на свой контент?
Artem
Нет
а, всмысле нет - не нужны?)
Alexander
Именно
Daniil
Нет
Ему надо просто установить фолбек для саспенса <Suspense fallback={<div>Загрузка...</div>}>
Artem
Именно
окей, а если бы я делал аякс или фетч то как бы фоллбэк должен был понять, что данные мне еще в компоненте не пришли?
Daniil
а блэт
Alexander
а блэт
Прикинь как все сложно :)
Stanislav
Макконахи все так же актуален
Alexander
окей, а если бы я делал аякс или фетч то как бы фоллбэк должен был понять, что данные мне еще в компоненте не пришли?
Да любым способом. Либо какой-то флаг, который ты ставишь после ответа, либо проверка на то, что данные вообще есть
Stanislav
я код выше кидал, у меня все есть
Ты точно таким же образом и 404 свою отрисуешь, просто если hasError:false, рисуешь лоадер, isLoading: false, отрисовываешь компонент
Artem
Да любым способом. Либо какой-то флаг, который ты ставишь после ответа, либо проверка на то, что данные вообще есть
Это я понял в родительском компоненте: const Home = lazy(() => import('./pages/Home')); const About = lazy(() => import('./pages/About')); const Skills = lazy(() => import('./pages/Skills')); const MyWork = lazy(() => import('./pages/MyWork')); const Contact = lazy(() => import('./pages/Contact')); const NoMatch = lazy(() => import('./pages/NoMatch')); function App() { return ( <div className="app"> <Toolbar /> <div className="app__page-container"> <Suspense fallback={Fallback}> <Switch> <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> <Route path="/skills" component={Skills} /> <Route path="/mywork" component={MyWork} /> <Route path="/contact" component={Contact} /> <Route component={NoMatch} /> </Switch> </Suspense> </div> </div> ); }; где я должен сказать ему, что допустим при клике на контакты я жду подгрузки данных с аякса?
Artem
чтобы фоллбэк отработал
Alexander
Это вообще не для этого