Тернар для боковой панели в реакции

У меня есть компонент боковой панели с реквизитом sidebarOpen, то есть: <SidebarWrapper sidebarOpen = {this.props.sidebarOpen}>

У меня также есть кнопка, где onClick переключает sidebarOpen на истину и ложь.

У меня также есть прослушиватель событий, в котором на мобильном устройстве установите для sideBarOpen значение false. Это функция:

setSidebar = () => {
 const isMobile = (typeof window !== 'undefined') && (window.innerWidth < 500)

 if (isMobile) {
   this.props.openSidebar(false)
 } else {
   this.props.openSidebar(true)
 }
}

Что я пытаюсь сделать, так это то, что если вы нажмете кнопку на мобильном устройстве и измените размер экрана, боковая панель должна оставаться открытой без мерцания.

Видео здесь

Вот полный компонент:

import React from 'react'

import { bindActionCreators } from 'redux'
import { toggleDarkTheme, openSidebar } from '../../actions/layout'
import { connect } from 'react-redux'
import {SidebarWrapper} from './styles'


const mapDispatchToProps = dispatch => {
  return {
    toggleDarkTheme: bindActionCreators(toggleDarkTheme, dispatch),
    openSidebar: bindActionCreators(openSidebar, dispatch)
  }
}

const mapStateToProps = state => ({ sidebarOpen: state.layout.sidebarOpen });

export default connect(mapStateToProps, mapDispatchToProps)(class Sidebar extends React.Component {

  setSidebar = () => {
    const isMobile = (typeof window !== 'undefined') && (window.innerWidth < 500)

    if (isMobile) {
      this.props.openSidebar(false)
    } else {
      this.props.openSidebar(true)
    }
  }

  componentDidMount() {
    window.addEventListener("resize", this.setSidebar);
  }

  componentWillUnmount() {
    window.removeEventListener("resize", this.setSidebar);
  }

  render() {
    return (
      <SidebarWrapper sidebarOpen = {this.props.sidebarOpen}>
          <button onClick = {this.props.toggleDarkTheme}>Darkness</button>
      </SidebarWrapper>
    )
  }
})

и стили:

import styled from 'styled-components'
import breakpoint from 'styled-components-breakpoint'

export const SidebarWrapper = styled.div`
  display: ${props => props.sidebarOpen ? 'flex' : 'none'};
  flex-direction: column;

`

Здесь вы должны использовать состояние, которое будет иметь состояние opened, и если нет необходимости его менять (если все еще мобильный и боковая панель уже открыта) - ничего не делать (это не вызовет повторную визуализацию). Тогда мерцания не будет.

extempl 13.03.2019 20:52

@extempl Я тоже так думал, но не решил проблему. Это как-то связано с моим оператором if

Dileet 13.03.2019 21:34

Не могли бы вы уточнить, чего вы пытаетесь достичь здесь? из описания похоже, что вы хотите, чтобы боковая панель открывалась при изменении размера, но зачем вам тогда isMobile? Итак, если мы вообще удалим обработчик onResize - он будет открываться до закрытия вручную. Если это не то, что вы хотите - добавьте больше деталей, т.е. каков ожидаемый результат, когда вы открываете боковую панель не на мобильном устройстве и изменяете размер - что тогда? Что, если вы измените размер с 1000 пикселей на 300 - как это должно себя вести?

extempl 14.03.2019 06:29
Поведение ключевого слова "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) для оценки ваших знаний,...
0
3
56
0

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