не получать синхронные данные от избыточного thunk - PullRequest
0 голосов
/ 31 мая 2018

действие создатель

export function pickup(latlng) {

    return function(dispatch) {
        dispatch({ type: PICKUP_STATE,payload:latlng });
    };

}

Редуктор

import {
    PICKUP_STATE,
    PICKUP_ADD,
    DROPOFF_STATE
} from '../actions/types';

export default  (state={},action) => {
    const INITIAL_STATE = {
        pickup: '',
        pickupAdd:''
    };
    switch(action.type) {
        case PICKUP_STATE:
            console.log(action.payload)
            return {...state,pickup:action.payload};
        case PICKUP_ADD:
            return{...state,pickupAdd:action.payload};
        case DROPOFF_STATE:
            return {...state,dropoff:action.payload}
        default:
            return state;
    }
    //return state;
}

Карта компонент

import {
    connect
} from "react-redux";
import * as actions from "../actions"
class Map extends React.Component {
      componentWillReceiveProps(nextprops) {
             if (nextprops.pickupProps !== undefined) {
                 this.setState({
                     pick: nextprops.pickupProps
                 }, () => {
                     console.log(this.state.pick);

                 });
             }
       }
   isPickEmpty(emptyPickState) {
        this.props.pickup(emptyPickState);
    // setTimeout(() =>{ console.log('sdkjlfjlksd',this.state.pick) 
                        },3000);
        console.log(this.state.pick);
   }
}
const mapStateToProps = (state) => {
    // console.log(state.BookingData.pickup);
    return {
        pickupProps:state.BookingData.pickup,
        pickupAddProps: state.BookingData.pickupAdd
        }
}
export default connect(mapStateToProps,actions)(Map);

app.js корневой файл

import React        from "react";
import ReactDOM     from "react-dom";
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import "normalize.css/normalize.css"
import  "./styles/styles.scss";
import { Router, Route, IndexRoute, browserHistory } from 'react-router';
import reduxThunk from 'redux-thunk';
import { composeWithDevTools } from 'redux-devtools-extension';

import AppRouter from './routers/AppRouter';
import reducers from './reducers';
import {AUTH_USER} from "./actions/types";


const middleware = [
    reduxThunk,
];

const store = createStore(reducers, composeWithDevTools(
    applyMiddleware(...middleware),
// other store enhancers if any
));



const token = localStorage.getItem('token');
if(token){
    store.dispatch({type:AUTH_USER});
}

ReactDOM.render(
    <Provider store={store}>
        <AppRouter />
    </Provider>
    , document.getElementById('app'));

здесь моя проблема в том, что когда я вызываю isPickEmpty () из моего компонента карты, он вызывает действие создатель this.props.pickup (false) (я также проверил redux-devtools, оно показывает false значение), тогда я утешаю состояние выбора (который хранится в componentWillReceiveProps(nextprops)), поэтому он показывает значение по умолчанию вместо false
, но когда я утешаю значение внутри setTimeout(() =>{console.log('sdkjlfjlksd',this.state.pick) }, 3000);, оно показывает false значение
поправьте меня, если я ошибаюсь что я знаю, что редукс-thunks работает синхронно, а не асинхронно так вот почему это не работает синхронно
я застрял, плзкто-нибудь, помогите мне!
Обновление
Я только что получил, где prblm, на самом деле в componentWillReceiveProps , где я устанавливаю значение состояния выбора, потому что это асинхронныйкогда я выбираю значение в isPickEmpty функция, я получаю предыдущее значение.
как дескриптор setState или есть ли способ решить

1 Ответ

0 голосов
/ 31 мая 2018

В компоненте вы используете значения в BookingData, но на редукторе вы добавляете его непосредственно в состояние.

const mapStateToProps = (state) => {
    console.log(state);//Check the state here
    return {
        pickupProps:state.pickup,
        pickupAddProps: state.pickupAdd
        }
}

Должно работать хорошо, если вы выберете это mapStateToProps

...