Управление состоянием чекбоксов

Ошибка: TypeError: undefined is not an object (evaluating 'checkbox.checkboxes.map')

Делаю форму , которая выводится после нажатия на чекбокс, если "Да" - выводим, если "Нет" - скрываем. Формы разные, относятся к своим категориям Так вот, как управлять этим состоянием чекбоксов?

Пробовал разные варианты, но нужного результата не могу добиться.

Может кто-нибудь подсказать, где проблемка или же подсказать более лучшую реализацию? Хотел добиться того, что если будет добавляться новый объект с формой, то просто добавить его в массив checkboxes

Ниже тестовый компонент:

export const Checkbox = () => {

    const checkboxes = [
          {
            id: 1,
            title: "Тест1",
            checkboxes: [{id: 'yes', label: 'Да', checked: false}, {id: 'no', label: 'Нет', checked: false}],
        },
{
            id: 2,
            title: "Тест2",
            checkboxes: [{id: 'yes', label: 'Да', checked: false}, {id: 'no', label: 'Нет', checked: false}],
        },
      ]

      const reducer = (checkboxes, action) => {
        if(action.type == 1) {
          return checkboxes[0].checkboxes.map(checkboxes => {
            if(checkboxes.id == action.payload) {
                checkboxes.checked == true ? checkboxes.checked = false : checkboxes.checked = true
            }else {
                checkboxes.checked = false
            }            
            return checkboxes;
          })
        }
        
      }

      const [state, dispatch] = useReducer(reducer, checkboxes);

      function checked(itemId, checkboxId) {
        // console.log(itemId, checkboxId)
        dispatch({ type: itemId, payload: checkboxId });
      }
      
      
    return (
       <View style={{padding: 20}}>
            {state.map((checkbox, idx) => (
            <View key={idx} style={{ display: 'flex', width: '50%', justifyContent: 'space-around' }}>
                <Text>{checkbox.title}</Text>
                {checkbox.checkboxes.map(check=> (
                  <View>
                    <Text>{check.label}</Text>
                     <TouchableOpacity 
                      onPress={()=> {checked(checkbox.id, check.id)}}
                      style={checkbox.checked === false ? styles.block : styles.block1}
                      /> 
                  </View>
                  
                ))}
              
            </View>
            ))}
        </View>
    )
}

const styles = StyleSheet.create({
    block: {
        width: 30,
        height: 30,
        backgroundColor: '#FFFFFF',
        borderColor: "#000",
        borderWidth: 2
    },
    block1: {
        width: 30,
        height: 30,
        backgroundColor: '#000',
        borderColor: "#000",
        borderWidth: 2
    },
})

Ответы (1 шт):

Автор решения: Zhandos_

Реализовал таким образом. Может кому поможет данный алгоритм

  1. Создаем два состояния для чекбокса и формы (useReducer, useState)
  2. Создаем чекбокс массив из 2 объектов с состояниями, id-шниками
  3. Подключаем чекбокс где нам нужно, прокидываем пропсы, если у вас их будет несколько
  4. Рендерим объект чекбоксов использую мапинг
  5. При нажатии на чекбокс передаем в id в фунцию handleCheck, вызываем диспатч, передаем {тип, id}
  6. В редюсере мапим чекбокс, проверяем на payload.id и чекбокс.id, если есть меняем на состояние для отметки (выбрано) и state true для состояния формы, если нет, то возвращаем false, чтобы нельзя было снять отметку для выбранного чекбокса и state false для формы, чтобы скрыть
→ Ссылка