Несколько вариантов флажков в ReactJS

Я новичок в реагировании, и у меня были проблемы с созданием флажков для моего приложения. Мне удалось настроить что-то, что работает только для одного флажка, однако проблема, с которой я столкнулся сейчас, связана с несколькими вариантами флажка.

Всякий раз, когда я нажимаю на один флажок, он автоматически устанавливает все остальные флажки.

Вот код, над которым я сейчас работаю.

import React, { Component, } from 'react';

export default class Checkbox extends Component {
    constructor(props) {
        super();

        let initialState = {
            options: [{ id: 1, answer: 'Apple' }, { id: 2, answer: 'Bananas' }, { id: 3, answer: 'Oranges' }],
            isChecked: false,
        };
        this.state = initialState;
    }

    handleCheckbox() {
        this.setState({
            isChecked: !this.state.isChecked
        })
    }

    render() {
        return (
            <div>
                {
                    [...this.state.options].map((e, i) => {
                        return (
                            <label key = {e.id}>
                                <input type = "checkbox"

                                    disabled = {this.props.disabled}

                                    onChange = {() => this.handleCheckbox()}

                                    checked = {this.state.isChecked}

                                    key = {e.id} 
                                />

                                {e.answer} &nbsp;
                          </label>
                        )
                    })
                }
            </div>
        )

    }

}

Да, потому что вы задекларировали только один isCheck, поэтому он будет проверять все

iamrajshah 28.05.2019 11:21

проверьте этот ответ, это подробный ответ, и он содержит все, что вам нужно stackoverflow.com/questions/31073281/…

A.Samad Salaat 28.05.2019 11:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
116
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны изменить свой код, как показано ниже:

import React, { Component, } from 'react';

export default class Checkbox extends Component {
    constructor(props) {
        super();

        let initialState = {
            options: [{ id: 1, answer: 'Apple', isChecked: false }, { id: 2, answer: 'Bananas', isChecked: false }, { id: 3, answer: 'Oranges', isChecked: false }],
       };
        this.state = initialState;
    }

    handleCheckbox(id) {
       const modifiedOptions = [...this.state.options];
       modifiedOptions[id].isChecked = !modifiedOptions[id].isChecked;

    this.setState({
        options: modifiedOptions
    })
    }

    render() {
        return (
            <div>
                {
                    [...this.state.options].map((e, i) => {
                        return (
                            <label key = {e.id}>
                                <input type = "checkbox"

                                    disabled = {this.props.disabled}

                                    onChange = {() => this.handleCheckbox(e.id)}

                                    checked = {e.isChecked}

                                    key = {e.id} 
                                />

                                {e.answer} &nbsp;
                          </label>
                        )
                    })
                }
            </div>
        )

    }

}

Идентификатор handleCheckbox(id) будет undefined

Vadim Hulevich 28.05.2019 11:27
id не всегда равно, как индекс
Vadim Hulevich 28.05.2019 11:30

В этом случае он будет равен, так как мы создаем объект с разными идентификаторами.

iamrajshah 28.05.2019 11:32

То же решение, что и у Вадима. Спасибо!

G Josh 28.05.2019 11:43

Я добавил этот первый @GJosh... В любом случае, ваша проблема решена, это важно...

iamrajshah 28.05.2019 11:54
Ответ принят как подходящий

Вам нужно переместить isChecked внутри вариантов:

import React, { Component, } from 'react';

export default class Checkbox extends Component {
    constructor(props) {
        super();

        let initialState = {
            options: [{ id: 1, answer: 'Apple', isChecked:false }, { id: 2, answer: 'Bananas', isChecked:false }, { id: 3, answer: 'Oranges', isChecked:false }],
        };
        this.state = initialState;
    }

    handleCheckbox(ind) {
        const newOptions = [...this.state.options];

        newOptions[ind].isChecked = !newOptions[ind].isChecked;

        this.setState({
            options: newOptions
        })
    }

    render() {
        return (
            <div>
                {
                    [...this.state.options].map((e, i) => {
                        return (
                            <label key = {e.id}>
                                <input type = "checkbox"

                                    disabled = {this.props.disabled}

                                    onChange = {() => this.handleCheckbox(i)}

                                    checked = {e.isChecked}

                                    key = {e.id} 
                                />

                                {e.answer} &nbsp;
                          </label>
                        )
                    })
                }
            </div>
        )

    }

}


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