#react-native #api #axios
Вопрос:
У меня есть существующий собственный компонент React, в котором я отображаю среднюю цену монет, полученную из других функций в том же файле js.
Сегодня я подумал о том, чтобы повысить его рыночную стоимость, и использовал API, доступный в Интернете.
Когда я работал нормально, он работает, но в реакции он возвращает NAN.
Моя функция рендеринга.
const renderCoin = ({ item, index }) => {
console.log("---Inside render coin---" item.text);
let { averagePrice, totalCost, totalCount } = orderListData(
item.text,
userID,
orders
);
let marketPrice = goForAxios(item.text);
console.log(`${item.text} = ${marketPrice}`);
return (
<View style={[styles1.rowFront, { flexDirection: "row" }]}>
<TouchableWithoutFeedback
onPress={() =>
props.navigation.navigate("Orders", {
coin: item.text,
userID: userID,
})
}
style={{ flex: 1 }}
>
<Text>
{item.text} {round(averagePrice)} {round(totalCost)}{" "}
{round(totalCount)} {marketPrice}
</Text>
</TouchableWithoutFeedback>
<TouchableOpacity
onPress={() => onDeleteCoin(item.id)}
style={{ flex: 1 }}
>
<Icon name={"trash"} size={30} color="#900" />
</TouchableOpacity>
</View>
);
};
И функция, используемая для вызова rest API.
const goForAxios = async (coin) => {
const response = await axios.get(
`https://min-api.cryptocompare.com/data/price?fsym=${coin}amp;tsyms=INR`
);
console.log(response.data.INR.toString());
return response.data.INR.toString();
};
Пожалуйста, предложите альтернативу, если мой подход сам по себе неверен.
Ответ №1:
Функция goForAxios
возвращает обещание. Таким образом, вы не можете отобразить значение до тех пор, пока Обещание не будет выполнено.
Как насчет того, чтобы создать новое состояние и обновить его после получения ответа API?
const RenderCoin = ({ item, index }) => {
console.log("---Inside render coin---" item.text);
let { averagePrice, totalCost, totalCount } = orderListData(
item.text,
userID,
orders
);
// new state to keep the response
const [marketPrice, setMarketPrice] = useState(0);
// make api request when the component mounts
useEffect(()=> {
(async () => {
const marketPrice = await goForAxios(item.text);
setMarketPrice(marketPrice);
})();
}, []);
return (
....
)
Комментарии:
1. Там будет несколько монет для извлечения, и я подумал вызвать эту функцию, как вы можете видеть, я вызываю ее при рендеринге let marketPrice = goForAxios(item.text); Поэтому, если я установлю состояние, это приведет к повторному запуску страницы несколько раз правильно и может привести к повторному вызову. Кроме того, я сохранил ожидание в функции, почему она все еще возвращает обещание?
2. Попробовал ваш код и получил эту ошибку: Ошибка: Недопустимый вызов соединения. Крючки могут вызываться только внутри тела функционального компонента. Это может произойти по одной из следующих причин: 1. У вас могут быть несоответствующие версии React и средства визуализации (например, React DOM) 2. Вы можете нарушать правила крючков 3. У вас может быть более одной копии React в одном и том же приложении, мой код, который я сохранил здесь, вы можете проверить, пожалуйста: codeshare.io/AdZByw
3. Даже если вы используете функцию wait в goForAxios, функция RenderCoin не будет ждать ответа, потому что RenderCoin не является асинхронной функцией… Гофораксиос возвращает обещание.
4. И да, вы можете использовать крючки только в компонентах. Вот почему я превратил ваш рендерКоин в
R
эндерКоин (сделайте первую букву заглавной), чтобы React мог видеть его как компонент.5. Все та же проблема, я изменился в соответствии с вашим предложением. codeshare.io/X8AXel