reactjs axios返回数据3次

fwzugrvs  于 2023-03-29  发布在  React
关注(0)|答案(1)|浏览(133)

我使用下面的结构使用axios获取数据

export const PostScreen = ({route, navigation}) => {
    const [isLoading, setIsLoading] = React.useState(true);
    const [data, setData] = React.useState();

    const {id, title} = route.params;

    navigation.setOptions({
        title: title
    });

    React.useEffect(() => {
        axios.get('https://6420bd1382bea25f6d0666b6.mockapi.io/test/' + id)
            .then(({data}) => {setData(data)})
            .catch(e => Alert.alert('Error', 'Error'))
            .finally(() => {
                setIsLoading(false);
            });
    }, []);

    console.log(data)

    if(isLoading) {
        return <Loading/>
    }

    return (
      <View>
          <PostImage source={{uri: data.imageUrl}}/>
          <PostText>{data.text}</PostText>
      </View>
    );
}

当输出到控制台时,首先显示undefined,然后显示数据2次,axios是否发出3次请求?应用程序按预期工作,但我当时感到困惑。我不希望向服务器发出2个额外的请求
我希望这只是我对axios工作原理的误解,你可以解释给我听。提前谢谢你!

fdbelqdn

fdbelqdn1#

Axios有3个请求吗?
在浏览器的调试工具中,在网络选项卡上,您观察到该请求的多少个示例?这就是正在发出的请求的数量。
后退一步,观察显示的代码有 * 更多 * 比 * 只是Axios*.你似乎是在假设 * 整个事情 * 是“Axios”,而这根本不是事实.你在这里有 * 一个React组件 *.和 * 一件事 * React组件做的是通过Axios调用HTTP请求.
React组件在每次渲染时做的另一件事是:

console.log(data)

这与Axios请求 * 完全分离且无关 *。两者 * 毫无 * 关系。这行代码所做的一切就是将data的当前值输出到控制台。每次组件呈现时,它都会这样做。
因此,当组件初次呈现时,它会输出一个值 * 至少一次 *。在那之后,什么会导致组件重新呈现?状态改变。例如,这个:

setData(data)

和/或这一个:

setIsLoading(false)

由于这两个状态更新发生在Promise链的不同回调中,因此组件很可能在这两个操作之间重新渲染。您可以通过同步排队两个状态更新来将其减少为 one re-render:

axios.get('https://6420bd1382bea25f6d0666b6.mockapi.io/test/' + id)
    .then(({data}) => {
        setData(data);
        setIsLoading(false);
    })
    .catch(e => Alert.alert('Error', 'Error'));

状态更新本身仍然是异步的,但是同步排队多个更新将导致它们被批处理,并且仅触发组件的一次重新呈现。

相关问题