使用react-router和redux时如何维护商店的状态?

丹尼斯·墨菲

我正在构建一个基本上模拟电子商务的应用程序原型。我有一些组件,每个组件都有可以添加到购物车的不同项目(下面,我仅显示一个示例,说明其基本工作原理)。使用react-router通过不同的路由访问这些组件。有一个标题组件,显示购物车中当前的物品数量。标头从redux存储中的状态获取购物车中的商品数量。但是,如果我导航到新路线,则商店将恢复为默认状态。当新路线导航到时,我需要商店保持其状态。例如,如果我转到ShoppingPage,将商品添加到购物车,然后返回首页,则我需要购物车中仍然有商品。

actions.js

export const actionTypes = Object.freeze({
    UPDATE_CART: Symbol('UPDATE_CART'),
});

export const updateCart = (payload) => {
    return {
        type: actionTypes.UPDATE_CART,
        payload,
    };
};

export default actionTypes;

reducer.js

import actions from './actions';

export const INITIAL_STATE = {
    cart: [],
};

export default (state = INITIAL_STATE, action) => {
    switch (action.type) {
        case actions.UPDATE_CART: {
            return {
                ...state,
                cart: action.payload,
            };
        }
        default: {
            return state;
        }
    };
};

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { BrowserRouter } from 'react-router-dom';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import reducer, { INITIAL_STATE } from './reducer';

const store = createStore(reducer, INITIAL_STATE);
console.log(store.getState());
ReactDOM.render(
<Provider store ={store}>
    <BrowserRouter>
        <App />
    </BrowserRouter>
</Provider>
, document.getElementById('root'));

serviceWorker.unregister();

ShoppingPage.js

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { updateCart } from './actions';

class ShoppingPage extends Component {
    addToCart = () => {
        const cart = [...this.props.cart];
        cart.push('new item');
        this.props.modifyCart(cart);

    render() {
        return(
            <div>
                <button onClick={addToCart}>
                    Add To Cart
                </button>
            </div>
        )
    }
}

const mapDispatchToProps = dispatch => ({
    modifyCart: payload => dispatch(updateCart(payload)),
});

const mapStateToProps = state => ({
    cart: state.cart,
});

export default connect(
    mapStateToProps,
    mapDispatchToProps,
)(ShoppingPage);

Home.js

import React, { Component } from 'react';
import { ListGroup, ListGroupItem } from 'reactstrap';

class Home extends Component {
    render() {
        return(
            <div>
                <ListGroup>
                    <ListGroupItem><a href='/ShoppingPage'>ShoppingPage</a></ListGroupItem>
            </div>
        )
    }
}

export default Home;

Header.js

import React, { Component } from 'react';
import { Navbar, NavbarBrand } from 'reactstrap';
import { connect } from 'react-redux';

class Header extends Component {
    render() {
        return(
            <Navbar sticky='top' className='nav'>
                <NavbarBrand href='/'>Online Shopping</NavbarBrand>
                    <span>{'Items in Cart: '}{this.props.cart.length}</span>
            </Navbar>
        )
    }
}

const mapStateToProps = state => ({
    cart: state.cart,
});

export default connect(
    mapStateToProps
)(Header);

Routes.js

import React from 'react';
import { Switch, Route } from 'react-router-dom';
import Home from './Home';
import ShoppingPage from './ShoppingPage';

const Routes = () => (
    <Switch>
        <Route exact path='/' component={Home} />
        <Route exact path='/ShoppingPage' component={ShoppingPage} />
    </Switch>
);

export default Routes;

App.js

import React from 'react';
import Routes from './Routes';
import Header from './Header';

function App() {
  return (
    <div>
        <Header />
        <Routes />
    </div>
  );
}

export default App;
法案

可能发生的情况是,在导航过程中,Web应用程序再次“重新加载”(这将清除Redux状态)。为了使用React Router进行导航,您需要查看<Link>

例如,

Home.js

<a href='/ShoppingPage'>ShoppingPage</a>

应该更改为:

<Link to="/ShoppingPage">ShoppingPage</Link>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用react-redux与mapStateToProps,MapDispatchToProps和Redux-Router连接

来自分类Dev

react-router redux我如何在页面加载时更新状态以进行身份验证

来自分类Dev

如何使用react-router-redux routeActions?

来自分类Dev

如何使用reactjs,redux和redux-simple-router根据身份验证状态共享根URL?

来自分类Dev

使用React,redux和react-redux-router登录验证:正确的方法是?

来自分类Dev

使用React Redux Router,我应该如何访问路由状态?

来自分类Dev

如果使用Redux和React-Redux,在React组件中不需要状态吗?

来自分类Dev

如何使用react-router触发状态更改?

来自分类Dev

当登录状态为组件状态时,如何使用react-router实现与登录相关的路径?

来自分类Dev

使用带有redux的react-native-router-flux,如何更新视图组件中的状态?

来自分类Dev

react-router我如何使用redirectLocation或301或302状态

来自分类Dev

如何使用React-Router和React-Redux将道具发送到子路由组件?

来自分类Dev

使用React-Router和Redux时单击链接时如何调度动作?

来自分类Dev

如何使用react(redux)在渲染之前设置状态

来自分类Dev

React-Redux:不能使用商店

来自分类Dev

如何使用React-redux在类组件中分配状态?

来自分类Dev

如何使用React Redux状态有条件地显示和禁用按钮

来自分类Dev

如何使用react-router在组件中保存表单状态

来自分类Dev

使用React Router时切换状态

来自分类Dev

如何使用解析服务维护状态

来自分类Dev

如何使用React Router处理登录状态?

来自分类Dev

使用React和Redux时,状态是未定义的对象,路由器

来自分类Dev

如何使用Lodash和Normalizr处理我的redux商店?

来自分类Dev

使用 React / Redux,如何动态预加载状态?

来自分类Dev

使用 React Router 时如何将方法和状态传递给嵌套组件?

来自分类Dev

如何使用 React、Redux 和 Redux-Saga 实现乐观状态更新/推送

来自分类Dev

React + Redux:商店更新时如何更新状态

来自分类Dev

使用 Immutable 时更新 react-redux 中的状态

来自分类Dev

使用 React Router 渲染组件和 Redux 崩溃

Related 相关文章

