Добавление данных в определенное свойство объекта

#javascript #reactjs

#javascript #reactjs

Вопрос:

У меня есть это приложение: https://codesandbox.io/s/misty-smoke-n5f1e?file=/Person.js:123-1128
Идея приложения заключается в следующем:

  1. Рядом с каждым пользователем находится тег select с их жанром.
  2. Каждый пользователь должен иметь возможность самостоятельно назначить их конкретному toy , выбрав опцию. пример: Карл может назначить себя только toyType: "M" , выбрав M из select, и после выбора я должен получить следующие данные:
     0: Object
    color: "red"
    toyType: "M"
    persons: Array[1]
              0: Object
              name: "Carl"
              a&e: 17
    1: Object
    color: "white"
    toyType: "F"
  
  1. Если другой пользователь нажимает на M , его имя и возраст также должны быть добавлены в persons массив сверху.
  2. Отключены опции, которые не соответствуют type свойству person; НАПРИМЕР: Лиза M отключила bic, потому что ее тип не M но F ;
  3. Каждый пользователь может добавить их самостоятельно в определенную игрушку только один раз, а не дважды.
     const Person = ({ person, k }) =&&t; {
      // console.lo&(person)
      const thisPerson = { name: person.name, a&e: person.a&e };
      function handleChan&e(value) {
        console.lo&(`selected ${value}`);
        const result = toys.map((i) =&&t; {
          if (value === i.toyType) {
            return {
              ...i,
              persons: toys.persons ? [...i.persons, thisPerson] : [thisPerson]
            };
          } else {
            return { ...i };
          }
        });
        console.lo&("result", result);
        return resu<
      }
      return (
        <div&&t;
          <Select
            placeholder="select"
            style={{ width: 120 }}
            onChan&e={handleChan&e}
          &&t;
            {toys.map((i, k) =&&t; (
              <Option
                disabled={
                  i.toyType.toLocaleLowerCase() !== person.type.toLocaleLowerCase()
                }
                key={k}
                value={i.toyType}
              &&t;
                {i.toyType}
              </Option&&t;
            ))}
          </Select&&t;
          <span&&t;{person.name}</span&&t;
        </div&&t;
      );
    };
    export default Person;

  

Здесь,

 
    if (value === i.toyType) {
            return {
              ...i,
              persons: toys.persons ? [...i.persons, thisPerson] : [thisPerson]
            };
          } else {
            return { ...i };
          }

  

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

Также я не могу понять, как запретить пользователям дважды подписывать себя на одну и ту же игрушку.
Вопрос: Кто знает, как решить проблемы? Спасибо

Комментарии:

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

2. @David, идея приложения такова: каждый пользователь может быть назначен одной игрушке, у которой есть свойство toyType , если person type === toyType , то paerson может назначить себя игрушке. Теперь эта функциональность существует. Но также каждая игрушка после назначения persons может создавать дополнительные свойства, такие как: persons , которые представляют собой массив, в котором могут храниться persons. Теперь я могу добавить одного человека, но если я добавлю второго, это переопределит предыдущего из массива, также я хочу запретить двойное назначение одного и того же человека.

3. @Дэвид, скажи мне, пожалуйста, если понятно. Спасибо

4. @David, в console.lo&("result", result); я должен получить результат. Не могли бы вы помочь?

5. Вы спрашиваете, как поддерживать состояние в React? В настоящее время вы нигде не сохраняете этот результат, вот почему это новый результат после каждой операции. В вашем приложении нет управления состоянием. Похоже, вам больше всего пригодились бы некоторые руководства по React и по управлению данными в состоянии компонента (в данном случае, вероятно, с использованием useState хука в React).