мне нужно получить некоторые данные из сложных объектов json (в моем случае это: valor_custo_fornecedor из объекта detalhe, как я могу это сделать?
я уже пробовал с такими аксиомами:
const [valorCusto, setValorCusto] = useState([]);
useEffect(() => {
axios.get('MY API LINK').then((res) => {
let valor = res.detalhe.valor_custo_fornecedor;
setValorCusto(res.valorCusto.valor_custo_fornecedor);
});
});
После настройки ответа в setValorCusto ; вы можете перебрать переменную состояния и получить желаемое значение
Вместо того, чтобы просто дать ответ напрямую, попробуйте написать подробный комментарий, объясняющий решение, если объяснение не слишком длинное.
Как и в других ответах. То, что вы возвращаете из своего API, представляет собой массив объектов. В настоящее время в вашем коде этот массив находится внутри объекта ответа. Итак, в этом фрагменте ниже:
axios.get('MY API LINK').then((res) => {
let valor = res.detalhe.valor_custo_fornecedor;
Вам нужно указать, из какого элемента массива вы хотите получить объект detalhe (например, res[0].detalhe).
Один из способов, который вы могли бы сделать, если хотите использовать все из массива, — это сохранить весь массив в вашем useState. После этого вы можете перебрать массив и что-то сделать с объектами внутри него.
PS. Если вы не совсем уверены, что государство держит. Вы можете войти на страницу, выполнив что-то вроде <div>{JSON.stringify(valorCusto)}</div>
export default function App() {
const [valorCusto, setValorCusto] = useState(null);
useEffect(() => {
const getData = async () => {
const res = await axios.get("API");
const data = await res.data;
setValorCusto(data);
};
getData();
}, []);
return (
<main>
<div>
{valorCusto.map((item) => {
<div>{item.id}</div>;
})}
</div>
</main>
);
}
Вы можете преобразовать json следующим образом:
useEffect(() => {
axios.get('MY API LINK').then((res) => {
let obj = JSON.parse(res.detalhe.valor_custo_fornecedor)
});
});
Трудно сказать, не видя полного json, какие пары ключ/значение существуют в данных, но из того, что я вижу, вы передаете значение, которого, похоже, не существует в данных, в setValorCusto
, а именно: res.valorCusto.valor_custo_fornecedor
Я предполагаю, что вы хотите передать setValorCusto
переменную valor
, которую вы определили выше? Однако res.data.detalhe
, как ответили другие, представляет собой массив, который вам придется либо перебирать, либо указывать для него индекс.
Еще одна деталь, не относящаяся к вопросу сама по себе, заключается в том, что я бы добавил массив зависимостей для эффекта, чтобы этот запрос API не вызывался при каждом повторном рендеринге компонента. Таким образом, конечный результат будет выглядеть примерно так:
const [valorCusto, setValorCusto] = useState([]);
useEffect(() => {
axios.get('MY API LINK').then((res) => {
const valor = res.data.detalhe.map((detalheItem) => {
return detalheItem.valor_custo_fornecedor;
});
setValorCusto(valor);
});
}, []);
Обратите внимание на пустой массив в качестве второго параметра в вызове useEffect
. Это означает, что эффект будет запущен только при первоначальном рендеринге компонента.
Затем вы можете получить доступ к значению, просто используя valorCusto
везде, где вам это нужно в компоненте.
консоль говорит: Uncaught (в обещании) TypeError: невозможно прочитать свойства undefined (чтение «valor_custo_fornecedor»)
Я только что отредактировал, потому что понял, что пропустил, что res.detalhe
— это массив объектов, поэтому вам нужно перебрать этот массив (как в моем отредактированном ответе), чтобы получить все значения, или указать индекс, например res.detalhe[0].valor_custo_fornecedor
. Дай мне знать, если это работает!
Учитывая, что вы установили состояние по умолчанию для valorCusto
как пустой массив, я предположил, что вы хотите получить массив со значениями.
я думаю, вы правы, но я консоль показывает так: Uncaught (в обещании) TypeError: не удается прочитать свойства неопределенного (чтение «карты»)
я думаю, что мы должны закрыть, ха-ха, но теперь ошибка: Uncaught (в обещании) SyntaxError: «[object Object]» недействителен JSON в JSON.parse (<anonymous>)
Ах хорошо! Я понял, что вам также нужно получить доступ к res.data
с помощью axios, чтобы получить фактические данные json, возвращаемые запросом. Я обновил свой ответ этим!
А также то, что вам не нужно его анализировать, потому что я думаю, что Axios делает это по умолчанию.
привет вернуться к ошибке карты
Что вы получите, если зарегистрируете ответ с помощью console.info(res.data)
? Потому что кажется, что не найти detalhe на всех.
я делаю console.info(valorCusto)
О, подожди. Значит, ошибка карты не происходит в запросе axios.get
? Потому что я имел в виду, что кажется, что res.data.detalhe
не определено, и я хотел посмотреть, как выглядит res.data
, чтобы выяснить, получаем ли мы вообще правильный ответ, регистрируя его после того, как запрос сделан!
поэтому, если вы добавите console.info(res.data)
над определением valor
, что он запишет, когда вы его запустите?
это: Uncaught (в обещании) TypeError: невозможно прочитать свойства undefined (чтение «карты»)
Разве это не регистрирует ничего выше этого? Пока закомментируйте все остальное в обратном вызове .then
, потому что это может помешать приложению запустить console.info(res.data)
так: axios.get('MY API LINK').then((res) => console.info(res.data));
Это просто временно, чтобы увидеть, что мы действительно получаем правильные данные.
Да, и просто чтобы убедиться, что вы заменили 'MY API LINK'
фактической конечной точкой API, верно?
Я уже изменил api, это была просто запятая, поэтому в карте была ошибка, теперь она работает правильно, помогите
Ах! Отлично, рад слышать, что все получилось!
Ваш ответ представляет собой массив объектов. Либо выполните цикл по массивам, либо выберите нужный индекс из массивов.