React Native 全栈开发实战班 - 状态管理入门(Context API)

news2024/11/17 10:26:15

在 React Native 应用中,状态管理 是构建复杂用户界面的关键。随着应用规模的增长,组件之间的数据共享和状态同步变得越来越复杂。React 提供了多种状态管理工具,其中 Context API 是 React 内置的轻量级解决方案,适用于中小型应用或特定场景下的状态管理。

本章节将介绍如何使用 React 的 Context API 进行状态管理,包括创建 Context、提供者(Provider)和消费者(Consumer)的使用,以及在 React Native 项目中的应用示例。


3.1 Context API 简介

Context API 是 React 提供的一种在组件树中传递数据的方式,无需通过组件的 props 一层层传递。它适用于那些需要在多个组件之间共享的数据,例如主题、语言设置、用户认证状态等。

Context API 的主要组成部分:

  1. React.createContext: 创建一个 Context 对象。
  2. Provider(提供者): 提供 Context 的值。
  3. Consumer(消费者): 订阅 Context 的值。

3.2 使用 Context API
3.2.1 创建 Context

首先,需要创建一个 Context 对象,用于存储和管理全局状态。

// MyContext.js
import React from 'react';

const MyContext = React.createContext();

export default MyContext;

解释:

  • React.createContext() 创建一个 Context 对象,默认值为 undefined
  • 可以通过 MyContext.ProviderMyContext.Consumer 来使用这个 Context。
3.2.2 提供 Context 的值(Provider)

使用 Provider 组件包裹需要访问 Context 的组件,并通过 value 属性提供 Context 的值。

// App.js
import React, { useState } from 'react';
import { View, Text, StyleSheet } from 'react-native';
import MyContext from './MyContext';
import ChildComponent from './ChildComponent';

const App = () => {
  const [user, setUser] = useState('张三');

  return (
    <MyContext.Provider value={user}>
      <View style={styles.container}>
        <Text style={styles.text}>Hello, {user}!</Text>
        <ChildComponent />
      </View>
    </MyContext.Provider>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  text: {
    fontSize: 18,
  },
});

export default App;

解释:

  • MyContext.Provider 包裹需要访问 Context 的组件。
  • value 属性提供 Context 的值,这里是 user 状态。
3.2.3 消费 Context 的值(Consumer)

使用 Consumer 组件或 useContext Hook 来消费 Context 的值。

使用 Consumer 组件:

// ChildComponent.js
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
import MyContext from './MyContext';

const ChildComponent = () => (
  <MyContext.Consumer>
    {(user) => (
      <View style={styles.container}>
        <Text style={styles.text}>User: {user}</Text>
      </View>
    )}
  </MyContext.Consumer>
);

const styles = StyleSheet.create({
  container: {
    marginTop: 20,
    padding: 10,
    backgroundColor: '#f0f0f0',
    borderRadius: 5,
  },
  text: {
    fontSize: 16,
  },
});

export default ChildComponent;

使用 useContext Hook:

// ChildComponent.js
import React, { useContext } from 'react';
import { View, Text, StyleSheet } from 'react-native';
import MyContext from './MyContext';

const ChildComponent = () => {
  const user = useContext(MyContext);

  return (
    <View style={styles.container}>
      <Text style={styles.text}>User: {user}</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    marginTop: 20,
    padding: 10,
    backgroundColor: '#f0f0f0',
    borderRadius: 5,
  },
  text: {
    fontSize: 16,
  },
});

export default ChildComponent;

解释:

  • MyContext.Consumer 组件通过函数接收 Context 的值,并渲染子组件。
  • useContext Hook 更加简洁,推荐使用。

3.3 综合示例

以下是一个使用 Context API 实现主题切换的完整示例。

步骤:

  1. 创建 ThemeContext:

    // ThemeContext.js
    import React from 'react';
    
    export const themes = {
      light: {
        backgroundColor: '#fff',
        textColor: '#333',
      },
      dark: {
        backgroundColor: '#333',
        textColor: '#fff',
      },
    };
    
    export const ThemeContext = React.createContext(themes.light);
    
  2. 在 App 组件中提供 ThemeContext:

    // App.js
    import React, { useState } from 'react';
    import { View, Text, StyleSheet, Button } from 'react-native';
    import { ThemeContext, themes } from './ThemeContext';
    import ThemedView from './ThemedView';
    
    const App = () => {
      const [theme, setTheme] = useState(themes.light);
    
      return (
        <ThemeContext.Provider value={theme}>
          <View style={styles.container}>
            <ThemedView />
            <Button
              title="切换主题"
              onPress={() => setTheme(theme === themes.light ? themes.dark : themes.light)}
            />
          </View>
        </ThemeContext.Provider>
      );
    };
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
      },
    });
    
    export default App;
    
  3. 创建 ThemedView 组件消费 ThemeContext:

    // ThemedView.js
    import React, { useContext } from 'react';
    import { View, Text, StyleSheet } from 'react-native';
    import { ThemeContext } from './ThemeContext';
    
    const ThemedView = () => {
      const theme = useContext(ThemeContext);
    
      return (
        <View style={[styles.container, { backgroundColor: theme.backgroundColor }]}>
          <Text style={{ color: theme.textColor, fontSize: 18 }}>Hello, Theme!</Text>
        </View>
      );
    };
    
    const styles = StyleSheet.create({
      container: {
        padding: 20,
        borderRadius: 5,
      },
    });
    
    export default ThemedView;
    

