React - 尝试将获取的数据保存在变量中,但变量返回空

Posted

技术标签:

【中文标题】React - 尝试将获取的数据保存在变量中,但变量返回空【英文标题】:React - trying to save fetched data in a variable but the variable returns empty 【发布时间】:2021-05-20 20:46:55 【问题描述】:

我使用 async await 获取了 json 数据,我想将获取的数据保存在一个变量中,以便能够将它与我的组件中的地图一起使用, 数据正确地进入函数内部 - 我检查了警报,并且在函数内部的变量中它确实显示了所有数据,但是函数外部的变量以某种方式返回空。 这是一些代码: 以下代码中的两个警报都返回正确的数据。

export let fetchPosts = [];
export async function FetchPosts() 
    await axios.get('https://jsonplaceholder.typicode.com/posts').then(
        res => 
            alert(JSON.stringify(res.data))
            fetchPosts = JSON.stringify(res.data);
            alert(fetchPosts)
        
    ).catch(err => 
        alert('err');
    )


import  fetchPosts  from '../services/post';
import  FetchPosts  from '../services/post';

export default function Posts() 
    function clickme() 
        FetchPosts()
    
    return (<>
        <button onClick=clickme>Click me</button>
        fetchPosts.map((post, index) => (
            <div key=post.id className="card" style= 'width': '16rem', 'display': 'inline-block', 'margin': '5px' >
                <div className="card-body">
                    <h6 className="title">post.title</h6>
                    <p className="card-text">post.body</p>
                </div>
            </div>
        ))
    </>)

【问题讨论】:

React 在您获取数据之前进行渲染,然后在数据更改时没有告诉它重新渲染。您需要使用状态和效果挂钩的更全面的解决方案。 【参考方案1】:

状态是问题

React 不会在你的单例 fetchPosts 上自动重新加载。 相反,尝试...

export function FetchPosts() 
    return axios.get('https://jsonplaceholder.typicode.com/posts');

然后

import  useState  from 'react';
import  FetchPosts  from '../services/post';

export default function Posts() 
    const [posts, setPosts] = useState([]);
    function clickme() 
        FetchPosts().then(res => 
          setPosts(res.data);
        );
    
    return (<>
        <button onClick=clickme>Click me</button>
        posts.map((post, index) => (
            <div key=post.id className="card" style= width: '16rem', display: 'inline-block', margin: '5px' >
                <div className="card-body">
                    <h6 className="title">post.title</h6>
                    <p className="card-text">post.body</p>
                </div>
            </div>
        ))
    </>)

https://codesandbox.io/s/jolly-almeida-q4331?fontsize=14&hidenavigation=1&theme=dark

如果您想要全局状态,那是您应该完全深入研究的另一个主题,但您可以使用单例来完成,您只需将它与钩子和事件发射器结合起来。我在这里https://codesandbox.io/s/react-typescript-playground-forked-h8rpu 有一个黑客版本,但你可能应该坚持使用 redux 或 mobx 或 AppContext,这更流行的模式。

【讨论】:

FetchPost 上的async 关键字在这里有什么不同吗? 我试过这样做,但它通过我一个错误:TypeError: services_post__WEBPACK_IMPORTED_MODULE_1_.FetchPosts.then is not a function @HåkenLid 你是对的。我不小心留下了这个。我的错。 如果我理解正确你的问题 - 在我的 .then res 中我得到数据并正确显示在警报中 @Mindy haha​​ 找到并更正了。我在没有函数的情况下调用它。更新。 q4331.csb.app

以上是关于React - 尝试将获取的数据保存在变量中,但变量返回空的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试将数据保存在数据库中,但它正在保存每个输入更改

如何将闭包中的变量保存到外部变量?

从 php url 获取数据以在 react native 中保存到本地 sqlite

将数据保存到本地存储

从 Firebase 读取数据并将其保存到数组中 - React

使用React-Native从嵌套JSON获取数据