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

Posted

技术标签:

【中文标题】React Native with Context API 警告:“允许需要循环,但可能导致未初始化的值......”【英文标题】:React Native with Context API warnings: "Require cycles are allowed, but can result in uninitialized values... " 【发布时间】:2020-06-14 18:46:03 【问题描述】:

当我在 Expo React Native 项目中使用 React 的 Context API 时,会收到以下警告:

要求循环是允许的,但可能导致未初始化的值。考虑重构以消除对循环的需求。

我正在 App.tsx 中创建上下文:

import Start from "./start";

export const AppContext = React.createContext(
  isLandscape: true,
);

export default function App() 
  return (
    <AppContext.Provider value= isLandscape: false >
      <Start />
    </AppContext.Provider>
  );

在 Start.tsx 组件中,我正在使用上下文:

import  AppContext  from "./App"

export default function App() 
  const context = React.useContext(AppContext);
  console.log(context);

  return (
    <Text>Sutff</Text>
  );

我看起来警告是因为App 导入Choose 然后再次从App 导入上下文。 Require cycles are allowed, but can result in uninitialized values. Consider refactoring to remove the need for a cycle

但是,这不是 Context API 应该如何使用的吗?在 React Native 中使用 Context API 时,人们通常如何处理这个问题?

【问题讨论】:

【参考方案1】:

要中断循环,请将共享上下文移动到单独的文件中。

// in AppContext.js

export const AppContext = React.createContext(
  isLandscape: true,
);

然后在App.jsStart.js 中,从该文件中导入上下文。

import  AppContext  from './AppContext'

因此,不是让 App Start 相互依赖,而是现在有 App -> AppContext 和 Start -> AppContext,从而打破了循环。

【讨论】:

为什么会这样? @conor909 如果我等你,你等我,我们永远不会去。相反,如果我们都在等待另一个人,那么一旦那个人走了,我们就和他们一起去。现在 JS 实际上并没有陷入死锁,但仍然尝试加载循环依赖项(有点像当我决定去并希望你也去的时候),并且 一些 时间它很好(例如在 OP 示例中,它可以首先在 App.tsx 中初始化 AppContext,然后在 Start.tsx 中初始化 App,最后在 App.tsx 中初始化 App)但是如果您在一个文件中有 A = B 并且在另一个文件中有 B = A,当值仍然未定义时,将首先执行其中一个。 我觉得我根本不关注你。我认为这不应该是关于事物存在于哪些文件中,而应该是关于何时以特定顺序调用函数 我认为你混淆了两件事。在 Node/javascript/TypeScript 中,文件(模块)在程序遇到它们时被逐行加载和执行。这意味着所有导入、导出和***赋值语句都会立即执行(当加载该文件时,即被其他文件引用时)。如果程序遇到function 语句,它不会立即执行该函数(它的主体),而是定义它。稍后,可以通过附加括号来调用函数,例如myfn()。对于 React 组件,React“框架”会为您调用这些函数。 是的,所以调用函数不会调用位于同一文件中的所有函数

以上是关于React Native with Context API 警告:“允许需要循环,但可能导致未初始化的值......”的主要内容,如果未能解决你的问题,请参考以下文章

[React Native] Target both iPhone and iPad with React Native

[React Native] Animate Styles of a React Native View with Animated.timing

React native with UWP - 如何设置 react-native UWP 环境?

[React Native] Reduce Long Import Statements in React Native with Absolute Imports

收到此错误:错误:捆绑失败:错误:无法解析模块`react-native-safe-area-context`

[React] Recompose: Theme React Components Live with Context