调用 DynamoDB 中的用户数据时渲染得太晚

2024-05-07

所以我试图从dynamoDB。我正在使用一个GraphQL API访问我的数据库。在提供的代码的注释部分中,我提到我已经尝试过users[1].friends.map,它确实返回正确的朋友列表数组,但用户似乎直到朋友列表渲染后才被设置。我应该如何设置我的代码,以便在第一次呈现页面时而不是在更新页面后呈现正确的朋友列表(在用户中找到)?

const FriendsList = [
 {
    name: 'Name 1',

  },
  {
    name: 'Name 2',

  },
  {
    name: 'Name 3',

  }, 
  {
    name: 'Name 4',

  },
  {
    name: 'Name 5',

  },
  {
    name: 'Name 6',

  },
  
];
const Friends = (props) => {

  const [refreshing, setRefreshing] = React.useState(false);
  const [users, setUsers] = React.useState([]);
  const [formData, setFormData] = React.useState(initialFormState);

  React.useEffect(() => {
    fetchUserData();
   }, []);

  async function fetchUserData() {
    const userData = await API.graphql({ query: listUsers });
    setUsers(userData.data.listUsers.items);
  }


  //console.log(users);
    const renderFriendsList = (props) => {

    /* 
     *Here I want to have something like...
     * return users[1].friends.map((item, i) => {
     * so I can iterate through the friends list 
     */
    return FriendsList.map ((item, i) => {
        return (
          <View style={{ paddingLeft: scale(10), paddingRight: scale(10) }}>
            <View
              style={{
                backgroundColor: '#d1cfcf',
                width: scale(330),
                height: scale(85),
                borderRadius: scale(10),
                flexDirection: 'row',
                borderColor: '#8f8a8a',
                borderBottomWidth: 1,
              }}>

              <View>
                <Text style={{ fontSize: 15 }}>{item.name}</Text>
              </View>
            </View>
          </View>
        );
    
    });
  };

    return (
      <View style={{}}>
          <View style={{ marginTop: scale(5) }}>
            {renderFriendsList()}
          </View>
      </View>
    );
  }

fetchUserData()应该设置users用户数据,但是当我打电话给用户时before第一次渲染时,用户仍然是未定义的。如果应用程序正在运行并且已从friendsList呈现好友列表,然后我将其更改为用户1 https://i.stack.imgur.com/dEWY6.png.friends 即时运行,它可以工作,但这显然是一个问题,因为它第一次无法正确渲染。我用React.useEffect()我想这会打电话给fetchUserData()当页面呈现时。

Here is the output I am getting when I console.log(users.result) Here is the output I am getting when I console.log(users.result)


useEffect使用空数组作为参数被调用after初始渲染,这是正常行为。

通常当你想要渲染与 api 调用相关的状态时,你会以如下形式存储:

const defaultState = { loading: false, result: null, error: null };
const [users, setUsers] = useState(defaultState); 

因此你可以这样做:

async function fetchUserData() {
    setUsers({ ...defaultState, loading: true });
    try {
        const userData = await API.graphql({ query: listUsers });
        setUsers({ ...defaultState, result: userData.data.listUsers.items});
    } catch (e) {
        setUsers({ ...defaultState, error: e.message });
    };
}

由于您正在进行远程调用,因此在加载期间显示旋转器是有意义的,而不是立即渲染集合。
因此您可以使用loading用于此目的的状态对象上的属性。

当然,还有其他技术,您可以立即在服务器上进行 ajax 调用,然后将它们作为 json 立即推送到客户端,或者只是从服务器渲染 html。

编辑: 基于当前的解决方案,您可以执行以下操作:

