Ivan
Тач записывается в стейт?
Юрий
о! А как тогда тут ищут програмистов в команду?
Cenator 🐈
Ololo
Ivan
extraData={this.state} для тача, дополнительно к data
eeeMan
Тач записывается в стейт?
всё гораздо проще, в стейт ничего не пишет, есть просто флат лист и массив с тысячей элементов, каждый элемент это просто TouchableOpacity
Ivan
ФлетЛист оптимизирован типа от перерендера и обновляется когда приходит новый data или extraData, в первом список, во втором дополнительные параметры
eeeMan
то есть мне туда нужно тупо позицию скролла или тача присваивать для дополнительного перерендера?
Ivan
Не, это ответ на долгую реакцию на клик, туда можно флаг нажатого элемента отправлять
eeeMan
вообще не понял как эт освязано, флаг туда отправится только после обработки onPress элемента, а онпресс срабатывает через пару секунд только
Ivan
А для тысячи элементов.. я бы как-то разделил их на несколько частей, но возможно, на реальном девайсе тормозить не будет
eeeMan
я на реальном и тестирую
Ivan
Тогда делить как-то
eeeMan
eeeMan
Тогда делить как-то
Немного локализую проблему - у меня есть флатлист, который получает массив с нным кол-вом объектов, каждый элемент массива я вывожу просто TouchableOpacity с onPress методов который просто консолит текст и всё, тестирую на реальном девайсе htc one e8. При таком раскладе, когда я прокручу немного список и нажму на элемент, онпресс у меня срабатывает через пару секунд только, а если я прокручу и подожду пару секунд, а потом нажму, то онпресс сразу срабатывает
eeeMan
и мне выдается - You have a large list that is slow to update - make sure your renderItem function renders components that follow React performance best practices like PureComponent, shouldComponentUpdate, etc.
eeeMan
как оптимизировать и устранить выдачу этой ошибки?
Сергій
попробуй на чем нибудь помощнее
eeeMan
Сергій
eeeMan
да и пользователи пусть для приложения помощнее возьмут девайсы
Сергій
Сергій
Aleksey
Aleksey
Władimir (Zae)
как вы в джесте мокаете дефолтную функцию? вот есть например у меня axios.post, axios.get, я их мокнул, а если я использую axios({ method: ‘POST’ }), например?
eeeMan
Vit
Władimir (Zae)
nock
можешь дать пример кода?
Vit
https://github.com/node-nock/nock
eeeMan
Aleksey
а на чем смотришь? ios / android?
eeeMan
Nikolay
кто нибудь юзает sentry.io? я как понял его тоже бонусом залочили
Aleksey
а, ну тут трудно сказать ) я просто на macos и ios смотрю, андройды в том же эмуляторе заметно медленнее могут работать (у меня)
Aleksey
вообщем, если не осилишь, то пример приложи пожалуйста
eeeMan
Aleksey
:)
Aleksei
Aleksei
тут как бы в списках большой трейдоф между динамичным контентом и одинаковым, тот же ListView был изначально на динамичный контент в списках ориентирован, но на больших списках жрал много памяти, FlatList это оптимизация ListView по памяти
Ivan
возможно поможет PureComponent
https://github.com/facebook/react-native/issues/13649
eeeMan
и так
eeeMan
воспроизвел проблему
eeeMan
eeeMan
import React, {Component} from 'react';
import {
TouchableOpacity,
FlatList
} from 'react-native';
class Test extends Component {
render() {
let items = Array.apply(null, Array(1000)).map(String.prototype.valueOf,"hi");
return (
<FlatList
data={items}
horizontal={false}
numColumns={3}
keyExtractor={(game, index) => index}
renderItem={(item) => {
return (
<TouchableOpacity
style={{
width: 100,
height: 100,
backgroundColor: '#777',
margin: 5
}}
onPress={() => null}
activeOpacity={0.5}
/>
)
}}
style={{
width: '100%',
height: '100%',
padding: 5
}}
/>
)
}
}
export default Test;
eeeMan
имеем массив с 1000 элементами - флатлист с 1000 TouchableOpacity, на видосе прекрасно видно лаги после прокрутки
Pavel
import React, {Component} from 'react';
import {
TouchableOpacity,
FlatList
} from 'react-native';
class Test extends Component {
render() {
let items = Array.apply(null, Array(1000)).map(String.prototype.valueOf,"hi");
return (
<FlatList
data={items}
horizontal={false}
numColumns={3}
keyExtractor={(game, index) => index}
renderItem={(item) => {
return (
<TouchableOpacity
style={{
width: 100,
height: 100,
backgroundColor: '#777',
margin: 5
}}
onPress={() => null}
activeOpacity={0.5}
/>
)
}}
style={{
width: '100%',
height: '100%',
padding: 5
}}
/>
)
}
}
export default Test;
Я конечно не настоящий сварщик, но создание списка на 1000 элементов бы за пределы render на всякий случай вытащил
eeeMan
это реальный девайс
eeeMan
eeeMan
это приложение запущено на реальном девайсе htc one e8
eeeMan
то есть типа проблема в TouchableOpacity?
eeeMan
щас попробую тогда TouchableWithoutFeedback
Ivan
pure пробовал?
eeeMan
pure пробовал?
PureComponent? пробовал, я просто создал PureComponent компонент в который запихнул этот touchableOpacity
eeeMan
тож самое
eeeMan
или че-то другое имеется в виду?
Ivan
не, оно
Pavel
import React, {Component} from 'react';
import {
TouchableOpacity,
FlatList
} from 'react-native';
class Test extends Component {
render() {
let items = Array.apply(null, Array(1000)).map(String.prototype.valueOf,"hi");
return (
<FlatList
data={items}
horizontal={false}
numColumns={3}
keyExtractor={(game, index) => index}
renderItem={(item) => {
return (
<TouchableOpacity
style={{
width: 100,
height: 100,
backgroundColor: '#777',
margin: 5
}}
onPress={() => null}
activeOpacity={0.5}
/>
)
}}
style={{
width: '100%',
height: '100%',
padding: 5
}}
/>
)
}
}
export default Test;
Из рендера нужно вообще всё выносить. Функцию рендера элемента и стили тоже - иначе каждый раз при вызове render() новый объект создаётся.
Pavel
Хотя если мне память не изменяет рендер флетлиста дергается один раз, а потом внутренний копонент уже работу принимает. В любом случае странно это
Yurii
да, по скроллу/тапам повторный рендер не вызывается точно, так что дело не может быть в этом
Aleksei
сеанс коллективного вангования прям) еще докину тогда)) https://github.com/facebook/react-native/blob/a3c07c95effd891c2bd5f3257efe5b24d85862be/Libraries/Lists/VirtualizedList.js#L144
eeeMan
TouchableWithoutFeedback точно так же ведет себя
eeeMan
ну и любой Touchable
Vladimir
Так а почему вы просто не хотите профайлером пройтись и посмотреть?
eeeMan
maxToRenderPerBatch ничего не дает
Pavel
Vladimir
Типа неспортивно? Не даешь шансов багам?
eeeMan
хз как посмотреть
Pavel
https://snack.expo.io/r1GKVP72M
Хз, PureComponent помогает
Pavel
Ну и в релизе думаю будет летать. Это же всё таки дебаг а дебаг немного лагает по определению
eeeMan
но задержка всё же есть конечно, то есть после окончания прокрутки где-то еще 300мс точно не работает онпресс, скорее всего действительно связано с https://github.com/facebook/react-native/issues/12884, из-за блокировки потока жс
Aleksei
Ребят, кто нибудь знает откуда BuildConfig берется в джава части? чет вообще не могу понять откуда и как. Только находил что он генерится https://github.com/facebook/react-native/blob/26684cf3adf4094eb6c405d345a75bf8c7c0bf88/ReactAndroid/src/main/java/com/facebook/react/common/build/ReactBuildConfig.java
Vladimir