Skip to main content

create state with dynamic property

i use react js in my project.in my project i have two lvl menu and when mouse enter event occured sub menu showed and when mouse leave event occured sub menu disappear.my problem is when mouse enter event occure on a li all of sub menues appear.and thats because i have just one state.i don't know how can i create a dynamic state.i have mainMenu array that store all menu and sub menu in that and this is absolutely dynamic.(in my example length of my array is 2 but this can be changed) i have a boolean state (isMenuOpen).when it is true sub menu appear and when its false sub menu disappear.i want when mouse enter event occure on a li just appear submenu that related to that li.

this is my App.js

import "./index.css";
import './App.css';
import Sub from "./Sub";
import React, {useState} from "react";

export default function App() {

    const mainMenuArr = [
        {
            id: "1",
            name: "All Products",
            url: "#",
            items: [
                {
                    id: "1-1",
                    name: "our gifts",
                    url: ""
                },
                {
                    id: "1-2",
                    name: "note book",
                    url: ""
                },
                {
                    id: "1-3",
                    name: "calender",
                    url: ""
                }
            ]
        }, {
            id: "2",
            name: "Business Card",
            url: "#",
            items: [
                {
                    id: "2-1",
                    name: "triangle",
                    url: ""
                },
                {
                    id: "2-2",
                    name: "square",
                    url: ""
                },
                {
                    id: "2-3",
                    name: "circle",
                    url: ""
                },
                {
                    id: "2-4",
                    name: "rectangle",
                    url: ""
                },
            ]
        }
    ]

    const [isMenuOpen, setIsMenuOpen] = useState(false);

    const openSubMenu = () => {
        setIsMenuOpen(true);
    }
    const closeMenu = () => {
        setIsMenuOpen(false);
    }

    const mainMenu = mainMenuArr.map(main => {
        return (
            <li onMouseEnter={openSubMenu} onMouseLeave={closeMenu} key={main.id} id={main.id} className='main__item'>
                {main.name}
                <Sub isOpen={isMenuOpen} subItems={main.items}/>
            </li>
        );
    })
    return (
        <div className="container">
            <ul className="main__items">
                {mainMenu}
            </ul>


        </div>
    );
}

this is my App.css

.container{
  background-color: #eee;
  height: 40px;
}
.main__items{
  display: flex;
  position: relative;
}
.main__item{
  margin: 0 20px;
  cursor: pointer;
}

this is my Sub.js

import React from 'react';
import PropTypes from 'prop-types';
import './Sub.css';

const Sub = props => {
    const subArr = props.subItems.map(item => {
        return (
            <li key={item.id} id={item.id} className='sub__item'>
                {item.name}
            </li>
        );
    });

    return (
        <>
            {props.isOpen ?
                <ul className='sub__items'>
                    {subArr}
                </ul>
                : null
            }
        </>
    );
};

Sub.propTypes = {};

export default Sub;

and this is my Sub.css

.sub__items{
    position: absolute;
    top: 40px;
    background-color: bisque;
}
.sub__item{
    margin: 10px;
}

I would be very grateful if anyone could help me

Via Active questions tagged javascript - Stack Overflow https://ift.tt/2FdjaAW

Comments

Popular posts from this blog

Prop `className` did not match in next js app

I have written a sample code ( Github Link here ). this is a simple next js app, but giving me error when I refresh the page. This seems to be the common problem and I tried the fix provided in the internet but does not seem to fix my issue. The error is Warning: Prop className did not match. Server: "MuiBox-root MuiBox-root-1" Client: "MuiBox-root MuiBox-root-2". Did changes for _document.js, modified _app.js as mentioned in official website and solutions in stackoverflow. but nothing seems to work. Could someone take a look and help me whats wrong with the code? Via Active questions tagged javascript - Stack Overflow https://ift.tt/2FdjaAW

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console