

Anton
16.10.2017
00:28:22
ребзя..есть кто шарит?..подскажите плз..есть два одинаковых компонента, один класс, другой функция.
class SwipeListItem extends React.Component<Props> {
constructor() {
super();
console.log('we are in constructor');
}
_onDeleteButtonPress = (): void =>
this.props.onDeleteButtonPress(this.props.item.id);
_onItemPress = (): void => this.props.onItemPress(this.props.item.id);
render(): React.Element<*> {
return (
<SwipeRow
body={
<View style={styles.listItemContainer}>
<TouchableOpacity onPress={this._onItemPress}>
<Text>{this.props.item.name}</Text>
</TouchableOpacity>
</View>
}
disableRightSwipe
right={
<Button danger onPress={this._onDeleteButtonPress}>
<Icon active name="trash" />
</Button>
}
rightOpenValue={-75}
/>
);
}
}
const SwipeListItem = <TEntity>({
onDeleteButtonPress,
onItemPress,
item,
}: Props<TEntity>): React.Element<*> => {
console.log('call functional component');
const _onDeleteButtonPress = (): void => onDeleteButtonPress(item.id);
const _onItemPress = (): void => onItemPress(item.id);
return (
<SwipeRow
body={
<View style={styles.listItemContainer}>
<TouchableOpacity onPress={_onItemPress}>
<Text>{item.name}</Text>
</TouchableOpacity>
</View>
}
disableRightSwipe
right={
<Button danger onPress={_onDeleteButtonPress}>
<Icon active name="trash" />
</Button>
}
rightOpenValue={-75}
/>
);
};
когда я фетчю новые итемы в листе ..рендерится вот так:

Google

Anton
16.10.2017
00:29:03
что в итоге быстрее, чет не допру..по судя по картинке класс
когда все зафетчилось, поведения одинаковое

kana
16.10.2017
00:30:11
Лог в классе вызывается только в конструкторе, а не в рендере (то есть рендер может и 10 раз вызываться, а ты увидишь только один раз), а в функции лог при каждом рендере

Anton
16.10.2017
00:31:56
но вообще смысл этого компонента, забиндить _onDeleteItem и _onPressItem, чтобы они не пересоздавались при каждом onPress=()..поулчается что при использвоании класса, эти функции создаются один раз, а при функциональном компоненте, каждый раз, так?
т.е. класс так или иначе предпочтительнее здесь?

kana
16.10.2017
00:32:59
Нет, я не сказал, что класс предпочтительнее, я сказал, что ты проводишь неправильную проверку

Anton
16.10.2017
00:33:11
да, эт я понял, за это спасибо)
я уже дальше иду)
я хочу минимальное количество раз пересоздавать onDeleteItem

kana
16.10.2017
00:33:44
Но вообще да, если у тебя в функции идёт создание лямбды, то это не очень хорошо, класс в этом плане лучше

Anton
16.10.2017
00:35:06
впрочем наврено можно вынести в парент компонент замыкание этих функций так onDeleteItem = (id) => () => {..do stuff} ...тогда и функциоальный компонент прокатит
ну ок, спасибо за помощь

kana
16.10.2017
00:35:40
Если у тебя парент - список, то не получится

Google


Anton
16.10.2017
00:36:15
парент враппер над react-native'ским FlatListom
вот это в паренте:
_onDeleteItemPress = (id: string): Promise<void> => () => {
this.props.locationStore.deleteByID(id);
};
_onItemPress = (id: string): void =>
this.props.navigation.navigate('locationDetails', {
id,
});
_renderItem = ({ item }: { item: Location }): React.Element<*> => (
<SwipeListItem
item={item}
onDeleteItemPress={this._onDeleteItemPress}
onItemPress={this._onItemPress}
/>
render(): React.Element<*> {
return (
<FlatList
ListFooterComponent={this._renderFooter}
onEndReached={this._fetchNextData}
data={this.props.locationStore.all}
keyExtractor={this._keyExtractor}
renderItem={this._renderItem}
/>
);
}
т.е. если в _onDeleteItempress добавить пару скобочек, должно прокатить, не?
потому что сам этот враппер маунтится всего разок
впрочем, на всякий случай для тех, кто это может будет читать: выбирайте класс в данной ситуации, и не партье мозги как я с замыканиями, все кто после вас будет смотреть ваш код, спасибо скажут :) upd: или используйте recompose и вообще забейте на классы


kana
16.10.2017
01:20:17
Я довольно долго юзал рекомпос и в итоге предпочел вернуться на классы
Рекомпос хорош в простых кейсах, но строить большой контейнер на нем - боль

Anton
16.10.2017
01:27:01
а мы как-то в одном проекте прям рекомпос аддиктед стали :)..прям очень зашел...в последнем правда тоже вернулись на классы, т.к. mobx, а он с декораторами намного красивее и понятее выглядит.
Единственное с рекомпосом флоу задолбались сдруживать ).. вот эт прям даа..боль

