【问题标题】:redux don't show props on another pageredux 不在另一个页面上显示道具
【发布时间】:2019-07-06 11:03:53
【问题描述】:

我有一个所有页面的导航栏。我想在里面做一个购物车,但是当我进入内部产品页面时,我传输的道具没有显示出来。

为什么会这样? 我想这是我的问题React router v4 not working with Redux 但是我该如何实现呢? 你怎么看?

App.js

   import React, {Component} from 'react';
import {Container} from 'reactstrap';
import {
  BrowserRouter,
  Route,
  Switch
} from "react-router-dom";

import './App.css';
import NavbarMenu from './components/navbar'
import Main from './components/main';
import Good from './components/good';

class App extends Component {

  render() {
    return (
      <BrowserRouter>
        <div className="App">
          <NavbarMenu/>
          <Container>
            <Switch>
              <Route path="/" exact component={Main}/>
              <Route path="/good/:id" component={Good}/>
            </Switch>
          </Container>
        </div>
      </BrowserRouter>
    );
  }
}

export default App;

导航栏

  import React from 'react';
import {
  Collapse,
  Navbar,
  NavbarToggler,
  NavbarBrand,
  Nav,
  UncontrolledDropdown,
  DropdownToggle,
  DropdownMenu,
  DropdownItem,
  Button
} from 'reactstrap';
import {withRouter} from 'react-router-dom';
import connect from 'react-redux/es/connect/connect';
import {getCart} from '../../redux/actions/cartAction';

class NavbarMenu extends React.Component {
  constructor(props) {
    super(props);

    this.toggle = this.toggle.bind(this);
    this.state = {
      isOpen: false
    };
  }

  toggle() {
    this.setState({
      isOpen: !this.state.isOpen
    });
  }

  render() {
console.log(this.props)
    const cartLength = this.props.cart.length;
    const cartItems = this.props.cart.map(e => {
      return <div key={e.id} style={{marginBottom: '20px'}}>
        <DropdownItem
          style={{display: 'inline-block', width: 'auto'}}
          onClick={() => {
            this.props.history.push('/good/' + e.id)
          }}>
          {e.name}
        </DropdownItem>
        <Button
          style={{display: 'inline-block', float: 'right', marginRight: '20px'}}
          color="danger"
        >X</Button>
      </div>
    });

    return (
      <Navbar
        color="light"
        light expand="md"
        style={{marginBottom: '20px'}}
      >
        <NavbarBrand
          style={{cursor: 'pointer'}}
          onClick={() => {
            this.props.history.push('/')
          }}
        >
          Shop
        </NavbarBrand>
        <NavbarToggler onClick={this.toggle}/>
        <Collapse isOpen={this.state.isOpen} navbar>
          <Nav className="ml-auto" navbar>
            <UncontrolledDropdown nav inNavbar>
              <DropdownToggle nav caret>
                Cart: {cartLength} items
              </DropdownToggle>
              <DropdownMenu right style={{width: '300px'}}>
                {cartItems}

                <DropdownItem divider/>

              </DropdownMenu>
            </UncontrolledDropdown>
          </Nav>
        </Collapse>
      </Navbar>
    );
  }
}

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

export default withRouter(connect(mapStateToProps, {getCart})(NavbarMenu));

【问题讨论】:

    标签: javascript reactjs redux routing


    【解决方案1】:

    根据您提供的打印结果,您在不同的窗口中打开项目,因此,窗口中会话的变量没有传递。

    您可以使用的一种解决方案是在浏览器 localStorage 中保存您稍后需要的商店部分。

    您可以通过使用 Redux 订阅功能来做到这一点。

    一个例子可以是:

    localStorage.js

    export const loadState = () => {
      try {
        const serializedState = localStorage.getItem('state');
        if (serializedState === null) return undefined;
    
        return JSON.parse(serializedState);
      } catch (err) { return undefined; }
    };
    
    export const saveState = (state) => {
      try {
        const serializedState = JSON.stringify(state);
      } catch (err) {
        // errors
      }
    }
    

    你可以在 redux 商店里放:

    import { loadState, saveState } from './localStorage'; 
    
    const persistedState = loadState();
    const store = createStore(persistedState);
    
    store.subscribe(() => saveState(store.getState()));
    

    来源:https://egghead.io/lessons/javascript-redux-persisting-the-state-to-the-local-storage

    【讨论】:

    • 我使用 Redux 从数据库中获取数据,不需要将其存储在 localstorage joxi.ru/KAg8KE1uEKwqlr 中。我需要从数据库中获取它
    • @СтасРябцев 尝试把 const mapStateToProps = state => ({ car​​t: state.cart });而不是 state.cart.cart
    • 我不明白为什么它是 cart.cart,尽管这可能是问题所在。但是现在尝试保存存储并从 localStorage 加载。问题是当您打开一个新窗口时,会加载新变量,因此会加载一个新商店。如果您从 localStorage 加载存储,它将包含所需的数据。如果您看到日志,主页上的第一个 console.log 会显示购物车的 0 个itens,然后发生了将商品放入购物车的事情,因此,如果您将此数据保存在 localStorage 中,您可以将数据加载到一个新窗口并使用您想要的数据加载应用程序。
    • 不,因为我有对象和数组购物车joxi.ru/Dr86KoQSoMeay2 问题是别的,我认为它与路由有某种关系
    • 如果您在同一个窗口中打开商品,而不是打开新窗口,购物车将包含您想要的值? (抱歉,回答晚了,顺便说一句)
    【解决方案2】:

    我通过添加此代码解决了我的问题

    componentDidMount() {
       this.props.getCart();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2018-06-18
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多