I have a button that adds a new div (onClick). I want to add +1 to cargoNumberCounter so that it shows that it’s a new div.
const [addReference, setAddReference] = useState([]) const [cargoNumberCounter, setCargoNumberCounter] = useState(1) const createNewRef = () => { setCargoNumberCounter(cargoNumberCounter + 1) const newRef = ( <div> <Heading> Cargo # {cargoNumberCounter} // {cargoNumberCounter.map((num, i) => ( // <p key={i}>Cargo # {num}</p> // ))} </Heading> <Button onClick={createNewRef}> Add more cargo </Button> </div> ) setAddReference((ref) => [...ref, newRef]) }
I thought I could make it work like I have shown in the example, or by spreading the state like so setCargoNumberCounter([...cargoNumberCounter, cargoNumberCounter +1])
, but for some reason it doesn’t work.
Any thoughts on how to add +1 to each new div ?
Advertisement
Answer
It sounds like you may be better off with one button to add new items of cargo to the list. Here’s a quick example.
const { useState } = React; function Example() { // Simple counter in state. You may prefer this to be // an array, or an object that you can add item objects to const [counter, setCounter] = useState(0); // Returns an array of divs based on the counter value function getDivs() { const divs = []; for (let i = 0; i < counter; i++) { divs.push(<div>{i + 1}</div>); } return divs; } // Updates the counter function handleClick() { setCounter(counter + 1); } return ( <div> <div className="divs"> {getDivs()} </div> <div className="counter">Div count: {counter}</div> <button type="button" onClick={handleClick}> Add new div </button> </div> ); } ReactDOM.render( <Example />, document.getElementById('react') );
.divs { border: 1px solid #676767; padding-left: 0.3em; } .divs, .counter { margin-bottom: 1em; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script> <div id="react"></div>