Избегание изменений состояния в React Native — это кошерно?

#ios #react-native #scrollview #react-redux #textinput

#iOS #react-native #scrollview #react-redux #textinput

Вопрос:

Наша команда работает с React Native уже почти год, и одна из проблем, с которыми мы столкнулись на раннем этапе, — это скорость рендеринга. В нашем приложении есть несколько компонентов, которые пользователю необходимо перетаскивать, и изменения состояния (в сочетании с shouldComponentUpdate) были просто недостаточно быстрыми для достижения этой цели.

Мы обошли это двумя способами, и мне было интересно, в какой степени эти методы являются кошерными по сравнению с хакерскими.

Прямое манипулирование и setNativeProps — Мы так часто использовали setNativeProps, что создали фреймворк, подобный Redux; однако вместо изменения состояния он использует setNativeProps для ускорения. Целью этого было расширить setNativeProps за пределы его использования исключительно внутри компонента; однако мы по-прежнему используем изменения состояния, когда это возможно.

Scrollview и TextInput — нам удалось поворачивать и ориентировать Scrollviews и TextInput таким образом, чтобы работать с setNativeProps, чтобы перетаскивание содержимого было более плавным и естественным, а текст можно изменять быстрее, чем позволяет изменение состояния.

Нам было интересно, насколько все это кошерно, поскольку веб-сайт React Native отмечает только его сложность:

setNativeProps является обязательным и сохраняет состояние на собственном уровне (DOM, UIView и т. Д.), А не в ваших компонентах React, Что затрудняет анализ вашего кода.

Должны ли мы переделать наше приложение?

Комментарии:

1. Используете ли вы неизменяемые? То, что вы описываете, определенно не подходит для react. Вопрос в том, не следует ли вам вместо этого перейти на нативную разработку? React-native — все еще молодой продукт, и не все его проблемы с производительностью решены.

Ответ №1:

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

Два способа укротить эту сложность — уменьшить количество различных фрагментов кода, которые могут устанавливать реквизиты через JSX или setNativeProps для данного компонента, и постепенно отказаться от setNativeProps и уменьшить рендеринг с shouldComponentUpdate помощью и PureComponent вместо этого.

Неизменяемые структуры данных упрощают реализацию shouldComponentUpdate , а также повторный выбор селекторов, если вы используете Redux. Если ваши часто отображаемые компоненты имеют render() методы, которые создают много элементов, преобразуйте группы этих элементов в чистые компоненты, которые необязательно должны отображаться так часто. Преобразование Вавилона с постоянными элементами устраняет большую часть стоимости элементов, которые никогда не меняются, создавая их только один раз; когда React видит один и тот же элемент через два последовательных render() прохода, он не будет повторно отображать элемент во второй раз.