У меня есть этот компонент, который делает вид, что получает идентификатор категории продуктов, делает вызов бэкенду через API и возвращает продукты этой категории.
Для этого при первом рендеринге компонента я делаю вызов API по умолчанию без необязательных параметров и возвращаю, например, 10 элементов.
Но затем у меня есть некоторые фильтры, такие как цена от, цена до или марка продукта, которые я собираю эти значения и отправляю их в API, чтобы вернуть JSON с продуктами.
По этой причине я создал функцию «handleButtonCLick», целью которой является сбор значений фильтров (поле ввода) и выполнение вызова API через сообщение.
По этой причине я создал функцию «handleButtonCLick», целью которой является сбор значений фильтров (поле ввода) и выполнение вызова API через сообщение.
import axios from 'axios'
import GuestLayout from '@/components/Layouts/GuestLayout'
import { useRouter } from 'next/router'
import { useEffect, useState } from 'react'
const Name = ({ itemsList }) => {
const router = useRouter()
//const [itemsList, setItemsList] = useState([])
const handleButtonCLick = (event, value) => {
const requestOptions = {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
category_id: 100,
}),
}
fetch(
`${process.env.NEXT_PUBLIC_BACKEND_URL}/api/product/category/`,
requestOptions,
)
.then(response => response.json())
.then(json => setItemsList(json))
}
return (
<GuestLayout>
<div>
{itemsList.map((x, i) => (
{x.price}€
))}
</div>
<div className = "py-12">
<Button variant = "outlined"
onClick = {handleButtonCLick}>
Search items
</Button>
</div>
</GuestLayout>
)
}
Name.getInitialProps = async context => {
let valor = 1;
const { data } = await axios.post(
`${process.env.NEXT_PUBLIC_BACKEND_URL}/api/product/category/${valor}/`,
)
return { itemsList: data }
}
export default Name
Я делаю вызов, но я не знаю, как установить полученный результат в «itemsList», потому что, если я установлю его таким образом, это говорит мне, что я не могу определить его СНОВА.
const [itemsList, setItemsList] = useState([])
Вы пытаетесь объявить некоторое состояние React с тем же именем, что и уже объявленное для реквизита. Просто используйте другое имя переменной. Используйте useEffect
хук, чтобы сохранить переданную itemsList
опору в состояние, если/когда она обновится, и обновите рендер, чтобы отобразить локальное items
состояние.
import axios from 'axios';
import GuestLayout from '@/components/Layouts/GuestLayout';
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';
const Name = ({ itemsList }) => {
const router = useRouter();
const [items, setItems] = useState([]);
useEffect(() => {
setItems(itemsList);
}, [itemsList]);
const handleButtonCLick = (event, value) => {
const requestOptions = {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
category_id: 100,
}),
}
fetch(`${process.env.NEXT_PUBLIC_BACKEND_URL}/api/product/category/`,
requestOptions,
)
.then(response => response.json())
.then(json => setItems(json));
}
return (
<GuestLayout>
<div className = "py-12">
<div>
{items.map((x, i) => (
{x.price}€
))}
</div>
</div>
</GuestLayout>
);
}
Name.getInitialProps = async context => {
let valor = 1;
const { data } = await axios.post(`${process.env.NEXT_PUBLIC_BACKEND_URL}/api/product/category/${valor}/`);
return { itemsList: data };
}
export default Name;
@ilernet2 Можете ли вы уточнить, что не обновляется на экране? Насколько я вижу, в компоненте не используется ни itemsList
, ни какое-либо локальное состояние. Вы используете две разные конечные точки. Что вы пытаетесь передать, получить и отобразить?
Я загружаю данные конечной точки в props itemsList при первой загрузке компонента (это работает нормально). У меня также есть кнопка поиска с событием «handleButtonCLick», которое выполняет вызов API с параметрами и возвращает JSON. Этот json, который он возвращает, — это тот, который я пытаюсь поместить в itemsList, чтобы обновить данные на экране.
@ ilernet2 Хорошо, кажется, я понял. Пожалуйста, смотрите мой обновленный ответ.
Большое спасибо за помощь, теперь я понимаю, как это сделать.
Я пробовал это, и это не дает ошибки, но не отправляет JSON с элементами в компонент, поскольку компонент получает {itemsList} в качестве реквизита, поэтому, если я создаю набор элементов с setItems, он не обновляет данные на экране.