Задать вопрос
@doppelgangerz
JavaScript

Почему не срабатывает switch case?

Добрый день, не понимаю почему в приведенном коде не срабатывают case, всегда default. Хотя возвращает get Attribute то что нужно.
render() {
        return (
            <div name='list' className="list" onClick={this.handleClick}>
                <div name="checkbox-area" className="checkbox-area">
                    <i name="checkbox" className="fas fa-check checkbox"></i>
                </div>
                <li name="li" onClick={this.handleClick} onMouseOver={this.handleMouse}>{this.props.text}</li>
            </div>
        )
    }

handleClick = (e) => {
        let target = e.target;
        // console.log(target)
        console.log(target.getAttribute('name'))      
        switch (target.getAttribute('name')) {
            case 'checkbox':
                let rout_checkbox = target.style.display;
                rout_checkbox === 'none' ? rout_checkbox = 'block' : rout_checkbox = 'none';
                break;
            case 'checkbox-area':
                let rout_checkbox_area = target.firstChild.style.display;
                rout_checkbox_area === 'none'? rout_checkbox_area = 'block' : rout_checkbox_area = 'none';
                break;
            case 'list':
                let rout_list = target.childNodes[0].firstChild.style.display;
                rout_list === 'none' ? rout_list = 'block' : rout_list = 'none';
            case 'li':
                let rout_li = target.parentNode.childNodes[0].firstChild.style.display;
                rout_li === 'none' ? rout_li = 'block' : rout_li = 'none'; 
            default:
                console.log('error');
                break;
        }
    }


5ce94fcaa62f0265199563.png
  • Вопрос задан
  • 301 просмотр
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 2
rockon404
@rockon404 Куратор тега React
Frontend Developer
Не надо такой код писать. Работайте с состоянием компонента. Пример:
class ListItem extends React.Component {
  state = { isActive: false };

  toggleClick = {
    this.setState(state => ({ isActive: !state.isActive }));
  };

  render () { /* ... */ }
}
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега React
не срабатывают case, всегда default

Всё-таки срабатывают.

Почему default случается когда вроде бы не должен - потому что у двух последних case'ов отсутствует break, соответственно, при их выполнении выполняется и default, идущий в самом конце.

Почему вы не видите эффекта от выполнения кода внутри case'ов - да потому что нечего видеть. Вы скопировали значение свойства display в переменную, и эта копия уже никакого отношения к оригиналу не имеет, что бы вы с ней не делали, это никак не отразится на элементе. Чтобы элемент изменился, надо новые значения назначать его свойствам. Но, конечно, не напрямую, а так, как это принято в react'е - заводите в компоненте стейт, на основе значений из стейта в методе render устанавливаете свойства элементам, когда хотите их изменить, обновляете стетйт.

Ещё пара моментов, которые стоит упомянуть:

Почему у вас li вложен в div? Разберитесь, какие элементы куда можно вкладывать, а куда нельзя.

Зачем два одинаковых обработчика клика? Второй, который у li, он не нужен - делает ровно то же, что и первый. Потому что... Почитайте, что такое всплытие событий.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