Получить значение из одной функции и передать его другой

#reactjs

#reactjs

Вопрос:

У меня есть функция, вызываемая в onDatabaseSelect, которая извлекает значения базы данных, как показано здесь, в консоли, с заданным именем ключевого свойства и значением Object_name: «».

введите описание изображения здесь

   const onDatabaseSelect = (e, value) => setDatabase(value)

  useEffect(() => {
    console.log("set database", database)
  }, [database])
  

он вызывается здесь:

    <div style={{marginRight: '210px', width: '100%'}}>
              <AutoCompleteSingle
                name='Database'
                label='Database'
                options={autoComplete.databasesAutoComplete}
                onChange={autoComplete.onDatabaseAutoCompleteFieldUpdate}
                onSelect={onDatabaseSelect}
                uniqueIdentifier={1}
              />
            </div>
  

Мне нужно преобразовать значение object_name в возвращаемое значение new state

   const [productionDatabaseData, setProductionDatabaseData] = useState([])

const addToProduction = ({ target }, { id, databases }) => {

    setProductionDatabaseData((previousState) => {

      let newState = [...previousState]
      if (target.checked) {
        newState = [
          ...newState,
         {  unit_test_id: id, databases }
        ]
      } else {
        const i = newState.findIndex(({ unit_test_id }) => unit_test_id === id)
        if (i !== -1) newState.splice(i, 1)
      }
      return newState
    })
  }
  

Ожидаемый результат:

введите описание изображения здесь

Таким образом, имя_объекта должно быть помещено в массив databases, если установлен флажок, и если флажок снят, его следует удалить.

итак, если бы я должен был проверить значение onDatabaseSelect, которое было бы «stg_successfactors»

новое значение должно выглядеть следующим образом:

 databaseArr = {
unit_test_id: 166.
databases["iagdcanonprod.auiag.corp/project_entrust_australia_dev", stg_successfactors.ext_gpload_reusable_e24181c8_f3ed_11ea_836b_fa163e5628e8", "]
}
  

Ошибка обновления:
введите описание изображения здесь

Состояние баз данных находится в другом компоненте…Мне было интересно, правильно ли я передал реквизиты?

   const addToProduction = ({ target }, { id, databases: mappedDatabases }) => {
    setProductionDatabaseData((previousState) => {
      let newState = [...previousState];
      if (target.checked) {
        newState = [
          ...newState,
          {
            unit_test_id: id,
            databases: [
              ...mappedDatabases,
              ...props.databases.map(({ object_name }) => object_name)
            ]
          }
        ];
      } else {
        const i = newState.findIndex(({ unit_test_id }) => unit_test_id === id);
        if (i !== -1) newState.splice(i, 1);
      }
      return newState;
    });
  };
  

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

1. Еще раз здравствуйте. Какова связь между onDatabaseSelect вызовом обратного вызова, database обновлением состояния и addToProduction ? Вы просто хотите добавить database состояние в productionDatabaseData состояние, когда оно [база данных] обновляется, как в другом эффекте?

2. Привет, Дрю, еще раз спасибо за ответ! Да, я просто хочу добавить состояние базы данных в productionDatabaseData. В частности, имя_объекта. onDatabaseSelect содержит значения базы данных, которые я хочу передать и добавить в состояние productionDatabaseData, как вы сказали :). Спасибо за помощь своим коллегам-юниорам! ха-ха.

3. Итак, если у вас есть объект ответа, массив объектов базы данных, вы хотите добавить object_name значения каждого свойства к существующему productionDatabaseData массиву? Можете ли вы привести пример ожидаемого результата из некоторых данных образца ответа?

4. Да, это правильно, это было обновлено для вас @DrewReese

5. О, подождите, так database состояние — это просто массив «выбранных» баз данных из AutoCompleteSingle ? И вы хотите addToProduction при вызове добавлять или удалять имена баз данных из productionDatabaseData.databases зависимости от проверяемого значения объекта события? addToProduction Даже актуально, я думал, что это обработчик где-то в другом месте? Сохраняется ли значение флажка в любом состоянии?

Ответ №1:

Вы можете сопоставить databases массив состояний с массивом object_name значений

 databases.map(({ object_name }) => object_name)
  

И перенесите как databases массив из отображенного пользовательского интерфейса, так и массив имен объектов в новый массив. Вам придется переименовать параметр деструктурированной databases функции, чтобы избежать столкновения имени с состоянием компонента.

 const addToProduction = ({ target }, { id, databases: mappedDatabases }) => {
  setProductionDatabaseData((previousState) => {
    let newState = [...previousState];
    if (target.checked) {
      newState = [
        ...newState,
        {
          unit_test_id: id,
          databases: [
            ...mappedDatabases,
            ...databases.map(({ object_name }) => object_name)
          ]
        }
      ];
    } else {
      const i = newState.findIndex(({ unit_test_id }) => unit_test_id === id);
      if (i !== -1) newState.splice(i, 1);
    }
    return newState;
  });
};
  

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

1. Вы, сэр, ангел, посланный с небес. Спасибо!

2. как бы я мог переименовать параметр функции деструктурированных баз данных?

3. @bloombloom Вы имеете в виду это: { databases: mappedDatabases } ?

4. @bloombloom Хорошо, то, что я сделал в своем решении, было переименованием деструктурированного свойства. В { id, databases: mappedDatabases } я разрушил оба id и databases , но переименовал databases в mappedDatabases . developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…