React Native:放置全局状态变量的位置

2024-01-17

我正在开发我的第一个 React Native,我再次需要一些帮助。 我的应用程序有一种状态 - 运动,这对于组件、屏幕等非常重要。根据所选的运动,我也会加载不同的样式、图像和 api 信息。 将有一个模式,用户可以从中更改运动。模式现在是 Header 组件的一部分,而 Header 组件又是 Screen 组件的一部分。

所以我的问题是如何或在哪里放置这个运动状态变量,这样我就可以在任何地方访问它并进行更改以更新新样式等。

该应用程序的概述如下:

App.js

    import AppContext from './utility/context';
    
    export default function App() {
        
          const [sport, setSport] = React.useState('soccer');
          const state = {sport, setSport};
        
          return (
             <AppContext.Provider sport={state}>
                <OfflineNotice />
                <Screen />
             </AppContext.Provider>
          );
        }

上下文.js

import React from "react";

export const AppContext = React.createContext({
    sport: 'soccer', 
    setSport: () =>{}
});

屏幕.js

export default function Screen ({children}) {
    return (
        <>
        <Header />
        <SafeAreaView style={styles.screen}>
            <View style={styles.container}>{ children }</View>
        </SafeAreaView>
        <TabNavigator i18n={i18n}/>
        </>
    );
}

在 Header.js 中,我还将使用该未来状态,但目前没有什么有趣的。 但这里将是视图,用户可以从中更改运动状态变量。

HomeScreen.js - 它是 TabNavigator 的第一个屏幕

export default function HomeScreen({ navigation }) {

  const today = Moment(new Date().getTime()).format('YYYY-MM-DD');
  const [predictions, setPredictions] = useState([]);
  const [loading, setLoading] = useState(true);
  const params = {
    lang: 'en',
    date: today,
    sport: 'soccer',
  };

  ...

}

这里的运动状态是硬编码的,因为我还不知道如何继续。

我听说过 Redux,但我还没有使用它,所以如果有任何不使用 Redux 的解决方案,我将不胜感激。

先感谢您!


您可以使用以下方法实现此目的反应上下文 https://reactjs.org/docs/context.html

您可以简单地在 app.js 中拥有一个状态,并使用上下文在应用程序中任何需要的地方访问它。

首先您需要创建上下文。如果是单独的文件就更好了

const AppContext = React.createContext({sport:'value',setSport=()=>{}});

这里的默认值是选项,但当您使用打字稿以避免警告时特别推荐。

现在你必须在你的 app.js 中使用它,如下所示

export default function App() {
  const [sport,setSport] = React.useState('value');
  
  const state={sport,setSport};
  ...

  return (
    <AppContext.Provider value={state}>
      <OfflineNotice />
      <Screen />
    </AppContext.Provider>
  );
}

您必须导入上下文并使用提供程序作为包装器,设置您拥有的本地状态的值。现在您可以在树中的任何位置访问它并根据需要进行修改。

// 使用 useContext 钩子访问上下文,该组件应该位于树中,并且您应该导入 AppContext

const {sport,setSport} = useContext(AppContext);

你可以像下面这样显示它

<Text>{sport}</Text>

或者像下面这样设置

<Button title="Set Value" onPress={()=>{setSport('value')}}>

这个例子只是一个字符串,但你甚至可以有一个对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Native:放置全局状态变量的位置 的相关文章

随机推荐

  • 在没有 React.memo 的情况下使用 useCallback 有什么好处吗?

    根据我从 React 文档和网络上其他材料中了解到的 useCallback 用于通过确保将回调的记忆版本传递给子组件来避免重新渲染子组件 因此子组件的引用属性保持相同 但只有当我在子组件上使用 React memo 时 所有这些才有效 如
  • Clang、GCC 和 LTO 之间的互操作性

    我知道 Clang 和 GCC 或多或少是兼容的 C C 编译器 只要处理好架构标志 预定义和链接正确的库之类的事情 使用一个编译器创建库并将它们与另一个编译器创建的对象链接实际上非常简单 至少在 x86 上 这是一个小测试项目 正是这样做
  • 同步 XHR 弃用

    根据XHR规格 https xhr spec whatwg org async false已被弃用 现代用户代理应该开始警告甚至抛出异常 工作人员外部的同步 XMLHttpRequest 正在从 Web 平台中删除 因为它会对最终用户的体验
  • Doctests:如何抑制/忽略输出?

    以下 废话 Python 模块的 doctest 失败 gt gt gt L gt gt gt if True append to L XXX gt gt gt L 1 def append to L L append 1 class A
  • Android:getMainLooper() 和 Looper.myLooper() 之间的区别

    我现在正试图复兴一个项目 getMainLooper 出现异常 我认为MainLooper初始化可能有问题 并在此之前添加了Looper prepareMainLoop 异常告诉我该对象已经有一个循环器被抛出 然后我尝试用 Looper m
  • 正则表达式允许一组字符并禁止其他字符

    我想限制用户在字段中输入以下特殊字符 Newline Carriage return 更多内容将添加到此列表中 但我最终将获得完整的限制列表 但他可以输入某些外来字符 例如 除了字母数字字符 通常的特殊字符等之外 有没有一种简单的方法来构建
  • 如何在批处理脚本中将日期和时间插入文件名? [复制]

    这个问题在这里已经有答案了 我为 Jenkins 作业编写了一个批处理脚本 该脚本编译 net 代码 步骤之一是在提取新的编译代码之前备份当前目录 我使用这些行来提取要插入到备份文件名中的日期和时间 for F tokens 2 4 del
  • Spring @Configuration(非xml配置)用于注解驱动的任务

    谁能解释如何使用 Scheduled 注释实现任务的基本配置而不需要任何 XML 配置 我能找到的所有示例都至少使用最少的 XML 配置 例如 http blog springsource com 2010 01 05 task sched
  • 如何迭代 C++ 字符串向量?

    如何迭代这个 C 向量 vector
  • 使用作用域时依赖注入的顺序

    我目前正在尝试找出 Dagger 2 我正在尝试设置 4 个范围 App User Activity Fragment 用户和活动组件是应用程序的子组件 Fragment是一个以Activity为依赖的组件 假设我的 UserSetting
  • 是否有使用 ASP.NET MVC 5 Html.EditorFor() 和 Bootstrap 3.0 的解决方案?

    问题 有没有办法让 ASP NET MVC 5 Html EditorFor 表单助手使用更改后的内容Bootstrap 3 表单语法 http getbootstrap com css forms 讨论 我已经研究过的 似乎有很多关于重写
  • Python 重写 getter 而不使用 setter

    class human object def init self name self name name property def name self return self name name setter def name self v
  • 重建 Android Instant App 后,使用功能模块中基本模块中定义的颜色失败

    我有一个base模块和一个名为的功能模块query我的即时应用程序项目中的模块 My QueryActivity inside query模块使用的颜色是base module 查询活动 kt https github com mustaf
  • 分发定制 iPhone 应用程序的正确方法是什么?

    我开发了一些应用程序商店应用程序 但最近中小型公司问我是否有兴趣开发定制应用程序 我发现与 Apple 的许可和合同有点令人困惑 至少可以说 开发人员可以制作 3 种类型的构建 应用商店 Ad Hoc 企业 不需要应用程序商店 因为这些是私
  • 在 R-markdown 中显示 tibble 的所有行和列

    我正在处理 R markdown 文件 分析结果以以下形式显示tibble但为了查看所有列和行 我需要单击展开 但是 由于我要将文件编织成 html 因此我需要显示 R markdown 文件中的所有列和行 我进行了搜索并提出了以下代码 o
  • 如果 hash['a'] 不存在,如何分配 hash['a']['b']= 'c' ?

    有没有比更简单的方法 if hash key a hash a b c else hash a hash a b c end 最简单的方法是构建你的哈希 http ruby doc org core Hash html method c n
  • css-transform 动画导致闪烁

    我的代码在这里http jsfiddle net JaB5S http jsfiddle net JaB5S 您可以单击蓝色页面来运行动画 但无论何时 您都可以看到文本闪烁 直到动画完成 右侧的文字甚至消失了 我在某处读到过backface
  • 如何知道 Spring.NET 根上下文何时加载?

    我正在运行一个 Web 服务 它使用 Spring NET 来实现 IoCness 其中一个类需要在加载时执行一些操作 我正在使用AfterPropertiesSet 和 一些东西 涉及调用ContextRegistry GetContex
  • 不包含名为的导出

    我正在尝试将一个简单的组件导入到我的 React 中 我无法找到该组件 导入组件时出现以下错误 src App js 61 28 32 componentes Menu 不包含导出 名为 菜单 这是我的简单组件 import React C
  • React Native:放置全局状态变量的位置

    我正在开发我的第一个 React Native 我再次需要一些帮助 我的应用程序有一种状态 运动 这对于组件 屏幕等非常重要 根据所选的运动 我也会加载不同的样式 图像和 api 信息 将有一个模式 用户可以从中更改运动 模式现在是 Hea