解释:

  • ThemeContext 定义了主题相关的状态。
  • App 组件通过 ThemeContext.Provider 提供主题状态。
  • ThemedView 组件通过 useContext Hook 消费主题状态,并根据主题渲染样式。

3.4 Context API 的优缺点

优点:

  • 简单易用,内置于 React,无需引入第三方库。
  • 适用于中小型应用或特定场景下的状态管理。
  • 可以与 Redux 等其他状态管理工具结合使用。

缺点:

  • 对于大型应用,Context API 的可维护性较差。
  • 每次 Context 值变化时,所有订阅的组件都会重新渲染,可能影响性能。

总结

本章节介绍了 React 的 Context API,包括创建 Context、提供者和消费者的使用,以及在 React Native 项目中的应用示例。通过 Context API,开发者可以轻松实现组件间的状态共享和通信,适用于中小型应用或特定场景下的状态管理。


课后作业

  1. 练习使用 Context API 实现一个主题切换功能。
  2. 创建一个包含多个组件的应用,使用 Context API 共享用户认证状态。
  3. 阅读 React 官方文档,深入了解 Context API 的高级用法。

导师简介

前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!

温馨提示:可搜老码小张公号联系导师

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2242104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R门 - rust第一课陈天 -内存知识学习笔记

内存 #mermaid-svg-1NFTUW33mcI2cBGB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1NFTUW33mcI2cBGB .error-icon{fill:#552222;}#mermaid-svg-1NFTUW33mcI2cBGB .error-text{fill:#552222;stroke:#552222;}#merm…

C# x Unity 从玩家控制类去分析命令模式该如何使用

本文部分内容出自游戏编程模式一书,游戏编程模式,有兴趣的小伙伴可以去看看,虽然不是unity x c#写的 但是思路挺好的 目录 目录 0.先说结论 发现问题 命令模式如何解耦 打个断点更利于分析 怎么实现延迟命令? 如何撤销命令? 脚本整体一览 不足分析(AI) 0.先说结论 …

【C++】—— stack和queue的模拟实现

前言 ​ stack 和 queue使用起来都非常简单&#xff0c;现在来模拟实现一下&#xff0c;理解其底层的原理。 ​ 在实现之前&#xff0c;应该知道&#xff0c;stack 和 queue 都是容器适配器&#xff0c;通过看官网文件也可以看出来&#xff1b;其默认的容器都是deque&#xff…

探索高效的 Prompt 框架:RBTR 提示框架的奥秘与优势

前言 在当今数字化的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为我们生活和工作中不可或缺的一部分。而 Prompt 作为与 AI 交互的关键工具&#xff0c;其质量直接影响着我们获取信息的准确性和有用性。今天&#xff0c;我们将深入探讨一个通用的 Prompt 框架…

动态规划-完全背包问题——322.零钱兑换

1.题目解析 题目来源 322.零钱兑换——力扣 测试用例 2.算法原理 1.状态表示 这里需要寻找硬币使总面值等于一个值求出所需硬币的最小个数&#xff0c;所以不妨设置一个二维dp表&#xff0c;即dp[i][j]&#xff1a;在[1,i]个硬币中选择的硬币总面值完全等于j时所需要的最小硬…

day-82 最少翻转次数使二进制矩阵回文 I

思路 依次计算使行回文和列回文的的翻转次数&#xff0c;返回较小的次数即可 解题过程 计算行翻转次数&#xff1a;对于每一行&#xff0c;如果第一个数与最后一个数不相同&#xff08;前提前一个数的索引小于后一个数的索引&#xff09;则需翻转一次&#xff0c;将所有行翻转…

计算光纤色散带来的相位移动 matlab

需要注意的地方 1.以下内容纯属个人理解&#xff0c;很有可能不准确&#xff0c;请大家仅做参考 2.光速不要直接用3e8 m/s&#xff0c;需要用精确的2.9979.... 3.光的频率无论在真空还是光纤(介质)都是不变的&#xff0c;是固有属性&#xff0c;但是波长lambdac/f在不同的介…

15分钟学 Go 第 53 天 :社区资源与学习材料

