
Ҫѐҏӗѫӑ
10.03.2017
01:50:13
нет

Paul
10.03.2017
01:52:51
Забавно))

Max
10.03.2017
04:59:38

MadMax
10.03.2017
05:20:52
Доброго времени суток, уважаемые. У меня проблема с принятием state из редусера. Дело в том, что я отслеживаю 3 шага. Отработал ли ГетПродукт из апи, отработал ли диспач с этими данными и отработал ли редусер с этими данными

Google

MadMax
10.03.2017
05:21:03
У меня весь этот объект попадает в state
Но в компоненте его не существует!
Почему так, госпада??

Dmitry ?
10.03.2017
05:30:40
Ну ты код, код кидай

Danil
10.03.2017
05:41:45
А в react-router v4 IndexRoute нету?

MadMax
10.03.2017
05:42:31
Я б с удовольствием вас бы ознокомил с кодом

Dmitry ?
10.03.2017
05:45:08
Покажи как мапишь стейт из редьюсера в компонент

MadMax
10.03.2017
05:45:42
componentWillMount(){
const { dispatch } = this.props;
dispatch(getProductsIfNeed());
}
render(){
console.log(this.props.product)
return(
<div>
</div>
)
}
}
function select(state){
return {
product : state.product
}
}
export default connect(select)(Phones);
А мапить нечего, он undefined говорит, потому что именно в компоненте пустой пейлоад

Google

Dmitry ?
10.03.2017
05:48:20
Покажи редьюсер

MadMax
10.03.2017
05:48:50
function productFetch(state=initState, action){
switch (action.type) {
case 'FETCH_PRODUCT_SUCCESS':
console.log('reducer', action.payload)
return Object.assign({}, state, {
payload: action.payload,
isFetching: false,
errorMessage: ''
});
case 'FETCH_PRODUCT_ERROR':
console.log('reducer', action.payload)
return Object.assign({}, state, {
errorMessage: action.errorMessage
});
default:
return state;
}
}
Вот точка входа
export default function product(state = initState, action) {
switch (action.type) {
case "PRODUCT_FETCH_START":
case "FETCH_PRODUCT_SUCCESS":
case "FETCH_PRODUCT_ERROR":
console.log('reducer', action.payload)
return productFetch(state, action);
default:
return state;
}
}

Dmitry ?
10.03.2017
05:55:27
У тебя в компоненте dispatch из props не пойму откуда возьмется
Ты же в connect его не передал

MadMax
10.03.2017
05:59:48
из экшена диспатч берется
export function getProductsIfNeed (){
return dispatch => {
dispatch(getProdStart());
getProductList(json => {
console.log('Отработал Гетпродукт', json.data)
return dispatch(successCallback(json));
}
);
}
}
import { getProductsIfNeed } from '../actions/product';
в компоненте

Dmitry ?
10.03.2017
06:01:04
Я про код в componentWillMount, ты достаешь dispatch из this.props

Andrey
10.03.2017
06:06:19
я б не стал морочиться с наследованиями и заюзал бы константы и обычные функции в одном файле.
потом можно будет разрезать на разные файлы и экспортить их из индекс.жс
но это я — убеждённый противник паразитных наследований в жс

Dmitry ?
10.03.2017
06:09:37

anoru
10.03.2017
06:11:23
Нет, не фигню, я тоже не вижу никаких коннектов
Поэтому и надо скидывать весь код на gist, а не кусочки

Dmitry ?
10.03.2017
06:12:00
Есть connect там ниже export default connect(select)(Phones)

anoru
10.03.2017
06:12:25
аа, лол. Пропустил

Dmitry ?
10.03.2017
06:13:25
MadMax покажи successCallback action

MadMax
10.03.2017
06:13:49
export function successCallback(payload) {
console.log('dispatch', payload.data)
return {
type: 'FETCH_PRODUCT_SUCCESS',
payload: payload.data
};
}

anoru
10.03.2017
06:15:20
А теперь getProductList

Dmitry ?
10.03.2017
06:15:55
В payload.data все ок, судя по этому скрину

Google

