Виталий
const self = this
И? Не понял.
Maxim
Подскажите, каррирование улучшает производительность или нет? Если делать вместо onClick={() => this.clickHandler(item) вот так: onClick={this.clickHandler(item)} а clickHandler собственно будет таким: clickHandler = item => () => { ... }
Виталий
А в чем смысл?
Смысл в том чтобы не плодить миллион одноообразных методов. Для этого и было придумано ООП. Для этого и существует прототип и методы класса.
Cenator 🐈
И? Не понял.
Ну погугли
Карамультук
onClick={this.clickHandler} - правильно
Виталий
Ну погугли
Что погуглить?
Maxim
onClick={this.clickHandler} - правильно
представь, что мапаюсь по массиву и мне нужно передавать item в this.clickHandler
Виталий
А ты хочешь наследование в компонентах?
Я хочу то что написал в вопросе.
Cenator 🐈
Что погуглить?
Мое сообщение
Nikita
Я хочу то что написал в вопросе.
Я твой вопрос не понимаю.
Виталий
Я твой вопрос не понимаю.
Что конкретно не понятно?
Карамультук
представь, что мапаюсь по массиву и мне нужно передавать item в this.clickHandler
а, понял. Я бы в твоем случае сделал бы еще компонент и в нем уже сделал onClick={this.clickHanlder} и item передавал бы пропсом в этот компонент. И в clickHandler уже можно было бы делать const {item} = props
Maxim
а, понял. Я бы в твоем случае сделал бы еще компонент и в нем уже сделал onClick={this.clickHanlder} и item передавал бы пропсом в этот компонент. И в clickHandler уже можно было бы делать const {item} = props
это вообще не отвечает на вопрос, мне просто интересно, каррирование улучшает производительность за счет того, что в рендере не пересоздаются функции - или нет?
Nikita
Что конкретно не понятно?
Что значит создавать методы в каждом инстансе? Инстанс это результат new из класса или функции.
Cenator 🐈
это вообще не отвечает на вопрос, мне просто интересно, каррирование улучшает производительность за счет того, что в рендере не пересоздаются функции - или нет?
В общем случае не улучшает, в рендере функии конечно пересоздаются, т.к. есть вызов функции, которая возвращает новую
Maxim
понятно, спасибо
Карамультук
это вообще не отвечает на вопрос, мне просто интересно, каррирование улучшает производительность за счет того, что в рендере не пересоздаются функции - или нет?
ну как не отвечает? Где ты собираешься создавать свою функцию? Внутри map же, так? В твоем случае это не карирование. А одно и то же
Виталий
Что значит создавать методы в каждом инстансе? Инстанс это результат new из класса или функции.
Да. Всё верно. И когда создаётся компонент тоже вызывается new. Я не хочу использовать методы объявленные на инстансе, я хочу использовать методы объявленные на прототипе.
Nikita
Это настолько незначительно, что не стоит даже выкраивать из этого перфоманс
зачем тогда useCallback придумали? Потому, что реакт делает сравнение по ссылке и делает пере подключение слушателя.
Viktor
юзал) решил webpack поюзать
@popuguy я сделал eject, изучил и собрал dev сборку где-то за час под себя с TS и компиляцией через бабель
Viktor
там ничего сверхестественного eslint с ts-правилами, тайпчекинг - все работает
Виталий
Но это и так методы из прототипа!!!
Покажи мне пример как передать в обработчик клика метод из протатипа чтобы он работал.
Александр
Шел 2019 год...а они обсуждали прототипы компонетов
Андрей
Это настолько незначительно, что не стоит даже выкраивать из этого перфоманс
Это не имеет значение если ты не передаёшь функции дальше, а такое очень редко бывает.
Карамультук
Это настолько незначительно, что не стоит даже выкраивать из этого перфоманс
я бы не сказал. Тот вариант который я предложил не будет вызывать ререндер элементов при ререндере родителя.
Виталий
Но это и так методы из прототипа!!!
Вангую что щас будет this.method = this.methid.bind(this) или method = () => {…} потому что ты не знаешь что такое метод прототипа и метод инстанса
Nikolai
зачем тогда useCallback придумали? Потому, что реакт делает сравнение по ссылке и делает пере подключение слушателя.
Для мемоизации придумали. Это не значит что все подряд нужно мемоизировать
Anonymous
Кто какой роутер сейчас использует, желательно на хуках? А то react-router-dom до сих пор не добавили хук для withRouter + у него есть баг из-за которого компонент на хуках не может нормально ререндерится и приходится делать костыли вроде forceUpdate через useCallback
Anonymous
Этот хук есть в следующей версии. А пока можно с этим пожить.
Спасибо, а ещё есть варианты библиотек-роутов? может есть что интереснее
Александр
useCallback придумали не для того чтобы выиграть в производительности за счет того что функция не будет создаваться каждый рендер (она то как раз будет создаваться каждый раз), а для того чтобы поддерживать ссылку на одну и туже функцию между рендерами, чтобы избежать ререндера дочерних компонентов
Nikolai
Почему?
Потому что это избыточно и увеличивает кодовую базу без острой необходимости
Anonymous
а то react-router-dom порядком адоел уже)
Александр
Как уже сказали выше, если функция не передается ниже, то смысла ее в useCallback оборачивать ноль
Андрей
Потому что это избыточно и увеличивает кодовую базу без острой необходимости
Ты уверен, что неконсистентность и возможность накосячить лучше чем избыточность?
Андрей
Nikita
Нет
Но когда создается обьект из конструктора, все методы из prototype становятся доступными объекту же.
Cenator 🐈
Но когда создается обьект из конструктора, все методы из prototype становятся доступными объекту же.
Там this будет неправильным, поэтому их байндят, то есть копируют в инстанс
Nikita
Там this будет неправильным, поэтому их байндят, то есть копируют в инстанс
Ну this будет привязан к объекту из которого вызывают метод. Что не так? Почему это не правильно?
Danila
Народ, есть ли какой-нибудь способ НЕ создавать методы на каждом инстансе как сейчас все делают, а именно использовать методы из прототипа без потери контекста?
Если в ребёнке нет метода, то он берётся из прототипа, собственно, при вызове. И this в таком методе будет на инстанс указывать.
Nikolai
Заблуждение.
в любом случае вот статья как применять мемо-хуки: https://kentcdodds.com/blog/usememo-and-usecallback
Андрей
в любом случае вот статья как применять мемо-хуки: https://kentcdodds.com/blog/usememo-and-usecallback
О чём я и говорю: Ты уверен, что неконсистентность и возможность накосячить лучше чем избыточность?
Danila
Что значит "создавать методы на каждом инстансе"?
Виталий
Вопрос тогда не понятен, сорри
Вопрос о том что в реакте при существующем подходе мы плодим миллион однообразных методов привязанных к инстансу компонента, вместо того чтобы использовать один из прототипа.
Виталий
Например? Что за однообразные методы?
я встречный вопрос задам. Покажите как вы передаёте в кнопку в onClick метод из прототипа.
Nikolai
О чём я и говорю: Ты уверен, что неконсистентность и возможность накосячить лучше чем избыточность?
Мемоизировать каждый обработчик или нет, тут ещё вопрос в каком случае косяк будет
Виталий
Такое ощущение что в этом чате 90 % не знают что такое прототипы
Виктор
Александр
Ну кроме ErrorBoundary...обсуждали сто раз уже, полагал что это подразумевается
Виталий
При существующем подходе в реакте не испольузт классы для начала
Интересно)) а вот когда я пишу class MyComponent extend Component {} это что?))
Александр
Интересно)) а вот когда я пишу class MyComponent extend Component {} это что?))
Ну кроме вас думаю не многие так поступают, вроде же на хуках все
Nikolai
И какой косяк будет в случае мемоизации?
Например замыкание на старый стейт
Виталий
Господи, стыд 🤦‍♂️
Danila
Ощущение, что ты не можешь нормально написать что ты хочешь и о чём говоришь. Как передаю? Беру и передаю. Если говорить о классах, то вариантов четыре штуки: constructor(){this.onClick = this.onClick.bind(this)} onClick(){} render(){ return <button onClick={this.onClick}/> } onClick(){} render(){ return <button onClick={this.onClick.bind(this)}/> } onClick(){} render(){ return <button onClick={()=>this.onClick()}/> } onClick = () => {} render(){ return <button onClick={this.onClick}/> } В чём вопрос?
Nikolai
[deps]
И? Что ты пытаешься доказать? Что нужно в useCallback пихать все подряд?)
Danila
Где тут "объявление одинаковых методов на инстансе" и где здесь нужно использовать методы прототипа?
Andrey
Вопрос о том что в реакте при существующем подходе мы плодим миллион однообразных методов привязанных к инстансу компонента, вместо того чтобы использовать один из прототипа.
каждый раз угараю, как люди, пишущие на реакте, который на каждый чих перетряхивает все дерево компонентов в вдоме боятся лишнюю ссылку на функцию создать, особенно, если это даже не сказывается на производительности так, чтобы это можно было бы заметить
Александр
Ощущение, что ты не можешь нормально написать что ты хочешь и о чём говоришь. Как передаю? Беру и передаю. Если говорить о классах, то вариантов четыре штуки: constructor(){this.onClick = this.onClick.bind(this)} onClick(){} render(){ return <button onClick={this.onClick}/> } onClick(){} render(){ return <button onClick={this.onClick.bind(this)}/> } onClick(){} render(){ return <button onClick={()=>this.onClick()}/> } onClick = () => {} render(){ return <button onClick={this.onClick}/> } В чём вопрос?
Он о том, что в случае классовых компонентов ты не можешь из прототипа передать функцию в качестве колбека в onClick скажем, ее надо тем или иным способом привязать к контексту класса, или через arrow функкцию или же скопировав в инстанс класса в конструкторе типа того foo = this.foo.bind(this)