【问题标题】:Getting details of a single item from a json list using a new details component in React使用 React 中的新详细信息组件从 json 列表中获取单个项目的详细信息
【发布时间】:2019-07-11 15:29:01
【问题描述】:

我是 React 的新手,当从另一个 Details 组件在 React 中单击项目时,我遇到了获取项目详细信息的问题。我有 MenuComponent.js,它应该在单击任何卡时调用 DishDetailComponent.js,但是当我这样做时,我的菜肴详细信息组件中出现错误

 const DishDetail = this.props( (selectedDish)=> { })

this.props 不是一个函数。这是菜单组件中用于调用 DishDetail 组件的代码

import React, { Component } from 'react';
import { Media } from "reactstrap";
import { Card, CardImg, CardImgOverlay, CardText, CardBody, CardTitle } from 
"reactstrap";
import DishDetail from './DishDetailComponent.js';

class Menu extends Component {
  constructor(props) {
     super(props);
     this.state = {
        selectedDish: null
     };
  }

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


  render() {
     const menu = this.props.dishes.map((dish)=> {
        return (
            <div key={dish.id} className="col-12 col-md-5 m-1">
                <Card onClick={()=>this.onDishSelect(dish)}>
                    <CardImg width="100%" src={dish.image} alt={dish.name} />
                    < CardImgOverlay>
                        <CardTitle>{dish.name}</CardTitle>
                        <p>{dish.description}</p>
                    </CardImgOverlay>
                </Card>
            </div>
        );
    });
    return(
        <div className="container">
            <div className="row">
                {menu}
            </div>
            <div className="row">
                <DishDetail selectedDish={this.state.selectedDish}/>
            </div>
        </div>
    );
  }
}

export default Menu;

这是给我带来问题的 DishDetail 组件

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

class DishDetail extends Component{
   constructor(props) {
     super(props);
   }

 render() {
     const DishDetail = this.props( (selectedDish)=> {
         if (selectedDish != null) {
             return (
                 <Card>
                     <CardImg width="100%" src={selectedDish.image} alt={selectedDish.name} />
                     <CardBody>
                         <CardTitle>{selectedDish.name}</CardTitle>
                         <CardText>{selectedDish.description}</CardText>
                     </CardBody>
                 </Card>
             )
         } else {
             return (
                 <div></div>
             );
         }
     });

     return (
         <div className="container">
             <div className="row">
                 {DishDetail}
             </div>
         </div>
     )
   }
 }

 export default DishDetail;

谢谢

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    这应该可行:

    import React, { Component } from 'react';
    import { Card, CardImg, CardImgOverlay, CardText, CardBody, CardTitle } from 
    'reactstrap';
    
    class DishDetail extends Component{
        constructor(props) {
          super(props);
        }
    
        renderDish(dish) {
            if (dish != null)
                return(
                    <Card>
                        <CardImg top src={dish.image} alt={dish.name} />
                        <CardBody>
                          <CardTitle>{dish.name}</CardTitle>
                          <CardText>{dish.description}</CardText>
                        </CardBody>
                    </Card>
                );
            else
                return(
                    <div></div>
                );
        }
    
        render() {
    
            return (
                <div className="container">
                    <div className="row">
                        {this.renderDish(this.props.selectedDish)}
                    </div>
                </div>
            )
    
        }
    }
    
    export default DishDetail;
    

    【讨论】:

      【解决方案2】:
      import  React, { Component } from 'react';
      import { Card, CardImg, CardImgOverlay, CardText, CardBody, CardTitle } from 
      "reactstrap";
      
      const DishDetail = ({ selectedDish }) => {
          return (
              <div className="container">
                  <div className="row">
                      { selectedDish &&
                          <Card>
                              <CardImg width="100%" src={selectedDish.image} alt={selectedDish.name} />
                              <CardBody>
                                  <CardTitle>{selectedDish.name}</CardTitle>
                                  <CardText>{selectedDish.description}</CardText>
                              </CardBody>
                          </Card>
                      }
                  </div>
              </div>
          )
      };
      
      export default DishDetail;
      

      这个组件的目的是展示信息,所以功能性组件在这里是更好的选择(而不是类),但是对此没有限制,只是一个推荐。尝试通过代码并理解它,如果有任何问题,请不要着急问..

      【讨论】:

      • 没有检查您的其他组件,但可以看到它们可以稍微改进和简化。
      • 想知道'selectedDish &&'的意义
      • && 是逻辑运算符 AND,如果两个操作数都为真,则返回真。在这种情况下,如果 selectedDish 不为 null (true) - 在 && 的另一侧渲染组件,如果 selectedDish 为 null (false),则甚至不检查另一侧的 true/false,并且不会渲染组件。简单来说 - 如果 selectedDish = null,则不要在 && 的右侧渲染任何内容,如果不是 null,则渲染 && 右侧的内容。我不擅长解释,xD 希望它会有所帮助
      【解决方案3】:

      this.props 不是一个函数,它是一个对象。试着像这样写你的DishDetail

      import  React, { Component } from 'react';
      import { Card, CardImg, CardImgOverlay, CardText, CardBody, CardTitle } from 
      "reactstrap";
      
      class DishDetail extends Component{
         constructor(props) {
           super(props);
         }
      
       render() {
           const { selectedDish } = this.props;
           const DishDetail = () => {
              if (selectedDish) {
                 return (
                   <Card>
                       <CardImg width="100%" src={selectedDish.image} alt={selectedDish.name} />
                       <CardBody>
                           <CardTitle>{selectedDish.name}</CardTitle>
                           <CardText>{selectedDish.description}</CardText>
                       </CardBody>
                   </Card>
                 )
              }
              return (
                 <div />
              );
           
          }
           
      
           return (
               <div className="container">
                   <div className="row">
                       {DishDetail}
                   </div>
               </div>
           )
         }
       }
      
       export default DishDetail;

      【讨论】:

      • 感谢您的回答,但是当我单击任何卡片时没有弹出任何内容,当我在 const DishDetail 中执行 console.log(selectedDish) 时没有显示结果,但是当我在 DishDetail 之前执行此操作时将 this.props 分配给 selectedDish 后,我确实看到了值
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2012-06-02
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多