действие создатель
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 или есть ли способ решить