... 
return (
    <>
        { loading && <>loading...</> }
        {
            !loading
            && result 
            && <FriendList result={ result } /> // map now that the results are available 
        }
    </>
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用 DynamoDB 中的用户数据时渲染得太晚 的相关文章

随机推荐

  • 错误:从上游读取响应标头时上游过早关闭连接 [uWSGI/Django/NGINX]

    我目前在用户正在进行的查询中总是得到 502 它通常返回 872 行 在 MySQL 中运行需要 2 07 然而 它返回了大量信息 每一行包含很多东西 有任何想法吗 运行 Django tastypie Rest API Nginx 和 u
  • 如何将列表从控制器发送到百里香

    我需要将列表中存在的数据从我的 spring 控制器发送到 thymeleaf html 我如何发送数据 收到后如何迭代百里香中的数据 将您的清单放入您的ModelMap or ModelAndView对象然后使用遍历它th each在你的
  • 检查目录是否为空

    我正在尝试检查目录是否为空 MainWindow MainWindow QWidget parent QMainWindow parent ui new Ui MainWindow ui gt setupUi this QDir Dir h
  • jQuery触发新添加的html代码

    示例我有 2 个 html 输入 div class wrap div
  • git push heroku master 通过代理后面的 ssh 出现错误

    简要背景 大家好 我是一名大学生 代理 10 3 100 211 8080 刚接触 ROR Git 和 Heroku 一直在关注 Ruby on Rails 教程 我解决了通过 ssh 推送 git repo 的问题 在我的 ssh con
  • 如何在 Perl 中取消导入函数?

    我正在尝试删除导入的符号 以便它们不能用作对象中的方法 但是no似乎不起作用 也许我不明白不 或者还有其他方法 use 5 014 use warnings use Test More still has carp after no car
  • 执行命令不会在后面的资源字典代码中触发

    我已经为其创建了资源字典和代码隐藏文件 在 XAML 中 我定义了命令绑定并添加了执行处理程序
  • Android 按文件夹列出音乐并播放

    我正在开发已经上市的安卓音乐播放器 用户要求添加一个文件夹视图来列出智能手机中包含音乐的所有文件夹 我想开发它 MediaStore 已经知道要遵循的正确路径 因为它需要知道它们每次重新扫描 SD 卡 所以我想知道是否有办法获取这些路径并使
  • Stripe Connect - 检索访问令牌

    我正在尝试为 Rails 3 2 13 应用程序设置 Stripe Connect 我已将用户引导至 Stripe 并收到了来自 Stripe 的授权码 HTTP 1 1 302 Found Location http localhost
  • 如何在 PHP 中解密密码哈希?

    我需要解密密码 密码已加密password hash功能 password examplepassword crypted password hash password PASSWORD DEFAULT 现在 我们假设 crypted存储在
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • MSBuild - 我可以编译子目录中的所有解决方案吗?

    MSBuild 中有没有一种方法可以编译指定父级下的文件夹 子文件夹和子 中的所有解决方案 我们的库附带了很多示例程序 我想添加到构建过程中 我们知道它们都会编译 您可以创建自己的targets for restore and build运
  • 从命令提示符启动mysql服务器时出错

    我是 sql 新手 我安装了 mysql 并且正在阅读这本书 Java 如何编程连接到 mysql 我收到以下错误 关于时间戳 我明白原因 但我正在尝试修复 无法创建测试文件 C Program Files MySQL MySQL Serv
  • 如何在 Dart 中传递常见参数?

    说吧 我有 callback orderBy foo reverse true localToThis callback orderBy foo reverse true 您可以在两个回调中看到 我传递了相同的参数 foo reverse
  • 如何为 Safari 浏览器设置媒体查询

    media only screen and min width 480px and max width 767px 这是我的媒体查询如何修复它 如何设置 safari 网络浏览器 媒体查询不是为了浏览器检测而进行的 使用 javascrip
  • 有没有办法确定特定地址是否位于 x 英里内的路线沿线?

    有没有办法确定特定地址是否位于 x 英里内的路线沿线 Google 地图 API 是否支持此功能 我有一个地址数据库 我试图找出 Google 地图 API 确定的给定路线上的哪些位置 您可以设置获取折线 http code google
  • 将文本文件中的多行组合/合并为一行 (Powershell)

    我有一个文本文件 其中包含如下内容 blah blah blah Text string1 string2 string3 string4 string5 string6 blah blah blah Text string7 string
  • Spring MVC 3 中的表单提交 - 说明

    我在理解 Spring 3 MVC 中的表单提交如何工作时遇到问题 我想做的是创建一个控制器 它将获取用户的名字并将其显示给他 不知怎的 我已经做到了 但我不太明白它是如何工作的 所以 我有一个看起来像这样的表格
  • RavenDb 和多租户

    我已经研究并使用了 RavenDb 一段时间 并开始考虑 MultiTenancy 多租户 Ayendes 示例如下所示 using var store new DocumentStore Url http localhost 8080 I
  • 调用 DynamoDB 中的用户数据时渲染得太晚

    所以我试图从dynamoDB 我正在使用一个GraphQL API访问我的数据库 在提供的代码的注释部分中 我提到我已经尝试过users 1 friends map 它确实返回正确的朋友列表数组 但用户似乎直到朋友列表渲染后才被设置 我应该