#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 /…