状态更改后,上下文未更新 React Native 中的文本

Posted

技术标签:

【中文标题】状态更改后,上下文未更新 React Native 中的文本【英文标题】:Context is not updating text in React Native after state change 【发布时间】:2021-11-23 09:53:06 【问题描述】:

我有一个真正的笨蛋,我无法绕开它。

我有这个组件:

<TouchableOpacity
  onPress=() => 
    if (myContext.value) 
      alert('true');
      //changes myContext.value to false
     else 
      alert('false');
      //changes myContext.value to true
    
  >
  <Text>myContext.value ? 'working' : 'not working'</Text>
</TouchableOpacity>

我不明白的奇怪之处在于上下文正在改变 onPress 函数。因此,如果我单击该按钮,它首先会提示 true,然后按预期来回提示 false。没有改变的是应该介于“工作”和“不工作”之间的文本。

这个组件肯定在我的Provider的范围内。我正在使用useContext 访问myContext

有人知道为什么会这样吗?

【问题讨论】:

【参考方案1】:

这里要注意的一点是,仅仅改变myContext.value = false or true不会触发重新渲染。

我不确定您如何处理 value 更改,但我已经创建了您想要的副本

查看thisSnack 以查看工作示例。

如下图所示创建上下文

import  createContext  from 'react';

const MyContext = createContext();

export default MyContext;

App.js 组件示例如下所示

import * as React from 'react';
import  Text, View, TouchableOpacity  from 'react-native';

import Constants from 'expo-constants';
import MyContext from './MyContext';

import MyComponent from './MyComponent';

export default function App() 
  const [value, setValue] = React.useState(true);

  return (
    <MyContext.Provider value= value, setValue >
      <MyComponent />
    </MyContext.Provider>
  );

您要执行此操作的组件应如下所示

import * as React from 'react';
import  Text, View, StyleSheet, TouchableOpacity  from 'react-native';
import Constants from 'expo-constants';
import MyContext from './MyContext';

export default function MyComponent() 
  const myContext = React.useContext(MyContext);

  return (
    <TouchableOpacity
      onPress=() => 
        if (myContext.value) 
          alert('true');
          myContext.setValue(false);
          //changes myContext.value to false
         else 
          alert('false');
          myContext.setValue(true);
          //changes myContext.value to true
        
      >
      <Text>myContext.value ? 'working' : 'not working'</Text>
    </TouchableOpacity>
  );

【讨论】:

是的,这正是我正在做的。我知道它正在更新值,因为当我单击它时,警报会从真到假来回变化,它只是没有更新“工作”和“不工作”之间的文本,你可以在我的文本组件中看到它。您知道为什么会发生这种情况吗? 看看我在答案中提供的小吃。您会看到文字发生了变化 当然,我明白了,但在我的项目中并没有改变。你知道会导致这种行为的任何事情吗?这是一个相当大的代码库 你用这个myContext.value = false还是这个myContext.setValue(false)

以上是关于状态更改后,上下文未更新 React Native 中的文本的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用状态动态更改 React Native 转换?

React Native:更新数据后未重新渲染组件

无法对未安装的组件执行 React 状态更新。 useEffect React-Native

React Native - 无法对未安装的组件执行 React 状态更新,使用Effect 清理功能

为啥组件在状态更改后不重新渲染。在 react-native 函数组件中