最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Using Refs To Style A Div Element - Stack Overflow

programmeradmin2浏览0评论

Good day,

I'm new to react JS and I want to get a div element using refs and style it. It gives an error(can't read the property style of undefined).

import React, { useState, useRef } from 'react'

function Menubar() {
  const [show, setshow] = useState(false)
  const clickref = useRef()
  const openMenu = () => {
    if (show === false) {
      clickref.current.style.display = "block";
      setshow(true);
    }
    clickref.current.style.display = "none";
    setshow(false);
  }
  return (
    <div className="menu">
      <div className="menuBar">
        <div className="navBar ">
          <img src={Drop} alt="DrpBtn" className="drpBtn" onClick={openMenu()} />
          <ul className="navCon" ref={clickref}>
            <li><Link to="/">Home</Link></li>
            <li><Link to="/menu">Menu</Link></li>
            <li><Link to="/news">News</Link></li>
            <li><Link to="/about">About</Link></li>
            <li><Link to="/contact">Contact Us</Link></li>
            <li><Link to="/patner">Patner</Link></li>
          </ul>
        </div>
      </div>
    </div>
  )
}

export default Menubar

Good day,

I'm new to react JS and I want to get a div element using refs and style it. It gives an error(can't read the property style of undefined).

import React, { useState, useRef } from 'react'

function Menubar() {
  const [show, setshow] = useState(false)
  const clickref = useRef()
  const openMenu = () => {
    if (show === false) {
      clickref.current.style.display = "block";
      setshow(true);
    }
    clickref.current.style.display = "none";
    setshow(false);
  }
  return (
    <div className="menu">
      <div className="menuBar">
        <div className="navBar ">
          <img src={Drop} alt="DrpBtn" className="drpBtn" onClick={openMenu()} />
          <ul className="navCon" ref={clickref}>
            <li><Link to="/">Home</Link></li>
            <li><Link to="/menu">Menu</Link></li>
            <li><Link to="/news">News</Link></li>
            <li><Link to="/about">About</Link></li>
            <li><Link to="/contact">Contact Us</Link></li>
            <li><Link to="/patner">Patner</Link></li>
          </ul>
        </div>
      </div>
    </div>
  )
}

export default Menubar
Share Improve this question edited Oct 28, 2020 at 12:51 Mario Petrovic 8,36215 gold badges43 silver badges66 bronze badges asked Oct 28, 2020 at 12:35 random_devrandom_dev 1532 silver badges9 bronze badges 2
  • Why would you use a ref here? You're already keeping track of the state (show). With this you could simply do <ul className="navCon" style={{display: show ? 'block' : 'none'}}>. – Yoshi Commented Oct 28, 2020 at 12:42
  • okay let me try it – random_dev Commented Oct 28, 2020 at 12:49
Add a ment  | 

3 Answers 3

Reset to default 3

As you're new to react I'd say you're misusing refs here. Use the state value you already have to do the logic, e.g.:

import React, { useState } from 'react'
import { Link } from 'react-router-dom';

function Menubar() {
  const [show, setShow] = useState(false);

  const toggleMenu = () => {
    // toggle the current state
    setShow(current => !current);
  };

  return (
    <div className="menu">
      <div className="menuBar">
        <div className="navBar ">
          <button onClick={toggleMenu}>toggle</button>

          {/*use show to handle the styling*/}
          <ul className="navCon" style={{display: show ? 'block' : 'none'}}>
            <li><Link to="/">Home</Link></li>
            <li><Link to="/menu">Menu</Link></li>
            <li><Link to="/news">News</Link></li>
            <li><Link to="/about">About</Link></li>
            <li><Link to="/contact">Contact Us</Link></li>
            <li><Link to="/patner">Patner</Link></li>
          </ul>
        </div>
      </div>
    </div>
  )
}

export default Menubar;

Change onClick={openMenu()} to onClick={openMenu}

Fixing onClick={openMenu} is not enought, your display style is always none, to fix it add an else expression:

const openMenu = () => {
  if (show === false) {
    clickref.current.style.display = "block";
    setshow(true);
  } else {
    clickref.current.style.display = "none";
    setshow(false);
  }
};

// same logic
const openMenu = () => {
  clickref.current.style.display = show ? "block" : "none";
  setshow((prev) => !prev);
}
发布评论

评论列表(0)

  1. 暂无评论