Size: a a a

2019 August 08

B

Bogdan in React Kyiv
Эт отолько для демонтстрации
источник

DB

Dima Bildin in React Kyiv
Bogdan
Можете обьяснить почему в enzyme мне нужно вызывать wrapper.update() чтобы в компоненте поменялся стейт?
Потому что enzyme так стал работать при апдейте с 2 до 3 и она знает, что надо обновиться только по определённым событиям, типа ты делаешь .simulate('click'). А если ты где-то делаешь

setTimeout(() => setState(), 1000)


то он уже не знает и ему надо подсказывать
источник

DB

Dima Bildin in React Kyiv
источник

B

Bogdan in React Kyiv
Dima Bildin
Потому что enzyme так стал работать при апдейте с 2 до 3 и она знает, что надо обновиться только по определённым событиям, типа ты делаешь .simulate('click'). А если ты где-то делаешь

setTimeout(() => setState(), 1000)


то он уже не знает и ему надо подсказывать
так получается апдейт нужно делать всегда, если был сетстейт?
источник

DB

Dima Bildin in React Kyiv
Не всегда, а когда он делается асинхронно без какого-то пользовательского инпута и когда enzyme не смог сам этого понять
источник

DB

Dima Bildin in React Kyiv
Maxim Kovalenko
За ответ спасибо.
По задумке прийдет с сервера масив компонентов который нужно отрисовать , какой масив прийдет я не знаю , т.к. права у пользователей на эти компоненты будут разными , а "item.name" обзятельное условие ответа сервера
На клиенте можно иметь мапу соответствий этим именам на ссылку компонента:

response:
[
 {
    name: 'myComponent'
 }
]


map:
co
nst componentsMap = {
 myComponent: MyComponent
}

И там где рендеришь делаешь
const Component = componentsMap[item.name];

return <Component/>
источник

MK

Maxim Kovalenko in React Kyiv
Dima Bildin
На клиенте можно иметь мапу соответствий этим именам на ссылку компонента:

response:
[
 {
    name: 'myComponent'
 }
]


map:
co
nst componentsMap = {
 myComponent: MyComponent
}

И там где рендеришь делаешь
const Component = componentsMap[item.name];

return <Component/>
Не плохо , спасибо )
источник

V

Vadym in React Kyiv
ребят, привет. как правильно в саге записать сереализированные данные в локал сторедж, когда юзер залогинился:
вот мой код: https://gist.github.com/frontvin/c627ad04465467146072b1a743c615c4
файл: saga.tsx
источник

VO

Volodymyr Onofriychuk in React Kyiv
ребят подскажите может уже кто то делал Drag and  Drop меню такого типа, есть ли какие то решения стабильные?
источник

LK

Leonid Kuznetsov in React Kyiv
ребят а как можно в сагах сделать стрктуру аля redux-thunk
export function async<T, P>(
 type: T,
 action: (...args: any[]) => Promise<P>,
 ...args: any
) {
 return async (dispatch: any) => {
   function startedAsyncAction() {
     dispatch({
       type: `${type}_${AsyncActionStatus.STARTED}`,
       status: AsyncActionStatus.STARTED,
     });
   }

   function succeededAsyncAction(payload: any) {
     dispatch({
       type: `${type}_${AsyncActionStatus.SUCCEEDED}`,
       status: AsyncActionStatus.SUCCEEDED,
       payload,
     });
     return payload;
   }

   function failedAsyncAction(payload: any) {
     dispatch({
       type: `${type}_${AsyncActionStatus.FAILED}`,
       status: AsyncActionStatus.FAILED,
       payload,
     });
     return payload;
   }

   startedAsyncAction();

   try {
     const payload = await action(...args);
     return succeededAsyncAction(payload);
   } catch (error) {
     return failedAsyncAction(error);
   }
 };
}
источник

LK

