React的生命周期及Redux状态管理器等

news2025/1/16 6:02:58

生命周期

一个应用或页面从创建到消亡过程中某一时刻自动调用的回调函数称为生命周期钩子函数

挂载

  • constructor :来初始化函数内部 state,为 事件处理函数 绑定实例
  • render:渲染 DOM
  • componentDidMount:组件挂载、DOM 渲染完后,可以发送网络请求并进行 DOM 操作

更新

  • shouldComponentUpdate:组件更新之前调用,可以控制组件是否进行更新, 返回true时组件更新, 返回false则不更新。它包含两个参数,第一个是即将更新的 props 值,第二个是即将更新后的 state 值,可以根据更新前后的 props 或 state 来比较加一些限制条件,决定是否更新,进行性能优化
  • render
  • componentDidUpdate:会在更新后会被立即调用,首次渲染不会执行。包含三个参数,第一个是上一次 props 值。 第二个是上一次 state 值。如果组件实现了 getSnapshotBeforeUpdate() 生命周期(不常用),第三个是 snapshot 参数传递

卸载

  • componentWillUnmount:组件即将被卸载或销毁时进行调用。可以进行取消网络请求、移除监听事件、清理 DOM 元素、清理定时器等操作

从以上生命周期的对比,我们不难看出,React 从 v16.3 开始废弃 componentWillMountcomponentWillReceivePropscomponentWillUpdate 三个钩子函数。

目前 React 为这几个生命周期钩子提供了别名,分别是:

  • UNSAFE_componentWillMount
  • UNSAFE_componentWillReceiveProps
  • UNSAFE_componentWillUpdate

为什么函数式组件没有生命周期!!!!!!!!

函数式组件没有state也没有生命周期。因为他没有继承React.Component ,所以也不需要render()。如果需要使用到生命周期,那么就可以模拟一个什么周期。

【注】

React.PureComponent 与 React.Component:

  • Component 没有直接实现 shouldComponentUpdate 这个方法,需要手动实现,而 PureComponent 通过浅层的 porps 和 state 的对比,内部实现了这个生命周期函数。
  • 如果你的组件 render 函数渲染时具有相同的 props 和 state,那么可以使用 PureComponent 来提高性能。
  • 但 PureComponent 可能会因深层的数据不一致而产生错误的否定判断,从而shouldComponentUpdate 结果返回 false,界面得不到更新。而且PureComponent不仅会影响本身还会影响子组件,所以最好用在数据展示中。

props的传参校验

React 中的 props 传值校验,需要依赖插件,所以需要 npm i prop-types,在引入校验函数 PropTypes

import React from "react";
import PropTypes from 'prop-types'
export default class App extends React.Component{
    constructor(props) {
        super(props)
        this.state={}
    }
    // React中的props传值校验,需要依赖插件
    // 所以需要 npm i prop-types,在引入校验函数 PropTypes
    render() {
        return (
            <div>
                <h1>React中props传值校验</h1>
                <h2>{this.props.number}</h2>
                <h2>{this.props.array}</h2>
                <h2>{this.props.string}</h2>
                <h2>{ this.props.bool.toString() }</h2>
            </div>
        )
    }
}
//传参校验
App.propTypes = {
    number: PropTypes.number,
    array: PropTypes.array,
    string: PropTypes.string,
    bool:PropTypes.bool
}
//默认配置
App.defaultProps = {
    number:10000
}

组件渲染传递 RenderProps 的高级复用

RenderProps 概念:将组件的 props 渲染出来。实际上是让组件的 props 接收函数,由函数来渲染内容。将通用的逻辑抽象在该组件的内部,然后依据业务逻辑来调用函数(props内渲染内容的函数),从而达到重用逻辑的目的。

子组件

