【问题标题】:Accessing a property of a state variable in react and using it for comparison在反应中访问状态变量的属性并使用它进行比较
【发布时间】:2021-08-01 09:04:45
【问题描述】:

嗨,我是全新的反应。在我的应用程序中,我有两个状态变量,“dishes”(一个包含各种菜肴细节的对象,例如“id”、“name”等)和“selectedDish”(一个数值)。当用户点击菜单中的一道菜(由“菜单”组件呈现)时, selectedDish 变量会更新为所选菜的 id(我已经检查过它是否有效)。 现在我想通过做来选择这道菜 dish={this.state.dishes.filter((dish)=>{return dish.id===this.state.selectedDish})[0]} 然后将其作为道具传递给另一个组件(DishDetail)。

我的问题是我似乎无法使用上述方法选择一道菜。 (我从 DishDetail 组件中收到错误“this.props.dish”未定义)。我做错了吗?

class Main extends Component {

constructor(props) {
  super(props);

  this.state = {
    dishes: DISHES,
    selectedDish: null
  };
}


onDishSelect(dishId){
    this.setState({selectedDish : dishId})
}


  render(){

    
  

    return (
      <div>
          <div className="container">
            <div className="row">
                <Menu dishes={this.state.dishes}   onClick={(dishId)=>{
                    this.onDishSelect(dishId)}}/>
                <DishDetail dish={this.state.dishes.filter((dish)=>
                    { 
                        return dish.id===this.state.selectedDish
                    })[0]} />
            </div>
          </div>
      
      </div>
    );
  }
}

export default Main;

DishDetail 组件

import React, { Component } from 'react'
import { Card, CardImg, CardImgOverlay, CardBody, CardText, CardTitle } from 'reactstrap';


class DishDetail extends Component {

    
    constructor(props){
        super(props);

        this.state ={
        }
    }



    render(){


        return (
                <div className="col-12 col-md-5 m1">
                    <Card>
                        <CardImg width="100%" src = {this.props.dish.image} alt = {this.props.dish.name}/>

                        <CardBody>
                                <CardTitle>{this.props.dish.name}</CardTitle>
                                <CardText>{this.props.dish.description}</CardText>
                        </CardBody>

                    </Card>
                     
                </div>

        )


    }


}

export default DishDetail;

【问题讨论】:

  • 好吧,你必须显示为 DishDetail 组件的代码,不是吗。
  • 您可以在菜单组件中为每道菜使用 DishDetail 组件。如果你这样做了,你就不用担心所有这些了。
  • 已添加。谢谢!
  • 你确定这不起作用。它对我来说运行得很好。

标签: javascript reactjs


【解决方案1】:

您遇到的问题是因为初始状态为空

selectedDish: null

在您的 DishDetails 组件中添加一个检查,以便在菜道具不为空之前不渲染。

render(){
        const { dish } = this.props;
        
        if (!dish) {
           return null;
        }
        
        return (
            <div className="col-12 col-md-5 m1">
                <Card>
                    <CardImg width="100%" src = {this.props.dish.image} alt = {this.props.dish.name}/>

                    <CardBody>
                            <CardTitle>{this.props.dish.name}</CardTitle>
                            <CardText>{this.props.dish.description}</CardText>
                    </CardBody>

                </Card>
            </div>
        )
    }

【讨论】:

  • 这就是我的想法,但你能解释一下为什么即使没有定义菜,这似乎也有效。 React 不应该渲染任何东西
  • 当你渲染一个未定义的变量时,它不会渲染任何东西,但是当你尝试从一个未定义的变量访问属性时,它不会从未定义的变量中找到它的键并抛出一个错误。跨度>
  • 谢谢你!!!!!!我一直在努力解决这个问题,几乎熬了一晚上才想弄清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多