React Native Context 不会跨文件和屏幕更新

Posted

技术标签:

【中文标题】React Native Context 不会跨文件和屏幕更新【英文标题】:React Native Context not updating across files and screens 【发布时间】:2021-10-05 13:36:53 【问题描述】:

我正在尝试使用 Context 创建一个跨屏幕存在的全局数组。我的设置包括一个显示数组内容的屏幕,以及一个到第二个屏幕的导航按钮,其中包含一个用于将元素添加到列表的按钮。

我希望第一页的列表在每次按下添加按钮时打印一个额外的“Hello World”,并显示一个初始项目“Hello World Initial”。但是,使用下面的代码,我只能显示初始值,并且尝试添加更多内容失败了。

没有抛出任何错误,按下按钮似乎没有做任何事情。这是项目的小菜一碟:https://snack.expo.dev/@figbar/context-across-files-and-screens,下面是其中包含的代码:

App.js:

import  TestList, TestListProvider  from './File1';
import * as React from 'react';
import View, Text, Button  from 'react-native';
import  NavigationContainer  from '@react-navigation/native';
import  createStackNavigator  from '@react-navigation/stack';
import Screen2 from './Screen2';


const Stack = createStackNavigator();


function HomeScreen( navigation ) 
   const _retrievedList = React.useContext(TestList);
  const populate = (arg:any) => 
    return arg.map((val, index) => <Text key=index>val.value</Text>);
  
  return (
    <View>
        <View>populate(_retrievedList)</View>
        <Button
        title="Go to Details"
        onPress=() => navigation.navigate('Screen2')
      />
    </View>
    
  );

function App() 
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home">
        <Stack.Screen name="Home" component=HomeScreen />
        <Stack.Screen name="Screen2" component=Screen2 />
      </Stack.Navigator>
    </NavigationContainer>
  );

export default App;

文件1.js

import React from 'react'

const testObject = 
    value: "Hello World Initial",
;

export const TestList = React.createContext([testObject]);

export const TestListProvider = TestList.Provider;

Screen2.js

import  TestList, TestListProvider  from './File1';
import * as React from 'react';
import View, Text, Button  from 'react-native';


export default function Screen2() 

  const testObject2 = 
      value: "Hello World",
  
  const [_localUpdate, _setLocalUpdate] = React.useState([]);
  
  const addItem = () => 
    _setLocalUpdate([..._localUpdate, testObject2]);
  
  return (
    <View>
        <TestListProvider value=_localUpdate>
          <Button onPress=addItem title="Add" color="#841584" />
        </TestListProvider>
    </View>
  );

【问题讨论】:

【参考方案1】:

您的上下文提供者必须包装所有将使用上下文值的组件。在此示例中,只有一个 Button 可以使用上下文 - 您自己的组件都不能。

您需要将提供者连同承载其价值的状态一起移动到您的根组件。

【讨论】:

如果我将它们移动到根组件,那么 addItem 如何访问 _localUpdate 和 _setLocalUpdate? @figbar _localUpdate 将存在于根目录中,子节点将使用 useContext 访问它。

以上是关于React Native Context 不会跨文件和屏幕更新的主要内容,如果未能解决你的问题,请参考以下文章

React this.context 在 React Native 0.61 中返回空对象

在 React Native 中使用 Context 和 React Navigation 处理嵌套屏幕上的更新

React (Native) Context API 导致 Stack Navigator (React Navigation 5) 在状态更新后重新渲染

React Native 状态管理(Redux、Context API 或 Graphql)

React Native Context,如何在多个嵌套文件和组件之间共享上下文

React Native with Context API 警告:“允许需要循环,但可能导致未初始化的值......”