Sergey
чтобы ты хуйню не писал
Sergey
dispatch("SOME_ACTION") и сиди отыскивай по всему проекту поиском, где может разлочиться сага и пойти выполняться какая-то логика
Sergey
притом, что ты не можешь быть уверен, что эта сага в данный момент ожидает этот экшен, подключена ли она, и выполняется ли условие этой саги
Oleg
Плюсую. Иногда нужно отыскать тип экшена в проекте, и иногда бывает трудно понять, где редьюсер, например.
Ivan
dispatch("SOME_ACTION") и сиди отыскивай по всему проекту поиском, где может разлочиться сага и пойти выполняться какая-то логика
Согласен, да. Но слабоватый аргумент, как мне кажется. Очень он напоминает аргумент «js говно — .valueOf переопределяешь в одном месте и ищи потом, число это или объект». Уверен на 98%, что на эффекторе можно кучу говна наворотить без навыков структуризации и проектирования.
Дмитрий
Есть чат по parcel?
Андрей Чайковский
когда не понимаешь — перемудрено!
Дело же не в понимаешь/не понимаешь, у Эффектора довольно большой и не очень хорошо документированный апи, и это вполне может быть причиной против выбора в его пользу
Kostya
Всем привет дкикий вопрос! А null вставлять в рендер это нормально? умя есть идея делать фильтр на уровне детей передавать пропс им виден ли он или нет. Или же , в родителе перед рендером делать фильтр массивва?
Dmitry
нужно ли при тесте хука его анмаунтить ?
Dmitry
иногда ошибки стреляют тест прошел а хук иожет вызвать эффект и не дожижается
Sergey
Оба варианта приемлемы, но фильтр в родителе будет лучше
Maxim
как правильно юзать textarea и contentEditable? у меня не получается нормально вставить html
Sergey
как правильно юзать textarea и contentEditable? у меня не получается нормально вставить html
Если дать код, в котором не получается, будет меньше вопросов и быстрее получишь ответ
Kurzdor
а что вы используете чтобы успростить работу с редаксом? я про создание экшн, редьюсеров и тд я знаю redux-symbiote, redux-act. что из них лучше или что есть другое, но получше?
Kurzdor
что вы уже юзали у себя на проде и довольны им
Kurzdor
kek
Ivan
Подскажите, как на эффекторе выполнить задачку: есть внешний event emitter, по событиям которого нужно сходить в апи, потом в localeStorage, потом в ui?
Oleg
На onKeyDown работает
Та я уже сделал. Спасибо.
Artur
Ребята, как коллбеки на саги передаются в помпоненты их же надо наверное как-то коннектить к React типо MapDispachToProps/
Maxim
Ребята, как коллбеки на саги передаются в помпоненты их же надо наверное как-то коннектить к React типо MapDispachToProps/
Сага слушает события которые ты по диспатчу отправляешь, ее никуда не нужно пихать
Artur
Сага слушает события которые ты по диспатчу отправляешь, ее никуда не нужно пихать
А в пропсы как она передается, создается Action Creator на вочер и далее он как пропс передается, так я понял?
Maxim
Ты перекидуешь экшин в компонент, вызываешь его, экшин попадает в диспатч, экшин пошел по цепочке миделваре, там сага чекает какие экшены пролетают мимо, если есть совпадение то сага сапускаеться, и внутри себе сама отправляет свои уже экшены, которые уже и попадают в редюсер
Artur
Ты перекидуешь экшин в компонент, вызываешь его, экшин попадает в диспатч, экшин пошел по цепочке миделваре, там сага чекает какие экшены пролетают мимо, если есть совпадение то сага сапускаеться, и внутри себе сама отправляет свои уже экшены, которые уже и попадают в редюсер
А как передать какой-то параметр с экшеном. Допустим у меня fetchNewImage - это Action Creator, там ее номер изображения. Как его прокинуть именно в сам вотчет саги, а далее в асинхоронный запрос, не нашел примера в сети.
Artur
Ты перекидуешь экшин в компонент, вызываешь его, экшин попадает в диспатч, экшин пошел по цепочке миделваре, там сага чекает какие экшены пролетают мимо, если есть совпадение то сага сапускаеться, и внутри себе сама отправляет свои уже экшены, которые уже и попадают в редюсер
export const fetchNewImage = () => ({type: FETCH_NEW_IMAGE}); export function* watchFetchImage() { yield takeEvery('FETCH_NEW_IMAGE', fetchImageAsync); } function* fetchImageAsync() { try { yield put(requestNewImage()); const data = yield call(() => { return fetch('https://api.giphy.com/v1/gifs/random?api_key=gR30u9O8KPOanwIQupHbD90d4k57EOeY') .then(res => res.json().data.images) } ); Вот тут еще номер нужно изображения передать
Artur
В fetchImageAsync первым параметром приходит объект экшена, от туда можешь брать пейлоад
export const fetchNewImage = (index) => ({type: FETCH_NEW_IMAGE, index}); export function* watchFetchImage() { yield takeEvery('FETCH_NEW_IMAGE', fetchImageAsync); } function* fetchImageAsync(index) { try { yield put(requestNewImage()); const data = yield call(() => { return fetch('https://api.giphy.com/v1/gifs/random?api_key=gR30u9O8KPOanwIQupHbD90d4k57EOeY') .then(res => res.json().data.images.index) } );
Maxim
Сделай дестуктуризацию { index }, ну а так да
Artur
Сделай дестуктуризацию { index }, ну а так да
Точно так, просто как-то это не очевидно, в вотчер же индекс не передается
Artur
Сделай дестуктуризацию { index }, ну а так да
То есть вотчер вотчит Экшен тайп + передает дальше нагрузку, верно я понял?
Artur
Да
Ок. Чекну. Спасибо. На всякий тебе чиркану в личку елси что чтобы забиндить тебя)
Maxim
То есть вотчер вотчит Экшен тайп + передает дальше нагрузку, верно я понял?
Так же ты можешь передать свои параметры в fetchImageAsync, в takeEvery, дополнительными аргументами, только теперь в fetchImageAsync экшин будет последним аргументом
Mihail
2016
Oleg
Есть и 19 года книжки
Pavel
Посоны, обьясните почему в 18 строке name в [ ], я прочитал по документации, но не понял для чего это, обьясните простым языком пожалуйста https://codepen.io/gaearon/pen/wgedvV?editors=0010
Oleg
По реакту кстати я не нашёл ни одной книги, где бы показывали хорошие практики. Лишь объяснение синтаксиса, которое можно и на офф сайте найти
Pavel
Вычисляемые свойства вроде да,?
Да, они так называются
Pavel
Вычисляемые свойства вроде да,?
Только если прям точно, то "вычесляемые имена свойств"
Oleg
Только если прям точно, то "вычесляемые имена свойств"
Пока так и не нашёл им применения в своих проектах )
Oleg
Я юзаю
А есть практический пример где их использование реально что то даёт ?
Sergey
Удобство
Sergey
Вместо нескольких строк - одна
Sergey
return { ...state, [key]: value }
Андрей Чайковский
А есть практический пример где их использование реально что то даёт ?
Бывают случаи, когда только таким образом можно задать ключ, потому что формируется в рантайме
Sergey
Бывают случаи, когда только таким образом можно задать ключ, потому что формируется в рантайме
ну, предыдущий синтаксис же никуда не делся object[key] = 1 это просто shorthand
Андрей Чайковский
ну, предыдущий синтаксис же никуда не делся object[key] = 1 это просто shorthand
Я подумал, что вопрос вообще о вычисляемых именах. А так, да, то же самое
Rainbow
export const fetchNewImage = (index) => ({type: FETCH_NEW_IMAGE, index}); export function* watchFetchImage() { yield takeEvery('FETCH_NEW_IMAGE', fetchImageAsync); } function* fetchImageAsync(index) { try { yield put(requestNewImage()); const data = yield call(() => { return fetch('https://api.giphy.com/v1/gifs/random?api_key=gR30u9O8KPOanwIQupHbD90d4k57EOeY') .then(res => res.json().data.images.index) } );
Половина смысла саг в том, что они позволяют удобно тестировать код. Такой код убивает эту фичу. Вот так будет лучше // utils const jsonFetch = (...args) => fetch(...args).then(r => r.json()); // логика put(requestNewImage()); const data = yield call(jsonFetch, 'url...'); data.images.index
Rainbow
ну, предыдущий синтаксис же никуда не делся object[key] = 1 это просто shorthand
Не совсем shorthand, там есть трюки с defineProperty https://github.com/facebook/relay/blob/master/packages/relay-runtime/store/RelayModernRecord.js#L29
Anonymous
привет, кто-нибудь юзал react +redux +socket. io? помогите разобраться
Artur
Половина смысла саг в том, что они позволяют удобно тестировать код. Такой код убивает эту фичу. Вот так будет лучше // utils const jsonFetch = (...args) => fetch(...args).then(r => r.json()); // логика put(requestNewImage()); const data = yield call(jsonFetch, 'url...'); data.images.index
Не понятно, у меня почему-то индекс не передается с UI export const fetchNewImage = (index) => ({type: FETCH_NEW_IMAGE, index}); export function* watchFetchImage() { yield takeEvery('FETCH_NEW_IMAGE', fetchImageAsync); } function* fetchImageAsync(index) { try { yield put(requestNewImage()); const data = yield call(() => { return fetch('https://api.giphy.com/v1/gifs/random?api_key=gR30u9O8KPOanwIQupHbD90d4k57EOeY') .then(res => res.json()) } ); console.log(Object.values(data.data.images)[index].url); yield put(requestNewImageSucceeded(Object.values(data.data.images)[index].url)); } catch (error) { yield put(requestNewImageFailed()); } } ComponentDidMount() { this.props.fetchNewImage(0); }
Rainbow
не вижу вызова redux dispatch(fetchNewImage(0))
Rainbow
который словит takeEvery, он есть?
Rainbow
watchFetchImage запущена в rootSaga?
Artur
не вижу вызова redux dispatch(fetchNewImage(0))
componentDidMount() { this.props.fetchNewImage(0); } Так этот метод же через пропсы передается, я так понял
Artur
не вижу вызова redux dispatch(fetchNewImage(0))
export default compose( connect(mapStateToProps, {fetchNewImage, increaseCurrentImageIndex}), withRouter )(Main);
Rainbow
FETCH_NEW_IMAGE виден в redux devtools?
Artur
FETCH_NEW_IMAGE виден в redux devtools?
Сага заработала, этим тулзом так и не пользуюсь до сих пор