Установите / снимите флажок «Все» в reactJs

Я пытаюсь реализовать выбор/отмену выбора всех функций в reactJs, но не смог этого сделать.

Я сделал флажок выбора/отмены выбора всех основных заголовков функциональным, и отдельные элементы также могут быть выбраны или отменены.

Моя рабочая ссылка:Установите / снимите флажок «Все» в reactJs

import React, { Component } from 'react'
import ReactDOM from 'react-dom'

class Box extends Component{
    constructor(props){
        super(props);
        this.state = {
            allChecked: false,
            list: [
                {id:1, name: "item1", isChecked: false},
                {id:2, name: "item2", isChecked: false},
                {id:3, name: "item3", isChecked: false},
            ],
        };
    }

handleChangeEvent = (e) => {
    let list =  this.state.list;
    let allChecked = this.state.allChecked;
    if (e.target.value === "checkAll"){
        list.forEach(item => {
            item.isChecked = e.target.checked;
            allChecked = e.target.checked;
        });
    }
    else{
        list.find( item => item.name === e.target.name).isChecked = e.target.checked;
    }
    this.setState({list:list, allChecked: allChecked});
}

renderList = () => {
    return this.state.list.map(item =>
        <div>
            <input key = {item.id} type = "checkbox" name = {item.name} value = {item.name} checked = {item.isChecked} onChange = {this.handleChangeEvent} />
            <label>{item.name}</label>
        </div>
    )
}
render(){
    return(
        <div>
            <input type = "checkbox" 
            value = "checkAll" 
            checked = {this.state.allChecked} 
            onChange = {this.handleChangeEvent} />Check all
            <br/>
            {this.renderList()}
        </div>
    );
  }
}

ReactDOM.render(<Box/>, document.getElementById('root'));

Чтобы быть прямолинейным, я хочу, чтобы этот тип функциональности (https://jsfiddle.net/52uny55w/) использовал простой Javascript, но не с jquery по некоторым причинам.

Пробую ваш код, все работает. Где проблемы?

Wicak 06.02.2019 04:48

@Wicak Я хочу, чтобы этот флажок Отметить все также был отмечен, когда я проверяю все эти элементы, и хочу, чтобы этот флажок Отметить все также не устанавливался, когда я снимаю флажок, если я снимаю один из элементов.

Tasty 06.02.2019 04:54

Этот код отсутствовал в Codesandbox, я просто воссоздал его для справки. codeandbox.io/s/frosty-curie-75u6d?file=/src/App.js:395-833

sajin tm 17.08.2020 17:12

у кого-нибудь есть рабочий пример с кнопками?

jonnie 31.05.2021 09:57
Поведение ключевого слова "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
4
16 743
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я решил проблему на https://codesandbox.io/s/vvxpny4xq3

  handleChangeEvent = e => {
    let itemName = e.target.name;
    let checked = e.target.checked;
    this.setState(prevState => {
      let { list, allChecked } = prevState;
      if (itemName === "checkAll") {
        allChecked = checked;
        list = list.map(item => ({ ...item, isChecked: checked }));
      } else {
        list = list.map(item =>
          item.name === itemName ? { ...item, isChecked: checked } : item
        );
        allChecked = list.every(item => item.isChecked);
      }
      return { list, allChecked };
    });
  };

Несколько замечаний.

1) Я обновил кнопку checkAll, чтобы иметь свойство name для обеспечения согласованности

2) При изменении существующего состояния используйте новый функциональный синтаксис

3) Разрушайте объекты и не мутируйте их на месте, если это возможно. Вы можете использовать map вместо forEach и использовать оператор распространения для изменения объекта без мутации.

Здравствуйте, большое спасибо за ваш вклад. И спасибо за рекомендацию функция setState() и рекомендацию метода .карта(). Я принимаю ваш ответ. Еще раз спасибо.

Tasty 06.02.2019 05:47

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