import React from "react";
// 组件渲染传递renderprops的高级复用
export default class App extends React.Component{
    constructor(props) {
        super(props)
        this.state = {
            x: 0,
            y:0
        }
    }
    moveFn = (e) => {
        this.setState({
            x: e.clientX,
            y:e.clientY
        })
    }
    //渲染完成生命周期钩子函数
    componentDidMount() {
     window.addEventListener('mousemove',this.moveFn)   
    }
    render() {
        return this.props.fn(this.state)
    }
}

父组件

root.render(


    <App3
      fn = {(a)=> <div><img
      src='https://ftp.bmp.ovh/imgs/2021/06/0b6cb6a38f3fdde5.png'
      style={{
          position:'absolute',
          top:a.y-100,
          left:a.x-100
      }} />
      </div>}
 
    />


);

Redux状态管理器

原理:把数据都放在 store 公共存储空间,一个组件改变了 store 里的数据内容,其他组件就能感知到 store 的变化,再来取数据,从而间接的实现了这些数据传递的功能。

工作流程:React Component 需要获取一些数据, 然后它就告知 Store 需要获取数据,这就是就是Action Creactor , Store 接收到之后去 Reducer 查一下, Reducer 会告诉 Store 应该给这个组件什么数据

Redux的核心

  • store:store是redux的核心,整个redux的仓库。
  • createStore:可以帮助创建 store,里面有三个参数(reducer,中间件,初始值)
  • reducer:是一个纯函数,不需要直接修改 state,派发action 之后,可以通过store.subscrible监听 store 的变化。相当于数据加工用于数据管理的逻辑,里面有两个参数(state,action)。
  • action:本质是一个对象,用来告诉 redux 要执行什么任务。
  • state:存储 redux 的数据。
  • store.dispatch:更改 store  里面数据,是通过 dispatch 来派发 action,通常 action 中都会有type 属性,也可以携带其他的数据。
  • store.getState:获取 store 里边所有的数据内容。
  • store.subscrible:订阅 store 的改变,只要 store 发生改变, store.subscrible 这个函数接收的这个回调函数就会被执行,进行视图更新。

index.js文件

import { createStore } from 'redux' // 引入createStore方法
import reducer from './reducer'

const store = createStore(reducer)// 创建数据存储仓库

export default store //暴露出去

reducer.js文件

// 全局数据商店管理的  操作函数 以及默认数据
const defaultState = {
   
}
export default (state = defaultState, action) => {
     return state
}

component组件中使用

import React from "react";
import store  from "./store/index";
import { Input, Button, List } from "antd";

class TodoList extends React.Component{
    constructor(props) {
        super(props)
        //将redux中的默认defaultState传给当前state
        this.state =  {
            inputValue: '',
            data:[]
        }
    }

    //监测input中变化,进行双向数据绑定
    changeInputValue = (e) => {
        const action = { type: 'changeInput', value: e.target.value }
        store.dispatch(action)
    }

    //在生命周期函数中监测state的变化
    componentDidMount() {
        var NewInputValue = store.getState().inputValue
        var NewData = store.getState().data
        this.setState({
            inputValue: NewInputValue,
            data:NewData
        })
        store.subscribe(this.storeChange)
    }
    //当state中的数据变化的时候调用该函数重新渲染,更新redux中的数据
    storeChange = () => {
        var NewInputValue = store.getState().inputValue
        var NewData = store.getState().data
        
        this.setState({
            inputValue: NewInputValue,
            data:NewData
        })
    }

    //添加
    add = () => {
        const action = { type: 'add' }
        store.dispatch(action)
    }

    //删除
    deleteItem = (index) => {
        const action = { type: 'delete', index: index }
        store.dispatch(action)
    }

    render() {
        return (
            <div style={{ margin: '20px' }}>
                <div>
                    <Input
                        placeholder="请输入" 
                        style={{ width: '250px', marginRight: '10px' }}
                        value={this.state.inputValue}
                        onChange={this.changeInputValue}
                    />
                    <Button type="primary" onClick={this.add}>增加</Button>
                </div>
                <div
                    style={{ margin: '10px',width:'500px'}}>
                    <List
                        bordered
                        dataSource={this.state.data}
                        renderItem={(item,index) => (<List.Item>{item} <Button                     
                        type="primary" danger size="small" 
                        style={{float:'right'}} 
                        onClick={this.deleteItem.bind(this,index)}>删除</Button>        
                        </List.Item>)}
                    />
                </div>
            </div>
        )
    }
}

