【问题标题】:Why is my react component not updating?为什么我的反应组件没有更新?
【发布时间】:2017-05-23 17:02:28
【问题描述】:

我有一个简单的Cart 组件,我想在其中没有商品时显示“您的购物车是空的”消息。

import React, { Component } from 'react'
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import * as CartActions from '../actions/cart'
import Shelf from './Shelf'
import EmptyCart from './EmptyCart'

/*
This is a container component
*/
class Cart extends Component {

  constructor(props) {
    super(props)
    this.state = {
      itemQuantity: props.cart.length
    }
  }

  render() {
    const CartItems = this.props.cart.map(
      (item, idx) =><li key={idx}>{item.name} - ${item.price}</li>
    )

    const isCartEmpty = () => this.state.itemQuantity === 0

    console.log("is cart empty? ", isCartEmpty(), "cart item quantity ", this.state.itemQuantity)

    return(
      <div className="Cart">
        <Shelf addItem={this.props.action.addToCart} />
        <h2>Cart Items</h2>
        <ol>
        { isCartEmpty() ? <EmptyCart/> : {CartItems} }
        </ol>
      </div>
    )
  }
}

function mapStateToProps(state, prop) {
  return {
    cart: state.cart
  }
}

function mapDispatchToProps(dispatch) {
  return {
     action: bindActionCreators(CartActions, dispatch)
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(Cart)

我的Shelf 组件如下所示:

import React, { Component } from 'react';

class Shelf extends Component {
  constructor(props) {
    super(props)

    this.addItemToCart = this.addItemToCart.bind(this)

    this.state = {
      shelfItems: [
        { "name": 'shampoo', "price": 23 },
        { "name": 'chocolate', "price": 15 },
        { "name": 'yogurt', "price": 10 }
      ]
    }
  }

  addItemToCart(item){
    this.props.addItem(item)
  }

  render() {
    const shelfItems = this.state.shelfItems.map((item, idx) => {
      return <li key={idx}><button onClick={()=>this.addItemToCart(item)}>[+]</button>{item.name} - ${item.price}</li>
    })
    return(
      <div>
        <h2>Shelf</h2>
        <ul>
          {shelfItems}
        </ul>
      </div>
    )
  }
}
export default Shelf

购物车减速器:

export default(state = [], payload) => {
  switch (payload.type) {
    case 'add':
      return [...state, payload.item]
    default:
      return state
  }
}

addToCart 操作:

export const addToCart = (item) => {
  return {
    type: 'add',
    item
  }
}

显示空消息,但添加项目时列表未更新。我究竟做错了什么?如果我删除条件并只渲染CartItems

,代码就可以正常工作

【问题讨论】:

  • 添加到购物车时是否正在调度操作?能否请您展示您的操作和减速器。
  • 更新的代码 - 问题是我没有更新状态 - 我不知道如何准确 - 我应该手动执行吗?

标签: reactjs redux conditional components updates


【解决方案1】:

这是因为您只设置了初始状态。添加项目时,您不会设置新状态。如果您使用 redux,则不需要本地状态。

试试这个:

class Cart extends Component {

  constructor(props) {
    super(props)
    this.state = {}
  }

  render() {
    const CartItems = this.props.cart.map(
      (item, idx) =><li key={idx}>{item.name} - ${item.price}</li>
    )

    const isCartEmpty = CartItems.length === 0

    return(
      <div className="Cart">
        <Shelf addItem={this.props.action.addToCart} />
        <h2>Cart Items</h2>
        <ol>
         {isCartEmpty ? <li>Your Cart is Empty</li> : CartItems}
        </ol>
      </div>
    )
  }
}

【讨论】:

  • @AmitErandole 使用 const isCartEmpty = () => CartItems.length === 0。添加项目时检查具有初始状态且未更新的本地状态
  • 对不起 - 它确实有效!你能告诉我如何使用&lt;EmptyCart/&gt; 组件吗?
  • @AmitErandole 为什么你的 redux 状态是一个数组?它必须是一个对象
  • 我明白了——我是新手——请告诉我这会有什么不同
  • @AmitErandole 您是否尝试过将数组输出到控制台?项目添加了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 2021-01-24
  • 2019-02-08
  • 2018-07-03
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多