【问题标题】:useState not Updating on screen in React-Native在 React-Native 中,useState 未在屏幕上更新
【发布时间】:2020-12-30 14:32:24
【问题描述】:

屏幕上的输出没有按预期变化 我的代码如下:

import React, { useState } from "react";
import { StyleSheet, FlatList, View } from "react-native";
import ListItem from "../components/ListItem";

import colors from "../config/colors";
import Screen from "../components/Screen";
import ListItemSeperator from "../components/ListItemSeperator";
import ListItemDeleteAction from "../components/ListItemDeleteAction";

const InitialMessages = [
  {
    id: 1,
    title: "T1",
    description: "D1",
    image: require("../assets/Images/mosh.jpg"),
  },
  {
    id: 2,
    title: "T2",
    description: "D2",
    image: require("../assets/Images/mosh.jpg"),
  },
  {
    id: 3,
    title: "T3",
    description: "D3",
    image: require("../assets/Images/mosh.jpg"),
  },
];

function MessagesScreen(props) {
  const [messages, UpdateMessageArray] = useState(InitialMessages);

  const handlerDelete = (message) => {
    console.log("Came to Delete");
    const newArr = messages.filter((m) => m.id !== message.id);
    UpdateMessageArray(newArr);
  };

  return (
    <Screen>
      <FlatList
        data={InitialMessages}
        keyExtractor={(message) => message.id.toString()}
        renderItem={({ item }) => (
          <ListItem
            title={item.title}
            subTitle={item.description}
            image={item.image}
            onPress={() => console.log("MESSAGE PRESSED", item)}
            renderRightActions={() => (
              <ListItemDeleteAction onPress={() => handlerDelete(item)} />
            )}
          />
        )}
        ItemSeparatorComponent={ListItemSeperator}
      />
    </Screen>
  );
}

const styles = StyleSheet.create({});

export default MessagesScreen;

在控制台上..它输出为“CAME TO DELETE”,并且我还在每次删除后记录了 initialMessages 数组...我看到它得到了更新,但没有在屏幕上显示。 任何想法为什么它不起作用??

【问题讨论】:

    标签: javascript reactjs react-native react-hooks use-state


    【解决方案1】:

    FlatList 是一个PureComponent

    它需要一个 props 来改变以重新渲染。您将data 属性设置为InitialMessages 而不是messages,因此状态不会发生变化。

    请使用messages 状态设置您的数据道具,否则使用 extraData 道具传递一些可以更改的状态。

    import React, { useState } from "react";
    import { StyleSheet, FlatList, View } from "react-native";
    import ListItem from "../components/ListItem";
    
    import colors from "../config/colors";
    import Screen from "../components/Screen";
    import ListItemSeperator from "../components/ListItemSeperator";
    import ListItemDeleteAction from "../components/ListItemDeleteAction";
    
    const InitialMessages = [
      {
        id: 1,
        title: "T1",
        description: "D1",
        image: require("../assets/Images/mosh.jpg"),
      },
      {
        id: 2,
        title: "T2",
        description: "D2",
        image: require("../assets/Images/mosh.jpg"),
      },
      {
        id: 3,
        title: "T3",
        description: "D3",
        image: require("../assets/Images/mosh.jpg"),
      },
    ];
    
    function MessagesScreen(props) {
      const [messages, UpdateMessageArray] = useState(InitialMessages);
    
      const handlerDelete = (message) => {
        console.log("Came to Delete");
        const newArr = messages.filter((m) => m.id !== message.id);
        UpdateMessageArray(newArr);
      };
    
      return (
        <Screen>
          <FlatList
            data={messages}
            keyExtractor={(message) => message.id.toString()}
            renderItem={({ item }) => (
              <ListItem
                title={item.title}
                subTitle={item.description}
                image={item.image}
                onPress={() => console.log("MESSAGE PRESSED", item)}
                renderRightActions={() => (
                  <ListItemDeleteAction onPress={() => handlerDelete(item)} />
                )}
              />
            )}
            ItemSeparatorComponent={ListItemSeperator}
          />
        </Screen>
      );
    }
    
    const styles = StyleSheet.create({});
    
    export default MessagesScreen;
    

    参考1:https://reactnative.dev/docs/flatlist.html

    参考2:Why FlatList is not updating dynamically in React Native

    【讨论】:

    • @KartikeyVaish 完成...只需将 data={InitialMessages} 更改为 data={messages} 这是您的 React 状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多