export default TodoList

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

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

相关文章

V8 JavaScript引擎

简介 V8 (v8.dev)是 Google 的开源高性能 JavaScript 和 WebAssembly 引擎&#xff0c;用 C 编写。它用于 Chrome 和 Node.js 等。它实现了 ECMAScript 和 WebAssembly&#xff0c;并运行在 Windows 7 或更高版本、macOS 10.12 以及使用 x64、IA-32、ARM 或 MIPS 处理器的 Lin…

FFmpeg HEVC 解码 YUV

1. 概要与流程图 1.1 FFmpeg 支持 h264,hevc 等解码,由于分离视频文件为 hevc 格式,为了方便起见,当前解码的格式为 hevc,代码支持各种视频格式解码,需要修改参数和适配 1.2 HEVC 解码 YUV 流程图如下: 2. 封装读写文件操作 2.1 读写头文件,FileTool.h #import <Fou…

MAC常用操作

1. 添加环境变量 vi ~/.bash_profile export PATHselfdefine_path:$PATH source ~/.bash_profile适用于安装Application之后将该Application的Contents/bin下的可执行程序添加到环境变量&#xff0c;使得在终端能够启用。 例如使用cmake-3.25.0-macos-universal.dmg安装好cmak…

基于微信小程序网上书城系统

开发工具&#xff1a;IDEA、微信小程序 服务器&#xff1a;Tomcat8.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;vue、uniapp 服务端技术&#xff1a;springspringmvcmybatis(ssm框架) 本系统分微信小程序和管理后…

双向链表(数据结构)(C语言)

目录 概念 带头双向循环链表的实现 前情提示 双向链表的结构体定义 双向链表的初始化 关于无头单向非循环链表无需初始化函数&#xff0c;顺序表、带头双向循环链表需要的思考 双向链表在pos位置之前插入x 双向链表的打印 双链表删除pos位置的结点 双向链表的尾插 关…

Windows命令提示行使用指南一

命令提示行使用指南 前言一、起源和发展二、和DOS的关系三、常用命令 前言 cmd 是 Windows 操作系统中的命令行界面&#xff08;CLI&#xff09;&#xff0c;也称为命令提示符&#xff08;CMD&#xff09;或批处理文件。它是 Windows 命令行界面的主要组成部分&#xff0c;用于…

《Linux 内核设计与实现》07. 中断和中断处理

文章目录 注册中断处理程序释放中断处理程序编写中断处理程序共享的中断处理程序中断例程实例 中断上下文/proc/interrupts中断控制禁止和激活中断禁用指定中断线中断系统的状态 注册中断处理程序 // 分配一条给定的 irq 中断线 request_irq(unsigned int irq, irq_handler_t …

『python爬虫』13. 视频地址防盗链实战案例(保姆级图文)

目录 1. 寻找视频真实url地址&#xff08;视频地址被加密了&#xff09;2. 防盗链中的来源判断完整代码总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 1. 寻找视频真实url地址&#xff08;视频地址被加密了&am…

【刷题笔记】不要二+把字符串转换为整数

一、不要二 题目&#xff1a; 牛客网链接&#xff1a;不要二_牛客题霸_牛客网 描述 二货小易有一个W*H的网格盒子&#xff0c;网格的行编号为0~W-1&#xff0c;网格的列编号为0~H-1。每个格子至多可以放一块蛋糕&#xff0c;任意两块蛋糕的欧几里得距离不能等于2。 对…

camunda表达式如何使用

