简体   繁体   English

试图让一个计数器与 React 和多个组件一起工作

[英]Trying to get a counter to work with React and multiple components

I am working on trying to get this counter for pintsLeft to work.我正在努力让这个计数器让 pintsLeft 工作。 This is my first project with React and I feel that I am either not passing the property of the array correctly or my function code is not set correctly.这是我使用 React 的第一个项目,我觉得我要么没有正确传递数组的属性,要么我的函数代码设置不正确。

^^^^KegDetail.js^^^^
 import React from "react";
import PropTypes from "prop-types";

function KegDetail(props){
  const { keg, onClickingDelete} = props 
  
  return (
    <React.Fragment>
    <hr/>
    <h2>{keg.name} Made By {keg.brewery}</h2>
    <p>abv {keg.abv}</p>
    <h3>price {keg.price}</h3>
    <p>{keg.pintsLeft} total pints left</p> {/* Make this a percentage */}
    <hr/>
    <button onClick={ props.onClickingEdit }>Update Keg</button>
    <button onClick={()=> onClickingDelete(keg.id) }>Delete Keg</button>
    <button onClick={()=> this.onSellingPint()}>Sell A Pint!</button>
  </React.Fragment>
  );
}

KegDetail.propTypes = {
  keg: PropTypes.object,
  onClickingDelete: PropTypes.func,
  onClickingEdit:PropTypes.func,
  onSellingPint:PropTypes.func
}

export default KegDetail;

That was my KegDetail.js那是我的 KegDetail.js

import React, {useState} from "react";
import NewKegForm from "./NewKegForm";
import DraftList from "./DraftList";
import KegDetail from "./KegDetail";
import EditKegForm from "./EditKegForm";

class DraftControl extends React.Component {

  constructor(props){
    super(props);
    this.state = {
      kegFormVisibleOnPage: false,
      fullDraftList: [],
      selectedKeg: null,
      editing: false,
      pints: 127,
      
      
      
      
      
      
    };
    this.handleClick = this.handleClick.bind(this);
    this.handleSellingPint = this.handleSellingPint.bind(this);
    
  
  }

  handleClick = () => {
    if (this.state.selectedKeg != null){
      this.setState({
        kegFormVisibleOnPage: false,
        selectedKeg: null,
        editing: false
      });
    } else {
      this.setState(prevState => ({
        kegFormVisibleOnPage: !prevState.kegFormVisibleOnPage,
      }));
    }
  }

  handleSellingPint = () => {
   this.setState({
     pints:this.state.pints-1
   })
  };

render() {
    let currentlyVisibleState = null;
    let buttonText = null;
    
    if (this.state.editing){
      currentlyVisibleState = <EditKegForm keg = {this.state.selectedKeg} onEditKeg = {this.handleEditingKegInDraftList} />
      buttonText = "Return to the Draft List"
    }
    else if (this.state.selectedKeg != null){
      currentlyVisibleState = <KegDetail keg = {this.state.selectedKeg} onClickingDelete = {this.handleDeletingKeg}
      onClickingEdit = {this.handleEditClick} onSellingPint = {this.handleSellingPint}/>
      buttonText = "Return to the Keg List"

My DraftControl.js code我的 DraftControl.js 代码

I don't know what I am doing wrong.我不知道我做错了什么。 I cant get the keg.pintsLeft to pass a number when I console.log, So I may be targeting it incorrectly.当我使用 console.log 时,我无法让 keg.pintsLeft 传递一个数字,所以我的目标可能不正确。

Thanks again!再次感谢!

Try it like this:像这样尝试:

handleSellingPint = () => {
   this.setState(prevState => {
     return {
         pints: prevState.pints-1
     }
   })
};

edit编辑

Also, you invoke the onSellingPint() in a wrong way.此外,您以错误的方式调用了onSellingPint()

  1. It's not a class component, so React doesn't know what does this refer to.它不是一个类组件,所以 React 不知道this指的是什么。
  2. The function itself is passed in as a prop, so you should reference it like this: <button onClick={() => props.onSellingPint() />函数本身作为道具传入,因此您应该像这样引用它: <button onClick={() => props.onSellingPint() />
 handleSellingPint = (id) => {
    const clonedArray = [...this.state.fullDraftList]
    for (let i = 0; i < this.state.fullDraftList.length; i++){
      if (clonedArray[i].id === id){
        clonedArray[i].pintsLeft -= 1
      }
    }
    this.setState({
          fullDraftList: clone
    });
  }

Is what I came up with.是我想出来的。

Since you are alteriting a state within an array, you need to clone the array and work on that array, not the "real" one.由于您正在更改数组中的状态,因此您需要克隆该数组并处理该数组,而不是“真正的”数组。

Thanks for all your help!感谢你的帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM