#javascript #reactjs
Вопрос:
Я пытаюсь понять, что я здесь делаю не так, однако я не совсем уверен. Я хочу передать объект с сайта, который является «цветным» в соответствии с базой данных (австралийский).
Затем я хочу отобразить этот массив на внешний интерфейс, чтобы отображать только эти цвета как таковые. Например, в этом массиве есть [«Белый», «Черный», «Красный»] и т. Д.
Изначально у меня есть useEffect
функция, как показано ниже:
useEffect(() =gt; { const getProduct = async () =gt; { try { const res = await publicRequest.get("/products/find/" id); setProduct(res.data); } catch {} }; getProduct(); }, [id]);
Исходя из этого, я пытаюсь составить карту:
lt;Filtergt; lt;FilterTitlegt;Colourlt;/FilterTitlegt; {product.color.map((c)=gt; ( lt;FilterColour color={c} key={c}/gt; ))} lt;/Filtergt;
Но я получаю классическую:
Ошибка типа: Не удается прочитать свойства неопределенного (чтение «карты»)
Я пробовал и цвет, и цвет и т. Д., Но не могу решить? Любые идеи Складываются в стопку!
Комментарии:
1. Начальное состояние, вероятно, будет пустым массивом, и вы не сможете выполнить итерацию по цветовому массиву продукта, если продукт не существует. Есть несколько способов решить эту проблему, но я предпочитаю добавить чек перед возвратом. Что-то вроде:
if (!product.color) return lt;divgt;No productlt;/divgt;
.
Ответ №1:
Перед вызовом setProduct ваше значение по умолчанию должно иметь цвет в качестве свойства и должно быть массивом. Если вы столкнулись с этим после вызова setProduct, просто проверьте res.data, чтобы узнать, получаете ли вы данные в ожидаемом формате.
Комментарии:
1. Спасибо @user365091, это удобный совет
Ответ №2:
Поскольку данные, которые вы пытаетесь отобразить, являются результатом асинхронной функции, product
все еще не заполнены во время начальной визуализации, они заполняются только после.
Что мы обычно делаем в React, чтобы обойти это, так это добавляем условные операторы.
Это должно сработать —
lt;Filtergt; lt;FilterTitlegt;Colourlt;/FilterTitlegt; {product.color amp;amp; product.color.map((c)=gt; ( lt;FilterColour color={c} key={c}/gt; ))} lt;/Filtergt;
Комментарии:
1. Аааа @tomleb3, невероятно! Это работает, большое вам спасибо. Таким образом, логика здесь в основном такова: если product.color существует, то сопоставьте product.color по всему? Даже не подумал об этом!
2. Всегда пожалуйста. И да, это в основном означает, что во время первоначального рендеринга
product.color
не существует, потому что данныеpublicRequest.get
еще не возвращены, и поэтому мы используем ту логику, о которой вы упомянули.
Ответ №3:
Вам необходимо убедиться, что атрибут, к которому вы хотите получить доступ, сохраняет ту же структуру данных. Если нет, вам нужно проверить, является ли он неопределенным или нет.
Решение 1:
Сохраняйте ту же структуру данных. Крючок useState должен быть инициализирован как:
const [product, setProduct] = useState({color: []}) // or populate other attributes in the initial state.
Решение 2:
Проверьте, существуют ли данные:
{product.color amp;amp; product.color.map((c)=gt; ( lt;FilterColour color={c} key={c}/gt; ))}