Leonid Kuznetsov in React Kyiv
я хочу по сути создать некий темплейт, тоесть я создаю некую функцию которая принимает тип,колбек и аргументы а сага уже дектетит
источник

LK

Leonid Kuznetsov in React Kyiv
start,success,error
источник

LK

Leonid Kuznetsov in React Kyiv
просто у меня сейчас заминка возникла с тем что в саге можно сдеать аля такое
function* asyncSaga(user) {
 while (true) {
   try {
     yield put({ type: "USER_FETCH_SUCCEEDED", user: user });
   } catch (e) {
     yield put({ type: "USER_FETCH_FAILED", message: e.message });
   }
 }
}

function* root() {
 yield takeLatest("USER_FETCH_REQUESTED", asyncSaga);
}
источник

LK

Leonid Kuznetsov in React Kyiv
но это не очень поскольку я тут явно прописываю тип
источник

LK

Leonid Kuznetsov in React Kyiv
а я хочу принимать все аргументы из вне
источник
2019 August 09

KB

Kostya B in React Kyiv
Всем привет! Раньше не доходили руки особо поиграться с хуками побольше, вот столкнулся и думаю не сильно ли усложняю. Есть хук в котором используется сервис для подгрузки данных, он возвращается стейт который апйдейтится при помощи useRedux и fetch, который к примеру буду вызывать в useEffect какого-то компонента.
источник

KB

Kostya B in React Kyiv
export const useGiphyService = limit => {
 const [state, dispatch] = useReducer(gifsReducer, initialState);

 const fetch = useCallback(
   async (query, offset = 0, isIncremental = false) => {
     if (!query) {
       return dispatch({
         type: FETCH_NEW_GIFS_SUCCESS,
         data: [],
         isLastPage: true
       });
     }

     dispatch({
       type: isIncremental ? FETCH_MORE_GIFS_REQUEST : FETCH_NEW_GIFS_REQUEST
     });

     try {
       const {
         data,
         pagination: { total_count, offset: newOffset, count }
       } = await searchGifs({ query, limit, offset });

       const isLastPage = total_count - newOffset <= count;

       dispatch({
         type: isIncremental
           ? FETCH_MORE_GIFS_SUCCESS
           : FETCH_NEW_GIFS_SUCCESS,
         data,
         isLastPage
       });
     } catch {
       dispatch({
         type: isIncremental ? FETCH_MORE_GIFS_FAILURE : FETCH_NEW_GIFS_FAILURE
       });
     }
   },
   [limit]
 );

 return { state, fetch };
};
источник

KB

Kostya B in React Kyiv
Чисто интересно не попахивает ли вам этот код?
источник

TS

Terry Sahaidak in React Kyiv
Kostya B
export const useGiphyService = limit => {
 const [state, dispatch] = useReducer(gifsReducer, initialState);

 const fetch = useCallback(
   async (query, offset = 0, isIncremental = false) => {
     if (!query) {
       return dispatch({
         type: FETCH_NEW_GIFS_SUCCESS,
         data: [],
         isLastPage: true
       });
     }

     dispatch({
       type: isIncremental ? FETCH_MORE_GIFS_REQUEST : FETCH_NEW_GIFS_REQUEST
     });

     try {
       const {
         data,
         pagination: { total_count, offset: newOffset, count }
       } = await searchGifs({ query, limit, offset });

       const isLastPage = total_count - newOffset <= count;

       dispatch({
         type: isIncremental
           ? FETCH_MORE_GIFS_SUCCESS
           : FETCH_NEW_GIFS_SUCCESS,
         data,
         isLastPage
       });
     } catch {
       dispatch({
         type: isIncremental ? FETCH_MORE_GIFS_FAILURE : FETCH_NEW_GIFS_FAILURE
       });
     }
   },
   [limit]
 );

 return { state, fetch };
};
Раз хуки то не означає що не треба мутити нормальні екшени
источник

KB

Kostya B in React Kyiv
нормальные это какие?
источник