Size: a a a

Redux — русскоговорящее сообщество

2021 September 20

TF

Tobi Festivalnyi in Redux — русскоговорящее сообщество
источник

ЕК

Егор Ключанцев... in Redux — русскоговорящее сообщество
1. Если изменили entity - то массив entities изменится, соответственно будет перерендер ParentComponent в первом варианте (во втором перерендерится только ChildComponent где изменились entity). Почти всегда микрооптимизация не нужна, так что это только изредка значимая причина выбрать второй вариант

2. Читаемость кода, чаще всего важнее оптимизации, первый вариант выглядит лучше, особенно если Object.values заменить на _.map. Просто потому что сразу передаем entity - не нужно ничего уже вызывать что бы его получить, меньше кода, он более понятный
источник

ЕК

Егор Ключанцев... in Redux — русскоговорящее сообщество
А зачем тебе ids в стейте, если можно прямо из entities получить сразу? Дублируются данные.
источник

TF

Tobi Festivalnyi in Redux — русскоговорящее сообщество
В каждом child'е по id сущности нужны данные, которые берутся из других слайсов стора.
В этом примере device это то, что можно прокидывать из родителя вместо id, а feedback и capabilities - массивы объектов из других слайсов.
Подумал, что если мне все равно нужно делать селект этих данных по id, то почему бы не делать селект основной сущности по id, а в родителе селектать только ids
источник

TF

Tobi Festivalnyi in Redux — русскоговорящее сообщество
источник

TF

Tobi Festivalnyi in Redux — русскоговорящее сообщество
Но проблема оказалась в другом месте.
В приложении используются вебсокеты, сообщения с которых сохраняются в слайсе feedbacks. И получается, что при получении нового сообщения от сокета ререндерятся все child компоненты, которые селектают feedbacks
источник

ЕК

Егор Ключанцев... in Redux — русскоговорящее сообщество
Ну я про то и говорю, обычно компоненты сложнее чем пару строк) Минус селектор - меньше кода, уже 2 селектора вместо трех, уже хорошо)
Если таких Device на странице 100+ - то может имеет смысл оптимизировать..
источник

ЕК

Егор Ключанцев... in Redux — русскоговорящее сообщество
Тогда вообще без разницы что передаешь - и там и там будет рендеринг Device. Разница только в том, будет ли переренедироваться ParentComponent, это несущественная микрооптимизация
источник

TF

Tobi Festivalnyi in Redux — русскоговорящее сообщество
Окей, спасибо
источник

IM

Ivan Minin in Redux — русскоговорящее сообщество
привет. вопрос не конкретно к redux, не знаю, в какой паблик его лучше отнести, но все же. подскажите, пожалуйста, как лучше действовать (использую thunk):

у меня есть api:
  async getWebinars() {
   const response = await axios.get(${this._baseUrl}/webinars, {
     withCredentials: true,
   });
   return response;
 }


я обращаюсь к нему в action-creators:
...
getWebinars: () => async (dispatch) => {
   try {
     dispatch(WebinarsActionCreators.setIsLoading(true));
     mainApi
       .getWebinars()
       .then((response) => {
         if (response.statusText === 'OK') {
           dispatch(WebinarsActionCreators.setWebinars(response.data));
         } else {
           dispatch(WebinarsActionCreators.setError(Ошибка ${response}));
         }
       })
       .catch((error) => {
         if (error.message === 'Network Error') {
           dispatch(
             WebinarsActionCreators.setError(
               'Произошла ошибка сети при обращении к серверу'
             )
           );
         }
       })
       .finally(() => {
         dispatch(WebinarsActionCreators.setIsLoading(false));
       });
   } catch (error) {
     dispatch(WebinarsActionCreators.setError(Произошла ошибка ${error}));
   }

я запутался и не пойму, в каких блоках catch я должен обработать тут ошибку и вообще стоит ли эту цепочку промисов делать тут или ее надо выносить куда-то отдельно?
источник

DO

Dmitry Olyenyov in Redux — русскоговорящее сообщество
У тебя async функция без await
источник

DO

Dmitry Olyenyov in Redux — русскоговорящее сообщество
ты или async делай, или цепочку промисов..
источник

DO

Dmitry Olyenyov in Redux — русскоговорящее сообщество
ну и не надо использовать .catch
источник

DO

Dmitry Olyenyov in Redux — русскоговорящее сообщество
тебе надо использовать второй параметр в .then
источник

DO

Dmitry Olyenyov in Redux — русскоговорящее сообщество
источник

IM

Ivan Minin in Redux — русскоговорящее сообщество
спасибо большое.
вот так правильно будет?

getWebinars: () => async (dispatch) => {
 try {
   dispatch(WebinarsActionCreators.setIsLoading(true));
   const response = await mainApi.getWebinars();
   if (response.status === 200) {
     dispatch(WebinarsActionCreators.setWebinars(response.data));
   } else {
     dispatch(WebinarsActionCreators.setError(Ошибка ${response.statusText}));
   }
 } catch (error) {
   dispatch(WebinarsActionCreators.setError(Ошибка ${error}));
 }
}


и правильно я понимаю, что при самом запросе я такую структуру и оставляю?
  async getWebinars() {
   const response = await axios.get(${this._baseUrl}/webinars, {
     withCredentials: true,
   });
   return response;
 }
источник

DO

Dmitry Olyenyov in Redux — русскоговорящее сообщество
Лучше не оборачивать в try{}catch dispatch'и
источник

DO

Dmitry Olyenyov in Redux — русскоговорящее сообщество
А так, вроде да.
источник

IM

Ivan Minin in Redux — русскоговорящее сообщество
понял, спасибо. надо почитать про это. я просто redux учу только и видел такое в примерах
источник

DO

Dmitry Olyenyov in Redux — русскоговорящее сообщество
Ну да, я изначально сам на такое нарвался. https://github.com/facebook/react/issues/8267
источник