0

动作创造者

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它显示错误值)然后我正在安慰选择状态(其中存储在 componentWillReceiveProps(nextprops))所以它显示默认值而不是false
但是当我安慰它里面的值 setTimeout(() =>{console.log('sdkjlfjlksd',this.state.pick) }, 3000);时显示false
纠正我如果我错了我知道redux-thunks以同步方式而不是异步方式工作所以这里为什么它不能以同步方式工作
我卡住了,请任何人帮助我!
更新
我刚刚得到prblm的位置,实际上在componentWillReceiveProps我正在设置选择状态值,因为它是异步的,所以当我在isPickEmpty函数中获取值时,我得到了 prev 值。
如何处理 setState 或者有什么办法解决

4

1 回答 1

0

在组件中,您使用 中的值 BookingData,但在 reducer 上,您将其直接添加到状态中。

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

如果你看到这个应该很好用mapStateToProps

于 2018-05-31T00:29:34.130 回答