我正在第一次创建React Native应用程序。
我做了一个JourneyScreen
组件,它将用于显示到目的地的方向。我正在调用我的API,它将返回方向,但由于我目前正在测试驱动这个组件,API调用的结果被模拟,我可以看到它模拟的结果很好,所以我还不担心axios请求。
我的问题是,当我调用setDirections
时,我不确信值正在被更改。
import React, { useEffect, useState } from 'react';
import { Button, Text, View, TouchableOpacity } from 'react-native';
import axios from 'axios';
import Leg from './leg';
export default function JourneyScreen({
navigation,
startLocation,
endLocation,
}) {
const [directions, setDirections] = useState({});
useEffect(() => {
console.log('Directions: ', directions);
}, [directions]);
useEffect(() => {
const getDirections = async (startLocation, endLocation) => {
const result = await axios.get('https://localhost:3000');
console.log('result: ', result);
setDirections(result);
};
getDirections(startLocation, endLocation);
}, [startLocation, endLocation]);
return (
<>
<Text>{`Directions: ${directions}`}</Text>
<Text>Directions</Text>
<Leg />
</>
);
}
当i console.log
产生useEffect
时,我得到预期的API响应。
当i console.log
在我的返回块中directions
的内容时,我可以看到它仍然只是一个空对象,这意味着它还没有被设置为result
的内容。
- EDIT* 我添加了useEffect,只是为了跟踪和记录
directions
,仍然得到相同的结果。
有人知道这是为什么吗?
3条答案
按热度按时间kwvwclae1#
既然你没有分享你的调试方式。我相信这是一个
asynchronous
的问题。useState
不同步工作,您需要等待以侦听此更改。同样,在代码中,您使用了
async
,但在调用函数时,您没有使用waiting
。所以你需要把
await
。如果你想检查
directions
的状态,你可以用useEffect来监听,如下所示:因此,无论何时方向的值发生变化,您都可以听到变化后的值。
但是,请始终记住,异步函数/行为等
编辑:我还注意到代码中的
{console.log('directions: ', directions)}
值,但您不应该将console.log放在JSX中。您可以改为:
<Text>{
Directions: ${directions}}</Text>
如果我误解了你的问题,请告诉我,这样我们就可以深入研究:)
tjvv9vkg2#
1.您的代码将无法工作,因为您试图呈现控制台日志返回。如果您想检查值,您可以在返回值之前记录,它将在每个组件呈现后调用,或者您可以在
directions
上执行额外的useEffect侦听,并在每次更改后记录值。1.如果你在某处调用API,请使用try-catch;)
h6my8fg23#
useState setter函数异步地更新状态。2你不能保证setter之后的下一行会有更新的值。
您始终可以使用
useEffect
订阅对变量的更新,以便在dependency数组中使用该变量来对值的更改执行操作