  1. 1

    如何使用react-redux与mapStateToProps,MapDispatchToProps和Redux-Router连接

  2. 2

    react-router redux我如何在页面加载时更新状态以进行身份验证

  3. 3

    如何使用react-router-redux routeActions?

  4. 4

    如何使用reactjs,redux和redux-simple-router根据身份验证状态共享根URL?

  5. 5

    使用React,redux和react-redux-router登录验证:正确的方法是?

  6. 6

    使用React Redux Router,我应该如何访问路由状态?

  7. 7

    如果使用Redux和React-Redux,在React组件中不需要状态吗?

  8. 8

    如何使用react-router触发状态更改?

  9. 9

    当登录状态为组件状态时,如何使用react-router实现与登录相关的路径?

  10. 10

    使用带有redux的react-native-router-flux,如何更新视图组件中的状态?

  11. 11

    react-router我如何使用redirectLocation或301或302状态

  12. 12

    如何使用React-Router和React-Redux将道具发送到子路由组件?

  13. 13

    使用React-Router和Redux时单击链接时如何调度动作?

  14. 14

    如何使用react(redux)在渲染之前设置状态

  15. 15

    React-Redux:不能使用商店

  16. 16

    如何使用React-redux在类组件中分配状态?

  17. 17

    如何使用React Redux状态有条件地显示和禁用按钮

  18. 18

    如何使用react-router在组件中保存表单状态

  19. 19

    使用React Router时切换状态

  20. 20

    如何使用解析服务维护状态

  21. 21

    如何使用React Router处理登录状态?

  22. 22

    使用React和Redux时,状态是未定义的对象,路由器

  23. 23

    如何使用Lodash和Normalizr处理我的redux商店?

  24. 24

    使用 React / Redux,如何动态预加载状态?

  25. 25

    使用 React Router 时如何将方法和状态传递给嵌套组件?

  26. 26

    如何使用 React、Redux 和 Redux-Saga 实现乐观状态更新/推送

  27. 27

    React + Redux:商店更新时如何更新状态

  28. 28

    使用 Immutable 时更新 react-redux 中的状态

  29. 29

    使用 React Router 渲染组件和 Redux 崩溃

热门标签

归档