在Camunda中&#xff0c;表达式是一种灵活的方式&#xff0c;可以用于在流程定义和表单中计算和处理数据。表达式可以在Camunda的各个环节中使用&#xff0c;例如服务任务、网关、表单、条件等。 以下是Camunda表达式的一些常见用途&#xff1a; 1、计算值&#xff1a;表达式可…

腾讯云轻量16核32G28M带宽服务器CPU流量性能测评

腾讯云轻量16核32G28M服务器3468元15个月&#xff0c;折合每月231元&#xff0c;28M公网带宽下载速度峰值可达3584KB/s&#xff0c;折合3.5M/秒&#xff0c;系统盘为380GB SSD盘&#xff0c;6000GB月流量&#xff0c;折合每天200GB流量。腾讯云百科来详细说下腾讯云轻量应用服务…

SeaweedFS学习笔记:架构和快速入门

目录 1. 介绍1.1 Components1.2 Master 服务1.3 Volume 服务1.4 Filer服务1.5 S3服务1.6 Volume的概念1.7 Collection的概念 2. 快速入门2.1 安装 SeaweedFS2.2 启动 Master 服务2.3 启动 Volume 服务2.4 快速启动一个Master服务和一个Volume服务2.5 测试 3. 参考 1. 介绍 1.1 …

asp.net汽车保养美容店维修管理系统

本系统汽车预约美容系统分为前台和后台两部分&#xff0c;具体功能如下 前台部分功能 1.注册登录&#xff0c;用户通过注册登录之后可以进行保养和美容项目的预约 2.新闻资讯&#xff0c;查看和汽车保养&#xff0c;美容相关的新闻资讯信息 3.美容查看&#xff0c;查看汽车美容…

6年测开经验,从功能测试到测试开发,每一步都深思熟虑...

蓦然回首&#xff0c;软件测试风风雨雨的这几年&#xff0c;起初每天的工作只是鼠标点点点&#xff0c;我还真不知道怎么办&#xff0c;闲的时候真的怀疑自己的存在价值&#xff0c;每天拿着7000的工资&#xff0c;飘荡在繁华的深圳&#xff0c;吃不饱也饿不死&#xff0c;未来…

【PWN · ret2libc】ret2libc1

ret2libc的第一题 目录 前言 一、动态链接 二、ret2libc原理 三、exp编写 干货 干货一&#xff1a;python下的ELF 干货二&#xff1a;strings看看有没有待选字符串 编写exp 总结 前言 本来是和学习ret2text\ret2shellcode\ret2syscall一样在网上找文字资源&#x…

28从零开始学Java之面向对象和面向过程到底有哪些区别?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 壹哥相信&#xff0c;经过你对前面文章中技术点的学习&#xff0c;现在的你应该已经对Java具备了初步…

【UE】直升机沿样条线移动

效果 步骤 1. 将虚幻商城中的免费资产导入工程 下载完毕后可以看到如下文件 2. 新建一个Actor蓝图类&#xff0c;命名为“Track”&#xff0c;这个蓝图就是用来画样条线的 打开“Track”&#xff0c;添加样条组件 3. 打开“BP_West_Heli_AH64D” 在事件图表中先新建一个时间轴…

Unity冷知识:读取用户输入应该写在Update还是FixedUpdate里?

Unity冷知识&#xff1a;读取用户输入应该写在Update还是FixedUpdate里&#xff1f; 版权声明&#xff1a; 本文为“优梦创客”原创文章&#xff0c;您可以自由转载&#xff0c;但必须加入完整的版权声明文章内容&#xff0c;不得删减、修改、演绎相关学习资源见文末 一些人…

1.SpringCloud技术

SpringCloud01 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

初识C++之线程库

目录 一、C中的线程使用 二、C的线程安全问题 1. 加锁 2. 变为原子操作 3. 递归里面的锁 4. 定时锁 5. RAII的锁 三、条件变量 1. 为什么需要条件变量 2. 条件变量的使用 2.1 条件变量的相关函数 2.2 wait函数 一、C中的线程使用 线程的概念在linux中的线程栏已经…