Расширение и свертывание навигации при входе/выходе мыши, REACT

У меня есть панель навигации сбоку моей страницы. Я получил его через веб-сайт начальной загрузки, поэтому имена классов и т. д. Предварительно загружены. Вместо того, чтобы переключать логотип гамбургера, чтобы развернуть/свернуть навигацию, я хочу сделать это при входе/выходе мыши. Ниже приведена моя попытка: я сделал 2 обработчика как для входа, так и для выхода из мыши, и я использовал элемент проверки, поэтому перечислите имена классов для навигации, когда она развернута и свернута.

Затем я попытался дать навигации эти имена классов в зависимости от того, находится ли мышь в навигации или вне ее, но это не работает: (помогите, пожалуйста

class App extends Component {
  render() {

    let sideNav;

    const mouseEnter = e => {
      sideNav = "sideNav sidenav---sidenav---_2tBP sidenav---expanded---1KdUL";
      console.info("Mouse entered");
      return sideNav;
    }    

    const mouseLeave = e => {
      sideNav = "sidenav---sidenav---_2tBP sidenav---collapsed---LQDEv";
      console.info("mouse left");
      return sideNav;
    }

    return (
      <div className = "App container">
        <div>
          <SideNav 
            onMouseEnter = {mouseEnter} 
            onMouseLeave = {mouseLeave}
            className = {this.sideNav}
            onSelect = {(selected) => {
                // Add your code here
            }}
          >
            <SideNav.Toggle  />
            <SideNav.Nav  defaultSelected = "home">
                <NavItem eventKey = "home">
                    <NavIcon>
                        <Link to = "/"><img src = {Dash}/></Link>
                    </NavIcon>
                    <NavText>
                        <Link to = "/">Dashboard</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey = "sites">
                    <NavIcon>
                      <Link to = "/sites"><img src = {Site} /></Link>
                    </NavIcon>
                    <NavText>
                        <Link to = "/sites">Sites</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey = "tours">
                  <NavIcon>
                    <Link to = "/tours"><img src = {Tour}/></Link>
                  </NavIcon>
                  <NavText>
                      <Link to = "/tours">Tours</Link>
                  </NavText>
                </NavItem>
                <NavItem eventKey = "media">
                    <NavIcon>
                      <Link to = "/media"><img src = {Media}/> </Link>
                    </NavIcon>
                    <NavText>
                        <Link to = "/media">Media</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey = "newSite">
                    <NavIcon>
                        <Link to = "/newSite/details"><img src = {NewSite} /></Link>
                    </NavIcon>
                    <NavText>
                        <Link to = "/newSite/details">Add new Site</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey = "profile">
                    <NavIcon>
                        <Link to = "/profile"><img src = {Profile} /></Link>
                    </NavIcon>
                    <NavText>
                        <Link to = "/profile">Profile</Link>
                    </NavText>
                </NavItem>

            </SideNav.Nav>
          </SideNav>
        </div>
        <Routes />
      </div>
    );
  }
}

export default App;

Я думаю, вы почти закончили. Я думаю, вы должны установить класс в состоянии и использовать состояние для обновления класса в SideNav или там, где вам нужно его использовать.

luissmg 25.02.2019 12:36

Вы создаете свои функции внутри функции рендеринга. Это означает, что они будут переопределяться при каждом рендеринге.

Jonas Praem 25.02.2019 12:39

@luissmg Я не уверен, как бы я это сделал, извините

TiernO 25.02.2019 12:41

Где вы хотите переключить класс (точный элемент) и какую библиотеку вы используете для SideNav

luissmg 25.02.2019 12:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
4
472
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы должны использовать sideNav в состоянии вашего компонента, так как это способ реагирования на повторную визуализацию элемента. Каждый раз, когда вы используете setSate, реагируйте на изменения в коде, чтобы показать, что вы хотите. Когда вы просто обновляете свою переменную, реакция этого не знает. Таким образом, ваш код, вероятно, будет работать, если вы сделаете это:

class App extends Component {
  constructor(){
      super();
      this.state = {
        sideNav: ''
      }
  }
    const mouseEnter = e => {
      this.setState({sideNav: "sideNav sidenav---sidenav---_2tBP sidenav---expanded---1KdUL"});
      console.info("Mouse entered");
    }    

    const mouseLeave = e => {
      this.setState({sideNav: "sidenav---sidenav---_2tBP sidenav---collapsed---LQDEv"});
      console.info("mouse left");
    }
  render() {

    return (
      <div className = "App container">
        <div>
          <SideNav 
            onMouseEnter = {mouseEnter} 
            onMouseLeave = {mouseLeave}
            className = {this.state.sideNav}
            onSelect = {(selected) => {
                // Add your code here
            }}
          >
            <SideNav.Toggle  />
            <SideNav.Nav  defaultSelected = "home">
                <NavItem eventKey = "home">
                    <NavIcon>
                        <Link to = "/"><img src = {Dash}/></Link>
                    </NavIcon>
                    <NavText>
                        <Link to = "/">Dashboard</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey = "sites">
                    <NavIcon>
                      <Link to = "/sites"><img src = {Site} /></Link>
                    </NavIcon>
                    <NavText>
                        <Link to = "/sites">Sites</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey = "tours">
                  <NavIcon>
                    <Link to = "/tours"><img src = {Tour}/></Link>
                  </NavIcon>
                  <NavText>
                      <Link to = "/tours">Tours</Link>
                  </NavText>
                </NavItem>
                <NavItem eventKey = "media">
                    <NavIcon>
                      <Link to = "/media"><img src = {Media}/> </Link>
                    </NavIcon>
                    <NavText>
                        <Link to = "/media">Media</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey = "newSite">
                    <NavIcon>
                        <Link to = "/newSite/details"><img src = {NewSite} /></Link>
                    </NavIcon>
                    <NavText>
                        <Link to = "/newSite/details">Add new Site</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey = "profile">
                    <NavIcon>
                        <Link to = "/profile"><img src = {Profile} /></Link>
                    </NavIcon>
                    <NavText>
                        <Link to = "/profile">Profile</Link>
                    </NavText>
                </NavItem>

            </SideNav.Nav>
          </SideNav>
        </div>
        <Routes />
      </div>
    );
  }
}

export default App;

Кроме того, вы можете увидеть здесь, как это работает https://reactjs.org/docs/state-and-lifecycle.html

Именно это я и написал в комментариях :)

luissmg 25.02.2019 12:47

@luissmg Ты должен был ответить! :)

Andy Hoffman 25.02.2019 12:50

Другие вопросы по теме