簡體   English   中英

React中的初始狀態與Redux無法正常工作

[英]Initial state in React with Redux not working

在React with Redux中遇到初始狀態問題。 這是我的第一個使用異步調用的應用程序,似乎有一些我無法弄清楚的東西。

我使用谷歌的電子表格作為我的“后端”,所以我的親戚很容易出租我們的滑雪小屋。 它只是一個周的電子表格,如果它們可用或沒有。

通過查看控制台,可以獲取數據,但有些東西無效。

這是錯誤消息:

錯誤信息

這是github回購: https//github.com/Danielbook/kulan2016

而且,這是代碼:

index.js

import About from './components/About';
import Guest from './components/Guest';
import Booking from './containers/Booking';

import getSpreadsheetData from './actions'

const logger = createLogger();
const store = createStore(
  rootReducer, compose(
  applyMiddleware(thunk, promise, logger),
  window.devToolsExtension ? window.devToolsExtension() : f => f)
);

const tableUrl = "https://spreadsheets.google.com/feeds/list/1QxC20NcuHzqp1Fp7Dy2gpBDbJzN4YpmjiEcr7PSpsuM/od6/public/basic?alt=json";

store.dispatch(getSpreadsheetData(tableUrl));

// Create an enhanced history that syncs navigation events with the store
// const history = syncHistoryWithStore(browserHistory, store);

ReactDOM.render(
    <Provider store={store}>
      <Router history={hashHistory}>
        <Route path="/" component={App}>
          <IndexRoute component={Home}/>
          <Route path="/about" component={About}/>
          <Route path="/guest" component={Guest}/>
          <Route path="/booking" component={Booking}/>
        </Route>
      </Router>
    </Provider>,
    document.getElementById('app')
);

減速器bookingdata.js

const initialState = {
  spreadsheetData: [],
  loading: false,
  errorMsg: ''
};

export default function spreadsheet(state = initialState, action) {
  switch (action.type) {
    case 'SPREADSHEET_REQUEST':
      return {
        ...state,
        loading: true
      };

    case 'SPREADSHEET_RECEIVED':
      return {
        ...state,
        loading: false,
        spreadsheetData: action.payload.data,
        errorMsg: ''
      };

    case 'SPREADSHEET_FAIL':
      return {
        loading: false,
        errorMsg: action.payload.error
      };

    default:
      return state;
  }
}

預訂-actions.js

import fetch from 'isomorphic-fetch';

// --- Action-creators ---
function requestSpreadsheet() {
  return {
    type: 'SPREADSHEET_REQUEST'
  }
}

function receiveSpreadsheet(data) {
  return {
    type: 'SPREADSHEET_RECEIVED',
    payload: {
      data: data
    }
  }
}

function receiveSpreadsheetError(error) {
  return {
    type: 'SPREADSHEET_FAIL',
    payload: {
      error: error
    }
  }
}

// --- API ---
function fetchTable(tableUrl) {
  // Code related to API here. Should just return a promise.
  return fetch(tableUrl);
}

// --- Thunks ---
export default function getSpreadsheetData(tableUrl) {
  return function (dispatch, getState) {
    // Tell reducers that you are about to make a request.
    dispatch(requestSpreadsheet());

    // Make the request, then tell reducers about
    // whether it succeeded or not.
    // Here, we update the app state with the results of the API call.
    return fetch(tableUrl)
      .then(response => response.json())
        .then(data => dispatch(receiveSpreadsheet(data.feed.entry)),
              error => dispatch(receiveSpreadsheetError(error)));
  }
}

Booking.js

import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import {Grid, Table} from 'react-bootstrap';
import TableRow from '../components/TableRow';

class Booking extends Component {
  constructor(props) {
    super(props);

  }
  render() {    
    return (
      <Grid fluid className="pageContainer">
        <h4>För att boka, skicka ett mail till oss <a href="mailto:boka@kulaniklappen.se">här!</a></h4>
        <p>{this.props.errorMsg}</p>
        <Table responsive>
          <thead>
          <tr>
            <th>Ledighet</th>
            <th>Vecka</th>
            <th>Datum</th>
            <th>Pris</th>
          </tr>
          </thead>
          <tbody>
            {this.props.spreadsheetData.map((row, i) => {
              return (
                <TableRow key={i} data={row} />
              )
            })}
          </tbody>
        </Table>
      </Grid>
    );
  }
}

const mapStateToProps = (state) => {
  console.log(state);
  return {
    spreadsheetData: state.spreadsheetData,
    loading: state.loading,
    errorMsg: state.errorMsg
  }
};

export default connect(mapStateToProps, null)(Booking);

正如我從錯誤消息中看到的,您的狀態結構是

{
    bookingData: {
        spreadsheetData: ...,
        loading: ...,
        errorMsg: ...
    },
    ...
}

你的mapStateToProps應該是

const mapStateToProps = (state) => {
    console.log(state);
    return {
        spreadsheetData: state.bookingData.spreadsheetData,
        loading: state.bookingData.loading,
        errorMsg: state.bookingData.errorMsg
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM