Я не на 100% понимаю вопрос, но если вы хотите создать такой раздел, как
[x] cats
[x] dogs
[ ] rabbits // dont show rabbits
, тогда вы можете сохранить выделение и часть результата в одном элементе реакции, если вы не понимаете 'поднятие состояния 'секция
состояние должно содержать массив объектов, подобных этому:
[{
allow: true,
title: 'cat'
},
{allow: false, title: 'rabbit'}]
Для обновления списка используйте что-то вроде этого:
this.state.map(({title, allow}) => (
<div>
<TickBox onClick={() => this.toggleAnimal(title)} value={allow}/>
<p>{animalName}</p>
</div>
)
toggleAnimalФункция должна найти животное, используя заголовок, и обновить состояние
Затем вы можете отфильтровать всех недопустимых животных
this.state
.filter(animal => animal.allowed)
.map(a => <p>{a.title}</p>)
поднимая состояние вверх
На данный момент у вас есть 1 компонент, и функция рендеринга выглядит следующим образом:
<h1>Please select the animals</h1>
{
animals.map(_ => <div><tickbox onClick={() => this.handleToggle(title)} /><title></div>)
}
<h1>Here are the filtered animals</h1>
{
animals.filter(a => a.allow).map(animal => animal.title).map(/* to JSX */)
}
Было бы красивее и отзывчивее, если бы корневой компонент выглядел так:
render () {
<SelectAnimals toggle={handleToggle} animals={this.state} />
<ShowFilteredAnimals animals={this.state} />
}
handleToggle (title) {
this.setState(...)
}
Как можно видеть, SelectAnimals получает функцию в качестве аргумента, она может связываться со своим родителем, вызывая props.toggle (с заголовком в качестве аргумента)
Так что SelectAnimals будет выглядеть так:
props.animals.map(animal => (
<div>
<TickBox onClick=(() => {props.toggle(animal.title)}) /> // HERE
<p>{animal.title}</p>
</div>
))
Таким образом, когда флажок запускает событие щелчка, он вызывает функцию стрелки.который вызывает функцию props.toggle с заголовком. В родительском элементе SelectAnimals родительский элемент привязывает функцию-обработчик к SelectAnimals.toggle следующим образом:
handleToggle (title) { // the child element called this function, it just got copied
}
PS: я сделал несколько переименований в своем коде функцией handleToggleможет быть таким же, как toggleAnimals