Дмитрий
16.10.2017
05:53:43
Recompose — как приправа — может оказаться очень к месту но очевидно не обязательно фигачить это везде ?

Aleksandr
16.10.2017
07:08:57
Хотел забанить, а я не админ(

Fedor
16.10.2017
07:09:37
позови админа )

Roman
16.10.2017
07:43:50
https://github.com/dvajs/dva
что про это скажете?

Tim
16.10.2017
08:15:09
node 8.7.0, npm 5.4.2
package-lock сломался, снес его, поставил пакеты заново, и вот такая хрень в итоге

Сергей
16.10.2017
08:17:04
Ты установил FS модуль?!
Или это из вебпака выхлоп?

kana
16.10.2017
08:18:05
https://github.com/dvajs/dva
когда вижу "lightweight" и "elm-style" на жс, то становится сразу, это однозначно куча бойлерплейта ждет.
Особенно пугает lightweight фреймворк. Чем он lightweight, тем он меньше делает сам, толку от такого фреймворка тогда

Tim
16.10.2017
08:18:22

Google

Сергей
16.10.2017
08:18:23

Tim
16.10.2017
08:19:56

Сергей
16.10.2017
08:20:18

kana
16.10.2017
08:20:55
https://github.com/dvajs/dva
почти то же самое дает withReducer рекомпоса, хоть тут мб даже лучше.
А, стоп, он не локальный. Короче, вроде неплохо

Tim
16.10.2017
08:21:48

Roman
16.10.2017
08:22:51
единственное что он от китайцев, со всеми вытекающими

Again
16.10.2017
08:57:37

Max
16.10.2017
08:58:00
Ты из контекста фразу прочитал

Admin
ERROR: S client not available

Max
16.10.2017
08:58:07
Весь тред возьми

Lupsick
16.10.2017
10:30:27
посоны, вы видели какой-нибудь адекватный drag&drop для дашбоардов?

Ruslan
16.10.2017
11:00:54
https://github.com/react-dropzone/react-dropzone
Там как раз ментейра ищут

Aleksey
16.10.2017
11:03:42
Подскажите как можно увеличить скорость. Есть таблица с 1000 строками. При клике на каждую строку появлятся input. Дело в том, что это все очень медленно работает, как увеличить производительность?
Input onChange слишком медленно работает

ventris
16.10.2017
11:12:12
https://github.com/bvaughn/react-virtualized
мб?

Max
16.10.2017
11:12:38

Aleksey
16.10.2017
11:19:18
Нет

Max
16.10.2017
11:24:13
попробуй ?
PureComponent / shouldComponentUpdate

Google

Aleksey
16.10.2017
11:24:57
Окей, спасибо

Igor
16.10.2017
11:25:09
+ иммутабельный стейт

Artyom
16.10.2017
12:17:18
Если onChange хендлер прокидывается через карирование или биндинг то тут shouldUpdateComponent не поможет, он будет функцию onChange считать всегда разной

Max
16.10.2017
12:18:39
с Pure будет такая херня, да
но можно в shouldComponentUpdate проверять только то что нужно
у recompose есть специальный НОС для проверки только пропертей из списка

Vladimir
16.10.2017
12:20:00
onlyUpdateForKeys

Ilya
16.10.2017
12:21:16
кто в реакте джуниор? Напишите в личку, тема есть

Сергей
16.10.2017
12:22:31
я тут обновил еслинт конфиги
для любого жс:
atmx.in/eslint-base
для реакта
atmx.in/eslint-react

Александр
16.10.2017
12:24:23
Подскажите пожалуйста, как в actions можно сделать опциональные парамемтры? Т.е. у меня был экшн, сечас я хочу его расширить, но не хочу ломать совместимость в других местах, есть для этого какие-нибудь способы?

Ilya
16.10.2017
12:25:21

Александр
16.10.2017
12:25:59
Проблема не в том, что я не знаю где сломается, я хочу сделать так что бы не сломалось
Было вот так:
export const setCurrentData = (url) => {
return (dispatch) => {
dispatch({ type: 'REQUEST_CURRENT_DATA', payload: url });
FetchGet({
url,
onSuccess: (data) => dispatch(receiveData(data)),
onError: (error) => dispatch({ type: 'REQUEST_CURRENT_DATA_ERROR', payload: error })
});
};
};
Хочу сделать вот так:
export const setCurrentData = (url, params) => {
return (dispatch) => {
dispatch({ type: 'REQUEST_CURRENT_DATA', payload: url });
FetchGet({
url,
params,
onSuccess: (data) => dispatch(receiveData(data)),
onError: (error) => dispatch({ type: 'REQUEST_CURRENT_DATA_ERROR', payload: error })
});
};
};