MadMax
10.03.2017
06:16:01
Ребята. Он в компонент приходит. Сначала пустой, потом отрабатывают все эти действия, которые законсоленные. Отрабатывает getproduct из апи, потом Диспач отрабатывает. потом редьюсер отрабатывает, ре-рендится, в консоль вновь приходит уже ПОЛНЫЙ объект, но я к нему не могу обратится почему то, только к пустому
function getProductList(successCallback, errorCallback){
axios.get('http://localhost:3001/api/product').then(response =>{
if(response){
successCallback(response);
}else{
errorCallback(err);
}
})
}
сейчас вывел его в консоль
render(){
const { payload } = this.props.product;
console.log('modules', payload.modules)
return(

Dmitry ?
10.03.2017
06:17:49
Эм
В чем проблема тогда?

anoru
10.03.2017
06:18:07
:D

MadMax
10.03.2017
06:18:11
Это массив объектов, верно?
если я обращусь к нему по индексу, в ручную? Должен законсолится первый объект?
const { payload } = this.props.product;
console.log('modules', payload.modules[0])

Dmitry ?
10.03.2017
06:19:23
Наверняка это на этапе, где у тебя еще нет данных

anoru
10.03.2017
06:19:27
Потому что в тот момент его еще нету
проверка нужна

MadMax
10.03.2017
06:19:57
Какая првоерка? На что?
Я делал Array.isArray

Dmitry ?
10.03.2017
06:20:10
У тебя render отрабатывает несколько раз

anoru
10.03.2017
06:20:16
на существование payload и payload.modules

MadMax
10.03.2017
06:20:29
в сам if рендер поместить?

Dmitry ?
10.03.2017
06:20:35
Да

Google

anoru
10.03.2017
06:20:45
payload.modules && payload.modules.map(item =>
но перед этим надо Payload проверить еще выше
и поставить ему дефолтный {} может быть
const { payload = {} } = this.props.product;

Dmitry ?
10.03.2017
06:21:32
if (payload && payload.modules && payload.modules.length) console
Грубо говоря

Admin
ERROR: S client not available

anoru
10.03.2017
06:21:55
он про рендер
то есть про return я так понимаю

MadMax
10.03.2017
06:26:17
Странно

anoru
10.03.2017
06:26:52
что именно?

Artem
10.03.2017
06:27:23
_.isEmpty()

Dmitry ?
10.03.2017
06:27:50
Я просто пытался объяснить проблему

anoru
10.03.2017
06:27:53
payload в данном случае выглядит странно. Должно быть просто products.list
и можно его получить еще на этапе селектора

MadMax
10.03.2017
06:28:06
Uncaught Error: Phones.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.
at invariant (invariant.js:39)

anoru
10.03.2017
06:28:25
я тебе выше написал как надо сделать
payload.modules && payload.modules.map(item =>

Google

anoru
10.03.2017
06:29:06
const { payload = {} } = this.props.product;

MadMax
10.03.2017
06:29:44
render(){
const { payload = {} } = this.props.product;
if (payload && payload.modules && payload.modules.length){
console.log(payload.modules[0].address_id)
return(
<div>
</div>
)
}

anoru
10.03.2017
06:30:13
это разве похоже на то, что я написал?
ты вот специально игнорируешь правильные ответы

Dmitry ?
10.03.2017
06:30:26
Ну и напиши еще ветку кода, где modules нет

MadMax
10.03.2017
06:30:27
Не игнорирую.

Dmitry ?
10.03.2017
06:30:39
else там, что-то еще
Но выше предложили лучше варианты, этот самый явный для демонстрации

MadMax
10.03.2017
06:32:15
В map функцию я указал ретурн
render(){
const { payload = {} } = this.props.product;
payload.modules && payload.modules.map(item => {
return(
<div>
</div>
)
})
}
верно ли я Вас понял?

Dmitry ?
10.03.2017
06:32:54
Нет

anoru
10.03.2017
06:33:18
оберни все в <div>
<div>
{ payload.modules .....
</div>
и это внутри return

Dmitry ?
10.03.2017
06:35:00
render(){
const { payload = {} } = this.props.product;
return (
<div>
{payload.modules && payload.modules.map(item => {
return(
<div>
{item.address_id}
</div>
)
})}
</div>
);
}

Artem
10.03.2017
06:36:12
render(){
const { payload = {} } = this.props.product;
return(
<div>
payload.modules && payload.modules.map(item => {
// тут какой то html код
}
</div>
)
})
}

MadMax
10.03.2017
06:36:33
ДАаааааааа

Dmitry ?
10.03.2017
06:36:43