Как заполнить значение из API в checkbox.Group с помощью antd

У меня есть меню массива для отображения всех флажков и объекта данных, полученного из API.

В настоящее время я хочу, когда возвращаемые данные верны, они будут проверены

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

Я знаю, что Checkbox.Group имеет 1 значение атрибута для заполнения данных, но я не знаю, как с этим справиться, пожалуйста, помогите мне.

  const menu = [
    {
      label: "System",
      level: 1,
      view: true,
      add: true,
      edit: true,
      del: true,
      key: "agmdb"
    },
    {
      label: "Agent",
      level: 1,
      view: true,
      add: true,
      edit: true,
      del: true,
      key: "agent"
    },
    {
      label: "User",
      level: 2,
      view: true,
      add: true,
      edit: true,
      del: true,
      key: "users"
    }
  ];

Объект данных, полученный из API:

  let userPermission = {
    agent: { view: true, edit: true, del: false, add: false },
    agmdb: { view: true, edit: false, del: true, add: false },
    users: { view: true, edit: false, del: false, add: true }
  };

Меню визуализации:

 const onChangeCheckbox = (arr, key) => {
    console.info(arr);
  };

<div className = "App">
      {menu.map((item) => {
         let arrKey = [
           userPermission[item.key]?.view ? `view` : "",
           userPermission[item.key]?.add ? `add` : "",
           userPermission[item.key]?.del ? `del` : "",
           userPermission[item.key]?.edit ? `edit` : ""
         ];
        return (
          <Form>
            <Form.Item
              style = {{ margin: "10px 0" }}
              key = {item.label}
              labelCol = {{
                span: 6
              }}
              wrapperCol = {{
                span: 12
              }}
              label = {item.label}
            >
              <Checkbox.Group
                onChange = {(e) => {
                  onChangeCheckbox(e, item.key);
                }}
                value = {arrKey}
              >
                <Checkbox value = "view">
                  View
                </Checkbox>
                <Checkbox value = "add">
                  Add
                </Checkbox>
                <Checkbox value = "del">
                  Delete
                </Checkbox>
                <Checkbox value = "edit">
                  Edit
                </Checkbox>
              </Checkbox.Group>
            </Form.Item>
          </Form>
        );
      })}
  </div>

пример кода: https://codesandbox.io/s/busy-pine-n0iku4?file=/src/App.jsx

* ОБНОВЛЕНИЕ: я добавил значение в checkbox.Group, и он заполнил данные при проверке условия, есть новая проблема, которая не может установить другой флажок, вы можете увидеть это в codesanbox

Вы хотите использовать form или состояние для заполнения значений флажка? При каком условии каждый флажок будет помечен как отключенный?

Muhammad Nouman Rafique 06.02.2023 07:29

Я хочу использовать состояние для заполнения значений флажка, а отключенная функция - это еще одна функция, она не связана с вопросом. Я уберу это из кода

phu.duongquoc 06.02.2023 07:41

Если у вас есть идея получше или сделать ее проще с помощью form, я готов ее изменить.

phu.duongquoc 06.02.2023 07:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
3
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

использовать имя вместо значения в компоненте флажка.

<Checkbox name = "view">

и используйте крючок формы ...

const [form] = Form.useForm();
<Form form = {form}>

и вы должны использовать

form.setFieldsValue()

для заполнения входных данных

Можете ли вы сделать пример на основе моих данных и вопроса? Это очень поможет

phu.duongquoc 06.02.2023 08:15
Ответ принят как подходящий

Чтобы заставить его работать с помощью Form, вам нужно указать name prop для Form.Item. В вашем случае имя будет agmdb, agent, users.

В useEffect получите все userPermissions и при необходимости сохраните их в состоянии. Формат значения группы флажков должен быть массивом строк ['view', 'edit']. Но у userPermission другой формат, где значение представляет собой пару ключ-значение. Поэтому нам нужно отфильтровать те ключи, которые имеют значение true. Затем установите значения в форме. Поскольку у каждого Checkbox.Group есть 4 параметра, я создал массив параметров с меткой и значением. Вы также можете использовать disabled в параметрах, если вам это нужно. При отправке вам может потребоваться исходный формат данных. Я также пишу код, который преобразует значения в исходный формат. Надеюсь, это решит вашу проблему

import { useEffect } from 'react';
import { Button, Checkbox, Form } from 'antd';

const menu = [
    { label: 'System', level: 1, view: true, add: true, edit: true, del: true, key: 'agmdb' },
    { label: 'Agent', level: 1, view: true, add: true, edit: true, del: true, key: 'agent' },
    { label: 'User', level: 2, view: true, add: true, edit: true, del: true, key: 'users' }
];

const userPermission = {
    agent: { view: true, edit: true, del: false, add: false },
    agmdb: { view: true, edit: false, del: true, add: false },
    users: { view: true, edit: false, del: false, add: true }
};

const options = [
    { label: 'View', value: 'view' },
    { label: 'Add', value: 'add' },
    { label: 'Edit', value: 'edit' },
    { label: 'Delete', value: 'del' }
];

const App = () => {
    const [form] = Form.useForm();

    useEffect(() => {
        // Fetch userPermission from API
        // Each Checkbox.Group value is an array of string (true means checked)
        // Example: { agmdb: ['view', 'del'], agent: ['view'], users: ['view', 'add'] }

        const data: Record<string, Array<string>> = {};

        Object.entries(userPermission).forEach(([key, value]) => {
            data[key] = Object.keys(value).filter((key) => value[key as keyof typeof value]);
        });

        form.setFieldsValue(data);
    }, [form]);

    const onFinish = (values: any) => {
        const finalData: Record<string, Record<string, boolean>> = {};

        Object.entries(values).forEach(([key, value]: any) => {
            finalData[key] = value.reduce((acc: any, cur: string) => {
                acc[cur] = true;
                return acc;
            }, {});
        });

        console.info(finalData);
    };

    return (
        <div className='App'>
            <Form form = {form} onFinish = {onFinish}>
                {menu.map((item) => {
                    return (
                        <Form.Item
                            key = {item.key}
                            style = {{ margin: '10px 0' }}
                            labelCol = {{ span: 6 }}
                            wrapperCol = {{ span: 12 }}
                            label = {item.label}
                            name = {item.key}
                        >
                            <Checkbox.Group options = {options} />
                        </Form.Item>
                    );
                })}

                <Button htmlType='submit'>Submit</Button>
            </Form>
        </div>
    );
};

export default App;

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