第53天&#xff1a;社区资源与学习材料 目标 了解Go语言官方资源掌握社区重要学习平台学会利用开源项目学习构建个人知识体系 一、Go语言官方资源汇总 资源类型网址说明Go官网golang.org官方文档、下载、教程Go Blogblog.golang.org技术博客、最新特性介绍Go Playgroundpla…

丹摩征文活动 |【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解

前言 &#x1f31f;&#x1f31f;本期讲解关于HTMLCSSJavaScript的基础知识&#xff0c;小编带领大家简单过一遍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 …

【Python · PyTorch】卷积神经网络(基础概念)

【Python PyTorch】卷积神经网络 CNN&#xff08;基础概念&#xff09; 0. 生物学相似性1. 概念1.1 定义1.2 优势1.2.1 权重共享1.2.2 局部连接1.2.3 层次结构 1.3 结构1.4 数据预处理1.4.1 标签编码① One-Hot编码 / 独热编码② Word Embedding / 词嵌入 1.4.2 归一化① Min-…

机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望

文章目录 1 机器学习最初的样子1.1 知识工程诞生(专家系统)1.2 知识工程高潮期1.3 专家系统的瓶颈(知识获取)1.4 机器学习研究的初衷2 科学研究对机器学习的期望2.1 面向科学研究的机器学习轮廓2.2 机器学习及其应用研讨会2.3 智能信息处理系列研讨会2.4 机器学习对科学研究的重…

激光slam学习笔记5---ubuntu2004部署运行fastlivo踩坑记录

背景&#xff1a;看看fastlivo论文&#xff0c;觉得挺有意思的&#xff0c;就本地部署跑跑看看效果。个人环境&#xff0c;ubuntu20.04。 一、概要 由于依赖比较多&#xff0c;个人构建工作空间&#xff0c;使用catkin_make编译 src├── FAST-LIVO├── livox_ros_driver…

多模态大模型开启AI社交新纪元,Soul App创始人张璐团队亮相2024 GITEX GLOBAL

随着AI在全球范围内的加速发展和广泛应用,各行业纷纷在此领域发力。作为全球最大的科技盛会之一,2024年的GITEX GLOBAL将目光再次聚焦于人工智能的飞速发展,吸引了超过6700家来自各个领域的企业参与。在这样的背景下,Soul App作为国内较早将AI技术应用于社交领域的平台,首次亮相…

67页PDF |埃森哲_XX集团信息发展规划IT治理优化方案(限免下载)

一、前言 这份报告是埃森哲_XX集团信息发展规划IT治理优化方案&#xff0c;报告中详细阐述了XX集团如何优化IT治理结构以适应新的要求。报告还分析了集团管控模式的变化&#xff0c;提出了六大业务中心的差异化管控策略&#xff0c;并探讨了这些变化对IT治理模式的影响。报告进…

基于java Springboot高校失物招领平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

[C++] 智能指针

文章目录 智能指针的使用原因及场景分析为什么需要智能指针&#xff1f;异常抛出导致的资源泄漏问题分析 智能指针与RAIIC常用智能指针 使用智能指针优化代码优化后的代码优化点分析 析构函数中的异常问题解决方法 RAII 和智能指针的设计思路详解什么是 RAII&#xff1f;RAII 的…

Git回到某个分支的某次提交

1.切换到需要操作的分支&#xff08;<branch-name>是分支名称&#xff09;。 命令如下&#xff1a; git checkout <branch-name> 2.获取代码的提交记录 。命令如下&#xff1a; git log 按q退出当前命令对话。 获取到某次提交或者合并的hash值&#xff08;下文…

掌握 Spring Boot 的最佳方法 – 学习路线图

在企业界&#xff0c;人们说“Java 永垂不朽&#xff01;”。但为什么呢&#xff1f;Java 仍然是开发企业应用程序的主要平台之一。大型公司使用企业应用程序来赚钱。这些应用程序具有高可靠性要求和庞大的代码库。根据Java开发人员生产力报告&#xff0c;62% 的受访开发人员使…

1. Django中的URL调度器 (项目创建与简单测试)

1. 创建 Django 项目 运行以下命令创建一个名为 blog_project 的 Django 项目&#xff1a; django-admin startproject blog_project2. 创建博客应用 Django 中&#xff0c;项目可以包含多个应用。创建一个名为 blog 的应用&#xff1a; cd blog_project python manage.py …

frp内网穿透介绍安装教程

文章目录 前言一、安装二、测试使用总结 前言 内网穿透&#xff08;Port Forwarding&#xff09;是将公网上的IP地址映射到内部网络中的一台计算机的某个端口上&#xff0c;以便外部网络可以访问该计算机中运行的应用程序。内网穿透技术可以通过一些开源工具来实现&#xff0c…