Я пытаюсь реализовать выбор/отмену выбора всех функций в 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 Я хочу, чтобы этот флажок Отметить все также был отмечен, когда я проверяю все эти элементы, и хочу, чтобы этот флажок Отметить все также не устанавливался, когда я снимаю флажок, если я снимаю один из элементов.
Этот код отсутствовал в Codesandbox, я просто воссоздал его для справки. codeandbox.io/s/frosty-curie-75u6d?file=/src/App.js:395-833
у кого-нибудь есть рабочий пример с кнопками?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я решил проблему на 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() и рекомендацию метода .карта(). Я принимаю ваш ответ. Еще раз спасибо.
Пробую ваш код, все работает. Где проблемы?