Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.07.2021, 17:08
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

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

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

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

Есть у кого решение такой проблемы?
Может кто имел с этим дело?
Как поборол?
Ответить с цитированием
  #2 (permalink)  
Старый 15.07.2021, 17:27
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

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

"попытка выводить элементы без отслеживания" - не забыл навесить observer на компонент?
Ответить с цитированием
  #3 (permalink)  
Старый 15.07.2021, 18:33
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от Alexandroppolus
не забыл навесить observer на компонент?
На сам-то компонет observer навешен... А вот FlatList, в который передается массив, не оборачивается.

Сообщение от Alexandroppolus
Можешь накидать простенький пример, где воспроизводится?
Завтра попрошу ребят подготовить простенький пример для демонстрации.
Ответить с цитированием
  #4 (permalink)  
Старый 15.07.2021, 19:32
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Ну дак. Перед тем как передавать массив в FlatList или куда ещё, что тобой не контролируется - делай предварительно arr.slice()/toJS(arr).
Потому что массив в mobx - НЕ массив(arr instanceof Array // false), а массивоподобный mobx-объект. Почему они не взяли за основу обычный массив, как в Vue? А чтобы все страдали.
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 15.07.2021, 22:53
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от Aetae
делай предварительно
arr.slice()/toJS(arr)
.
Все делали...
Пишет, де включен строгий режим, вы пытаетесь менять отслеживаемые данные.
Сообщение от Aetae
Потому что массив в mobx - НЕ массив
Мы это знаем.
Ответить с цитированием
  #6 (permalink)  
Старый 15.07.2021, 22:55
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Завтра покажу все наши "ипостаси" - посмотрите, может чего не так делали...
И тексты ошибок приведу полностью.
Ответить с цитированием
  #7 (permalink)  
Старый 15.07.2021, 23:50
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Сообщение от ksa Посмотреть сообщение
Пишет, де включен строгий режим, вы пытаетесь менять отслеживаемые данные.
По идее после .slice() должен получиться обычный массив, не имеющий отношения к mobx. Проблема где-то в другом месте, значит.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 16.07.2021, 00:27
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

Сообщение от Aetae
По идее после .slice() должен получиться обычный массив, не имеющий отношения к mobx.
если там массив объектов, который @observable (то есть deep), то slice() вернёт массив отслеживаемых объектов, это ведь поверхностная копия.
Ответить с цитированием
  #9 (permalink)  
Старый 16.07.2021, 01:26
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Alexandroppolus, ох как же это больно. Больнее мне только от сраных рефов в Vue 3.
__________________
29375, 35
Ответить с цитированием
  #10 (permalink)  
Старый 16.07.2021, 07:42
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от Aetae
По идее после .slice() должен получиться обычный массив, не имеющий отношения к mobx.
Так и получается, мы в консоль выводим результат. Но именно после этих действий "попытка поменять" и получается, указывает именно на эту строчку...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск