返回顶部
首页 > 资讯 > 前端开发 > JavaScript >react中context传值和生命周期详解
  • 476
分享到

react中context传值和生命周期详解

摘要

目录context传值用途Context传值优点何时使用 ContextContextapi项目案例:主题色切换。添加自定义颜色添加监听context变化类组件的生命周期假设: 项目

假设:

项目中存在复杂组件树:

context传值用途

数据是通过 props 属性自上而下(由父及子)进行传递的,但这种做法对于某些类型的属性而言是极其繁琐的(例如:地区偏好,UI 主题),这些属性是应用程序中许多组件都需要的。

Context传值优点

Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props。

何时使用 Context

Context 设计目的是为了共享那些对于一个组件树而言是“全局”的数据,例如当前认证的用户、主题或首选语言。

ContextAPI

1.React.createContext API 
功能:
创建一个 Context 对象。
//代码
//创建context对象的
import React from 'react'
let context=React.createContext();
export default context;
 
2.Context.Provider API
功能:
Provider 是context对象提供的内置组件  限定在某个作用域中使用context传值。
限定作用域传值。
 
3.Context.Consumer
context对象的内置组件
<MyContext.Consumer>
  {value => }
</MyContext.Consumer>
作用:监听订阅的context变更, 
这个函数接收当前的 context 值,返回一个 React 节点。

项目案例:主题色切换。

1.创建context.js文件
  创建context对象  用来做context传值。
//创建context对象的
import React from 'react'
export default React.createContext();
2。使用context找到限定范围使用内置组件Provider
 {}
 {}
        <ThemeContext.Provider>
          <div className="Admin">
            <div className="LeftMenu">
              <LeftMenu></LeftMenu>
            </div>
            <div className="RightContent">
              <div className="RightContent-top">
                <TopHeader></TopHeader>
              </div>
              <div className="RightContent-bottom">
                <Dashborder></Dashborder>
              </div>
            </div>
</ThemeContext.Provider>

浏览器报错:

3.在使用context的组件中进行订阅
左侧菜单组件
import React, { Component } from "react";
console.log(Component);
//引入context对象
import ThemeContext from "../components/context";
class LeftMenu extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }
  render() {
    return (
      <>
        <div>左侧菜单</div>
      </>
    );
  }
}
//class类组件存在contextType  绑定context对象
LeftMenu.contextType = ThemeContext;

组件中绑定context之后使用:

意味着订阅context组件的内部使用this.context获取。

render() {
    //获取context
    let theme = this.context;
    return (
      <>
        <div className={theme}>左侧菜单</div>
      </>
    );
  }

固定主体修改为动态主体

修改了context文件代码
//定义默认主体色
 
export const themes = {
  dark: {
    backgroundColor: "#000",
    color: "#fff",
  },
  light: {
    backgroundColor: "#fff",
    color: "#000",
  },
};
 
//创建context对象的
import React from "react";
export const ThemeContext = React.createContext();
app.js文件中获取主题,动态切换主题。使用主题变量
constructor(props) {
    super(props);
    this.state = {
      //将固定的主体设置为state状态
      themeType: "dark",//控制主体切换
      nowTheme: themes["dark"],//获取当前默认主体
    };
  }
  render() {
    //解构获取
    let { nowTheme } = this.state;
    return (
      <>
        {}
        {}
        <ThemeContext.Provider value={nowTheme}>

订阅组件中使用this.context获取订阅

render() {
    //获取context
    let { backgroundColor, color } = this.context;
    return (
      <>
      //直接绑定行内CSS
        <div style={{ backgroundColor: backgroundColor, color: color }}>
          左侧菜单
        </div>
      </>
    );
  }

用户点击其他组件修改主题的按钮来变更主题

注意:不能直接使用this.context修改变量值
//可以在provider组件上 value中携带修改函数传递。在订阅组件中获取修改方法,执行反向传递值。
//修改主题变量方法
  changeTheme(type) {
    console.log("测试", type);
    this.setState({ themeType: type, nowTheme: themes[type] });
  }
  render() {
    //解构获取
    let { nowTheme } = this.state;
    return (
      <>
        {}
        {}
        <ThemeContext.Provider
          value={{ ...nowTheme, handler: this.changeTheme.bind(this) }}
        >
          <div className="Admin">
            <div className="LeftMenu">
              <LeftMenu></LeftMenu>
            </div>
            <div className="RightContent">
              <div className="RightContent-top">
                <TopHeader></TopHeader>
              </div>
              <div className="RightContent-bottom">
                <Dashborder></Dashborder>
              </div>
            </div>
          </div>
        </ThemeContext.Provider>
      </>
    );
 //在订阅组件中直接使用
 //修改主题的方法
  change(themeType) {
    console.log(themeType);
    //获取provider传递方法
    let { handler } = this.context;
    handler(themeType);
  }
  render() {
    let { themeButton } = this.state;
    return (
      <>
        <div>
          <span>主题色:</span>
          <div>
            {}
            {themeButton.map((item, index) => {
              return (
                <button key={index} onClick={this.change.bind(this, item.type)}>
                  {item.name}
                </button>
              );
            })}
          </div>
        </div>
      </>
    );

添加自定义颜色

 {}
          背景色:
          <input
            type="color"
            name="selectbGColor"
            value={selectbgColor}
            onChange={this.changeColor.bind(this)}
          />
          字体色:
          <input
            type="color"
            name="selectColor"
            value={selectColor}
            onChange={this.changeColor.bind(this)}
          />
          <button onClick={this.yesHandler.bind(this)}>确认</button>
   //代码区域操作事件向父级传递参数
     //确认修改
  yesHandler() {
    let { myhandler } = this.context;
    let { selectbgColor, selectColor } = this.state;
    console.log(selectbgColor, selectColor);
    myhandler(selectbgColor, selectColor);
  }

添加监听context变化

 {}
          <ThemeContext.Consumer>
            {(value) => {
              let { backgroundColor, color } = value;
              return (
                <>
                  <span>背景色:{backgroundColor}</span>
                  <span>文字色:{color}</span>
                </>
              );
            }}
          </ThemeContext.Consumer>

类组件的生命周期

组件生命周期解释:组件初始化到销毁整个过程。

生命周期三类:

  • Mounting(挂载):已插入真实 DOM
  • Updating(更新):正在被重新渲染
  • Unmounting(卸载):已移出真实 DOM
第一个阶段:
代码演示第一个阶段初始化挂载阶段
import React, { Component } from "react";
 
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {};
    console.log("初始化");
  }
  componentDidMount() {
    console.log("挂载完成");
  }
  render() {
    console.log("渲染");
    return (
      <>
        <div>测试</div>
      </>
    );
  }
}
 
export default App;

添加了挂载之前周期

 UNSAFE_componentWillMount() {
    console.log("挂载之前");
  }
 //18.x 版本中UNSAFE_ 前缀

第二个阶段:更新阶段
能触发类组件更新  props state

添加了更新之前周期

componentWillUpdate() {
    console.log("更新之前");
}

第三阶段卸载:

 //卸载周期
  componentWillUnmount() {
    console.log("组件卸载");
  }

常用周期:

测试完成之后:18版本直接使用周期以上三个。

react推荐网络请求在componentDidMount
卸载清除副作用   componentWillUnmount

确认当前组件是否更新周期

//确认是否更新周期
  //必须带返回值  true  false
  //提升性能
  shouldComponentUpdate(nextProps, nextState, nextContext) {
    console.log(nextProps);
    if (nextProps.name == this.props.name) return false;
    else return true;
  }
  不写该周期默认是执行更新
1.componentWillMount() - 在染之前执行,在客户端和服务器端都会执行.
2.componentDidMount() - 是挂在完成之后执行一次
3.componentWillReceiveProps() - 当从父类接收到 props 并且在调用另一个渲染器器之前调用。4.shouldComponentUpdatel) -根据特定条件返回 true 或 false如果你希望更新组件,请返回true 否则返它返回 false。
5.componentWillUpdate() - 是当前组件state和props发生变化之前执行
6.componentDidUpdate()-是当前组件state和props发生变化执行
7.componentWillUnmount0) - 从 DOM 卸载组件后调用。用于清理内存空间

到此这篇关于react中context传值和生命周期的文章就介绍到这了,更多相关react context传值和生命周期内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: react中context传值和生命周期详解

本文链接: https://lsjlt.com/news/200430.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • react中context传值和生命周期详解
    目录context传值用途Context传值优点何时使用 ContextContextAPI项目案例:主题色切换。添加自定义颜色添加监听context变化类组件的生命周期假设: 项目...
    99+
    2023-03-19
    react context传值和生命周期 react 生命周期 react context传值
  • react中context传值和生命周期源码分析
    本篇内容主要讲解“react中context传值和生命周期源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“react中context传值和生命周期源码分析”吧!假设:项目中存在复杂组件树:...
    99+
    2023-07-05
  • React中的生命周期详解
    目录react生命周期常用的生命周期不常用的生命周完整的生命周期图react生命周期 函数组件无生命周期,生命周期只有类组件才拥有 生命周期函数指在某一时刻组件会自动调用并执行的函数...
    99+
    2024-04-02
  • React的生命周期详解
    一、React生命周期 React 生命周期分为三种状态 1. 初始化2.更新3.销毁 初始化 1、getDefaultProps() 设置默认的props,也可以用dufault...
    99+
    2024-04-02
  • React组件的生命周期详解
    目录React生命周期1、初始化阶段2、旧生命周期3、新生命周期4、react中性能优化的方案React生命周期 1、初始化阶段 componentDidMount:render之前...
    99+
    2023-03-19
    React 组件 生命周期 React 生命周期
  • React中的生命周期和子组件
    目录组件生命周期创建创建期获取虚拟DOM子组件组件生命周期 为了说明组件的创建,存在,销毁的过程,react提供了组件的生命周期,共分三大周期: 创建期:说明组件的创建的过程,相当于...
    99+
    2024-04-02
  • Vue生命周期详解
    这篇博客将会从下面四个常见的应用诠释组件的生命周期,以及各个生命周期应该干什么事 单组件的生命周期父子组件的生命周期兄弟组件的生命周期宏mixin的生命周期 生命周期:Vue 实例从...
    99+
    2024-04-02
  • rust生命周期详解
    目录rust生命周期借用检查函数中的生命周期手动声明生命周期结构体中的生命周期生命周期消除三条消除原则生命周期约束静态生命周期rust生命周期 生命周期是rust中用来规定引用的有效...
    99+
    2023-03-19
    rust生命周期
  • 详解vue生命周期
    目录为什么要理解生命周期什么是生命周期生命周期钩子函数created和mounted钩子的一些实战用法1.异步函数 2.Vue.nextTick对异步函数的结果进行操作 总结为什么要...
    99+
    2024-04-02
  • React中state属性和生命周期的使用
    目录一、React组件的state属性和生命周期1、state的定义2、更新状态(state)3、组件的生命周期(1)挂载(mount)(2)案例(隐藏或显示实时更新的计时器)(3)...
    99+
    2023-02-12
    React state属性 state生命周期 React生命周期
  • Android Activity生命周期详解
    Activity 的生命周期。 一、理解Activity Activity是Android程序的4大组件之一。 Activity是Android程序的表示层。程序的每一个显...
    99+
    2022-06-06
    activity生命周期 activity Android
  • Android Service生命周期详解
    引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁。在这期间,他们有时候处于激活状态,有时候处于非激活状 态;对于活动,对用户有时...
    99+
    2022-06-06
    android service service service生命周期 Android
  • 《Android》Activity生命周期详解
    1、什么是Activity的生命周期? 用户在使用一个应用程序时,随着应用的启动、页面的跳转、进入后台等一些操作的发生,Activity会回调一...
    99+
    2022-06-06
    activity生命周期 activity Android
  • 详解uniapp的生命周期
    Uniapp作为一款跨平台应用开发框架,具有丰富的生命周期,以下是Uniapp的生命周期: 1.应用生命周期 应用生命周期是指应用程序从启动到关闭的整个过程,包括应用程序的启动、前后...
    99+
    2023-05-17
    vue uniapp uniapp生命周期
  • JavaWEB中Servlet的生命周期详解
    目录一、什么是Servlet 生命周期?二、Servlet 是由谁来维护的?三、Servlet 对象 是什么时候创建的?四、测试 Tomcat 什么时候被销毁?总结一、什么是Serv...
    99+
    2024-04-02
  • Spring 中 Bean 的生命周期详解
    目录前言1.Bean 生命周期2.代码演示总结前言 Java 中的公共类称之为 Bean 或 Java Bean,而 Spring 中的 Bean 指的是将对象的生命周期,交个 Sp...
    99+
    2024-04-02
  • Java中Servlet的生命周期详解
    目录Web基础和HTTP协议什么是ServletServlet的生命周期Web基础和HTTP协议 ┌─────────┐ ┌──────...
    99+
    2024-04-02
  • React组件的生命周期详细描述
    目录一、什么是生命周期二、装载过程1、constructor2、render3、componentWillMount和componentDidMount三、更新过程1、compone...
    99+
    2024-04-02
  • 详解Vue生命周期和MVVM框架
    目录生命周期与动态组件有关的两个特殊的钩子:与组件异常捕获有关的一个钩子:生命周期有哪些生命周期 组件从开始到结束的全过程 创建阶段:beforeCreate、created挂载阶段...
    99+
    2024-04-02
  • Flutter组件生命周期和App生命周期示例解析
    目录引言无状态组件(StatelessWidget)有状态组件(StatefulWidget)StatefulWidget生命周期详细分析1. createState2. initS...
    99+
    2022-12-08
    Flutter 组件APP生命周期 Flutter 生命周期
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作