首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >array.map不使用数组的设置状态更新模板

array.map不使用数组的设置状态更新模板
EN

Stack Overflow用户
提问于 2022-03-25 15:36:05
回答 2查看 319关注 0票数 0

我有一个userData状态,用于呈现来自用户的通知列表--一个对象数组。在列表中,我为每个通知设置了一个delete按钮,它调用一个函数来处理userData的更新,并删除数组中的通知以设置它的新状态。最后,它用正确的数据更新状态,但是在模板上它永远不会得到更新,实际上它似乎明白数组是空的.(?)

而不是进入这个如果 userData.notifications && userData..。它进入else

代码语言:javascript
复制
//* const Notifications = () => { **/
//* ... **/
const [userData, setUserData] = useState(null);
const [isLoading, setIsLoading] = useState(true);

// handles delete
const deleteNotifications = (notificationId) => {
  setIsLoading(true);

  const user = {...userData};
  let newUserData = [];

  if(notificationId) {
    newUserData = user.notifications.filter(notification => {
      return notification.notificationId !== notificationId;
    });
  } else {
    user.notifications = [];
    newUserData = user;
  }
 
  setUserData(newUserData);
  setIsLoading(false);
}

// template
  const renderNotifications = () => {

  if(userData.notifications && userData.notifications.length) {
    return (
      <>
        { userData?.notifications?.map(({
            notificationId, 
            sendedAt,
            body,
          }) => (
          <NotificationShadow key={notificationId}>
            <SwipeableView onPress={() => deleteNotifications(notificationId)}>
              <Notification>
                <NotificationHeader>
                  <NotificationText>Nome da Notificação</NotificationText>
                  <NotificationText>{sendedAt}</NotificationText>
                </NotificationHeader>
  
                <ShowMoreText
                  text={body}
                  numberOfLines={2.6}
                  textColor={'#474747'}
                />
              </Notification>
            </SwipeableView>
          </NotificationShadow>
        ))}

        { userData.notifications.length ?
          <DeleteAllContainer onPress={() => deleteNotifications()}>
            <DeleteAllIcon
              type="font-awesome-5"
              name="trash"
              solid
            />
          </DeleteAllContainer> : null }
      </>
    );
  } else {
    return (
      <EmptyDataText>Sem notificações</EmptyDataText>
    );
  }
}

return (
  <StickyHeader title="Notificações">
    <NotificationsContainer>
      {
        isLoading ? <Text>loading...</Text> :
        renderNotifications()
      }
    </NotificationsContainer>

    <AndroidBackHandler onBackPress={() => true} />
  </StickyHeader>
);

//* } **/

我试图创建一个属于userData对象的状态通知字段,但是它没有工作。我还将renderNotifications代码直接插入最后的模板返回,但是..。没有结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-25 16:08:23

您正在修改userData的“形状”,这应该可以修复它:

代码语言:javascript
复制
const deleteNotifications = (notificationId) => {
    setIsLoading(true);

    let newNotifications = [];

    if (notificationId) {
        newNotifications = userData.notifications.filter((notification) => {
            return notification.notificationId !== notificationId;
        });
    }

    setUserData({...userData, notifications: newNotifications});
    setIsLoading(false);
};
票数 1
EN

Stack Overflow用户

发布于 2022-03-25 16:17:51

首先,userData的声明与我有关。让我们尝试将初始状态设置为与未来状态相同的类型:

代码语言:javascript
复制
const [userData, setUserData] = useState([]);

我假设函数的开头有一些设置userData状态的内容。但是,由于您添加了notifications,所以delete函数不是用新的数据更新userData,而是只用通知更新。这将导致未来的通知不存在,从而创建和空数组。我也不认为user在这里很有用,因为它只是一个从userData读取数据的副本,无需额外的步骤也可以从userData读取数据。

让我们尝试应用这些更改:

代码语言:javascript
复制
if(notificationId && userData) {
  newUserData = userData.filter((user) => {
    return userData.notification.notificationId !== notificationId;
  });
}

如果这一点(在你的头上做了一些小调整)不起作用,你肯定需要提供更多的细节,特别是关于你的州的细节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71619554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档