0

I am trying to create a Navigation tab for my ReactJs Frontend, but somehow the one using React-bootstrap Navbar is causing my parent state to reset.

I know that routing between the pages could lead to state reset for peer components if using Switch, However this is not the case here, I am using Routes, but still it is resetting the parent state!!!

Just to make sure that it is React-bootstrap Navbar which is causing this problem, I implemented the temporary navbar using Link and it is working without any problem, no case of state reset either for Parent or Child/peer components.

Here is Parent component - App.js

import getWeb3 from '../helper/web3.js';
import '../styles/App.css';
import contractJson from '../helper/contractAbi.json'
// import Participant from "./Participant.js";
import GetParticipant from "./GetParticipant"
import AddParticipant from "./AddParticipant"
// import Product from "./Product.js";
import Products from "./Products.js";
import ChangeProductOwnership from "./ChangeProductOwnership";
import AddProduct from "./AddProduct";
import { BrowserRouter as Router, Routes, Link, Route } from "react-router-dom";
import MyNavbar from "./Navbar.js";
import Home from "../pages/Home.js";
import About from "../pages/About"
import { Button } from "react-bootstrap"
import Navtest from "./navtest.js";



function App() {
  const [rowsData, setRowsData] = useState([]);
  const [product, setProduct] = useState({});
  const [participant, setParticipant] = useState({});
  const [account, setAccount] = useState('');
  const [owner, setOwner] = useState(false);
  // const [web3, setWeb3] = useState();
  const [supplyChain, setSupplychain] = useState();
  const [provenance, setProvenance] = useState([]);
  const isConnected = useRef(false);
 
  //all the function implementation
  .......
  .......
  .......
  .......

  return (
    <div className="App">
      {/* <header className="App-header">
        <h1> Welcome to Supply Chain DApp </h1>
      </header> */}
      <Router basename="/">
        
        {/* Navbar using React-bootstrap */}
        <MyNavbar connectWallet={connectWallet}/>

        {/* Navbar using normal Link */}
        <Navtest connectWallet={connectWallet}/>

        <hr />
        <Routes>
          <Route path='/' element={<Home/>}></Route>
          <Route path='/getParticipant'  element={
            <GetParticipant  
              participant={participant}
              handleParticipantChange={handleParticipantChange}
              getParticipant={getParticipant}
            />
          }></Route>
          <Route path='/addParticipant'  element={
            <AddParticipant  
              participant={participant}
              handleParticipantChange={handleParticipantChange}
              addParticipant={addParticipant}
            />
          }></Route>
          <Route path='/products' element={
            <Products
              rowsData={rowsData} 
              getProduct={getProduct}
              provenance={provenance}
              getProvenance={getProvenance}
            />
          }></Route>
          <Route path='/changeProductOwnership' element={
            <ChangeProductOwnership
              owner={owner}
              handleOwnerChange={handleOwnerChange}
              changeOwnership={changeOwnership}
            />
          }></Route>
          <Route path='/addProduct' element={
            <AddProduct
              product={product}
              handleChange={handleChange} 
              addProduct={addProduct}
            />
          }></Route>
          <Route path='/about'  element={<About />}></Route>
        </Routes>
      </Router>
    </div>
  );
}

export default App;

React-bootstrap Navbar - Mynavbar.js (causing state reset for App component)

import Container from 'react-bootstrap/Container';
import { Nav, Navbar, NavDropdown, Button } from 'react-bootstrap';
import 'bootstrap/dist/css/bootstrap.min.css';
import React, { useState } from "react";


const MyNavbar = ({connectWallet}) => {
  const [showParticipant, setShowParticipant] = useState(false);
  const [showProduct, setShowProduct] = useState(false);

  const showParticipantDropdown = (e)=>{
      setShowParticipant(!showParticipant);
  }
  const hideParticipantDropdown = e => {
      setShowParticipant(false);
  }

  const showProductDropdown = (e)=>{
    setShowProduct(!showProduct);
  }
  const hideProductDropdown = e => {
    setShowProduct(false);
  }
  
  return (
    <Navbar bg="light" expand="lg">
      <Container>
        <Navbar.Brand href="/">Home</Navbar.Brand>
        <Navbar.Toggle aria-controls="basic-navbar-nav" />
        <Navbar.Collapse id="basic-navbar-nav">
          <Nav className="me-auto">
            <NavDropdown title="Participants" id="basic-nav-dropdown"
              show={showParticipant}
              onMouseEnter={showParticipantDropdown} 
              onMouseLeave={hideParticipantDropdown}
            >
              <NavDropdown.Item href="/getParticipant">Get Participant Details</NavDropdown.Item>
              <NavDropdown.Item href="/addParticipant">Add New Participant</NavDropdown.Item>
            </NavDropdown>
            <NavDropdown title="Products" id="basic-nav-dropdown"
              show={showProduct}
              onMouseEnter={showProductDropdown} 
              onMouseLeave={hideProductDropdown}
            >
              <NavDropdown.Item href="/products">Products</NavDropdown.Item>
              <NavDropdown.Item href="/changeProductOwnership">Change Product Ownership</NavDropdown.Item>
              <NavDropdown.Item href="/addProduct">Add New Product</NavDropdown.Item>
            </NavDropdown>
            <Nav.Link href="/about">About</Nav.Link>
          </Nav>
          <Button className="pull-right" onClick={event => connectWallet(event)}>Connect Wallet??</Button>
        </Navbar.Collapse>
      </Container>
    </Navbar>
  );
}

export default MyNavbar;

Navbar using Link - Navtest.js (working fine)

import React from 'react';
import { Button } from 'react-bootstrap';
import { Link } from "react-router-dom";
const Navtest = ({connectWallet}) =>{
  return (
    <div>
        <ul>
        <li>
            <Link to="/">Home</Link>
        </li>
        <li>
            <Link to="/about">About</Link>
        </li>
        <li>
            <Link to="/products">Products</Link>
        </li>
        <li>
            <Link to="/getParticipant">Get Participant</Link>
        </li>
        </ul>
        <Button className="pull-right" onClick={event => connectWallet(event)}>Connect Wallet??</Button>
    </div>
  );
}
export default Navtest;

I dont want any help on creating navbar, but the real problem is the page reload caused due to React-bootstrap Navbar!!! How to avoid this???

Please help!!!

0 Answers0