Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   [React Native] MobX + FlatList кто использует такую связку? (https://javascript.ru/forum/library-toolkit-framework/82841-%5Breact-native%5D-mobx-flatlist-kto-ispolzuet-takuyu-svyazku.html)

ksa 15.07.2021 17:08

[React Native] MobX + FlatList кто использует такую связку?
 
Пишем на React Native мобильное приложение... Состояние (массив объектов) хранится в MobX...
Решили использовать для отображения массива элементов компонент FlatList... Он все отображает но получаем в консоли "предупреждение"
[mobx] Out of bounds read: 25

Загуглили что такое значит... :)
Де попытка выводить элементы без отслеживания.

Делали клон этого массива, хотели потом вывести клон. Дает ошибку, де включен строгий режим и вы пытаетесь менять данные из MobX...

Есть у кого решение такой проблемы?
Может кто имел с этим дело?
Как поборол?

Alexandroppolus 15.07.2021 17:27

Можешь накидать простенький пример, где воспроизводится?

"попытка выводить элементы без отслеживания" - не забыл навесить observer на компонент?

ksa 15.07.2021 18:33

Цитата:

Сообщение от Alexandroppolus
не забыл навесить observer на компонент?

На сам-то компонет observer навешен... А вот FlatList, в который передается массив, не оборачивается. :(

Цитата:

Сообщение от Alexandroppolus
Можешь накидать простенький пример, где воспроизводится?

Завтра попрошу ребят подготовить простенький пример для демонстрации. :yes:

Aetae 15.07.2021 19:32

Ну дак. Перед тем как передавать массив в FlatList или куда ещё, что тобой не контролируется - делай предварительно arr.slice()/toJS(arr).
Потому что массив в mobx - НЕ массив(arr instanceof Array // false), а массивоподобный mobx-объект. Почему они не взяли за основу обычный массив, как в Vue? А чтобы все страдали.

ksa 15.07.2021 22:53

Цитата:

Сообщение от Aetae
делай предварительно
arr.slice()/toJS(arr)
.

Все делали... :D
Пишет, де включен строгий режим, вы пытаетесь менять отслеживаемые данные.
Цитата:

Сообщение от Aetae
Потому что массив в mobx - НЕ массив

Мы это знаем. :yes:

ksa 15.07.2021 22:55

Завтра покажу все наши "ипостаси" - посмотрите, может чего не так делали...
И тексты ошибок приведу полностью.

Aetae 15.07.2021 23:50

Цитата:

Сообщение от ksa (Сообщение 538693)
Пишет, де включен строгий режим, вы пытаетесь менять отслеживаемые данные.

По идее после .slice() должен получиться обычный массив, не имеющий отношения к mobx. Проблема где-то в другом месте, значит.

Alexandroppolus 16.07.2021 00:27

Цитата:

Сообщение от Aetae
По идее после .slice() должен получиться обычный массив, не имеющий отношения к mobx.

если там массив объектов, который @observable (то есть deep), то slice() вернёт массив отслеживаемых объектов, это ведь поверхностная копия.

Aetae 16.07.2021 01:26

Alexandroppolus, ох как же это больно. Больнее мне только от сраных рефов в Vue 3.

ksa 16.07.2021 07:42

Цитата:

Сообщение от Aetae
По идее после .slice() должен получиться обычный массив, не имеющий отношения к mobx.

Так и получается, мы в консоль выводим результат. Но именно после этих действий "попытка поменять" и получается, указывает именно на эту строчку...


Часовой пояс GMT +3, время: 04:30.