首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应-本机传递useState到导航屏幕和更新FlatList

反应-本机传递useState到导航屏幕和更新FlatList
EN

Stack Overflow用户
提问于 2022-10-26 22:29:43
回答 1查看 35关注 0票数 0

我正在尝试使用react导航,并在屏幕之间传递useState,并让它呈现一个平面列表。如果我返回到前一个屏幕,然后返回到评论屏幕,那么它将正确地更新平面列表,同时,只要按下按钮,就不会发生任何事情。

在我的App.js文件中,设置基本上如下所示

代码语言:javascript
复制
....
 <Stack.Screen
  name="CommentScreen"
  component={CommentScreen}
  options={{ title: "CommentScreen" }}
  initialParams={{ comments: getComments, setComments: setComments }}
  />
....

其中的注释来自以下内容:

代码语言:javascript
复制
...
var comments= [
    {
        comment_id: "1",
        post_id: "1",
        user: "user",
        comment: "comment1"
    }
]
const [getComments, setComments] = useState((comments));
...

然后,在我的commentScreen.js文件中,我有以下内容,它基本上只是一个平面列表,一个输入字段,带有一个按钮,用一个新的注释更新状态。从App.js传递getter / setter的

代码语言:javascript
复制
export default function CommentScreen({navigation, route}){

    const [currentComment, setCurrentComment] = useState("");
    const addComment = (message) => {
        route.params.setComments(
            [...route.params.comments,
                {
                    post_id: route.params.post_id,
                    comment_id: new_comment_id(),
                    user: "user1",
                    comment: message
                }
            ]
        );
      }
    return(
        <View style={styles.screenDefault}>
            <FlatList
                data={route.params.comments}
                renderItem={({item}) => Comment({item})} 
                keyExtractor={item => item.comment_id} 
                extraData={route.params.comments}
            />
            <View style={styles.comment}> 
                <View style={styles.inputField}>
                    <TextInput
                        style={{flex: 1}}
                        onChangeText={setCurrentComment}
                        placeholder=" Add comment "
                    />
                    <Button
                        style={{flex: 1}}
                        onPress={()=>addComment(currentComment)}
                        title="Post"
                        color="gray"
                    />
                </View>
            </View>
        </View>
    )
}

renderItem函数注释在Comment.js中定义如下

代码语言:javascript
复制
export default function Comment({item}){
    return(
    <View style={styles.item}>
      <Text style={styles.title}>
        {item.user}
      </Text>
      <Text style={styles.comment}>
        {item.comment}
      </Text>
    </View>
    );
  }

所以有些事情确实发生了,因为如果我在添加了一个评论之后,它就会出现,但是只要按下按钮,什么都不会发生。谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-28 08:33:16

我建议您使用Redux,因为它集中您的应用程序状态。反应-还原

下面是它的工作原理,假设您有一个包含两个主屏幕的应用程序,HomeScreen.js和OptionScreen.js。

1-在HomeScreen.js内部有一个视图组件

2-在OptionScreen.js内部有一个Button组件

如果我们想要根据单击与否更改视图的颜色,使用useState,则必须在包含两个主屏幕的顶级父组件中为该颜色创建一个状态,然后将其传递到ButtonView组件,这是非常混乱和复杂的。

这里是Redux发挥作用的地方,我们只需创建一个“状态文件”,并让所需的组件监听它。

Button单击

redux > View中的状态将重新呈现并导致其颜色更改。

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

https://stackoverflow.com/questions/74214892

复制
相关文章

相似问题

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