React生命周期&原生通信,挺简单的

剪发的Tony 2020-03-19 13:29:06 ⋅ 652 阅读
由四张图引发的一系列事件。。。。


图片来源:https://www.yuque.com/flying.ni/the-tower/tvzasn


本文主要根据原生传参展开,顺带温故下生命周期,接下来就是Redux.

第一部分 生命周期

一、概念

在组件创建、加载运行、被销毁的过程中,总是伴随着各种各样的事件,组件在特定时期触发对应的事件,都属于组件的生命周期范畴。


生命周期的三种状态:

  • Mounting:已插入真实 DOM

  • Updating:正在被重新渲染

  • Unmounting:已移出真实 DOM


完整的生命周期如下图所示,可以在代码中,尝试一下,各个方法在什么时候会触发,触发效果是什么。


import React from "react";export default class Counter extends React.Component { constructor(props) { super(props); this.state = { count: this.props.count }; } static defaultProps = { count: 0 }; increment = () => { this.setState({ count: this.state.count + 1 }); }; // 在组件即将挂载到页面上的时候执行,此时,组件尚未挂载到页面 componentWillMount() { console.log("componentWillMount"); } // 在内存中开始渲染DOM,未展示 render() { // ⚠️在此如果更新state, 则会进入死循环 return ( <div> <h1>这是 Counter 计数器组件</h1> <input type="button" value="加1" onClick={this.increment} /> <hr /> <h3 id="content" ref="h3"> 当前的数量是:{this.state.count} </h3> </div> ); } // 判断组件是否需要更新 shouldComponentUpdate(nextProps, nextState) { console.log(nextProps, nextState); return true; } // 组件将要更新,但Dom, state还是旧的 componentWillUpdate() { console.log( "WillUpdate: " + document.getElementById("content").innerHTML + ". state: " + this.state.count ); } // 组件完成了更新,此时,state 中的数据、虚拟DOM、页面上的DOM,都是最新的 componentDidUpdate() { console.log( "DidUpdate: " + document.getElementById("content").innerHTML + ". state: " + this.state.count ); }}


第二部分 原生通信

以下示例codesandbox地址:https://codesandbox.io/s/gifted-grothendieck-2wsy3

主要实现以下功能:

  • 父子组件通过props互相传值;

  • 孙子组件通过context传参数。


一、父子组件互相传值


import React from "react";import PropTypes from "prop-types";import Son from "./Son";export default class Father extends React.Component { constructor(props) { super(props); this.state = { content: "", inputMsg: "", receiveMsg: "", contextMsg: "" }; } /** ------使用props传值----------- */ // 更改状态 inputMsg = item => { this.setState({ inputMsg: item.target.value }); }; sendMsg = () => { const text = this.state.inputMsg; this.setState({ content: text }); }; /** * 父组件将一个函数作为 props 传递给子组件, * 子组件调用该回调函数,便可以向父组件通信。 */ handleCallBack = msg => { this.setState({ receiveMsg: msg }); }; /** ------使用props传值----------- */ /** ------使用context传值----------- */ // 父组件声明自己支持 context static childContextTypes = { callback: PropTypes.func }; // 父组件提供一个函数,用来返回相应的 context 对象 getChildContext() { return { callback: this.callback.bind(this) }; } callback(msg) { this.setState({ contextMsg: msg }); } /** ------使用context传值----------- */ render() { return ( <div> <h1>父子组件互相传值</h1> <input value={this.state.inputMsg} onChange={this.inputMsg} /> <button onClick={this.sendMsg}> 传给子组件 </button> <hr /> <label> 将要发送的数据:{this.state.inputMsg} </label> <hr /> <label> 接受props方式的数据:{this.state.receiveMsg} </label> <hr /> <label> 接受Context方式的数据:{this.state.contextMsg} </label> <hr /> <Son content={this.state.content} handleCallBack={this.handleCallBack.bind(this)} /> </div> ); }}


import React from "react";import GrandSon from "./GrandSon";export default class Son extends React.Component { // 回调父组件的handleCallBack方法,向上传值 callBack = msg => { return () => { this.props.handleCallBack(msg); }; }; render() { return ( <div> // 1. 接受父组件传过来的值 <h4>子组件接受的值:{this.props.content}</h4> // 2. 向父组件传值 <button onClick={this.callBack("发送:" + this.props.content)}> 向父组件传值 </button> <hr /> <GrandSon /> </div> ); }}

二、跨级组件


import React from "react";import PropTypes from "prop-types";export default class GrandSon extends React.Component { // 子组件声明自己需要使用 context static contextTypes = { callback: PropTypes.func }; // 回调函数 cb = msg => { return () => { this.context.callback(msg); }; }; render() { return ( <div> <button onClick={this.cb("发消息")}> 孙子向爷爷发消息 。</button> </div> ); }}

总结

官方文档一看就会,一写就蒙圈。。

通过以上这两个示例,主要加深了对React的理解,将组件与数据串联起来,页面很丑,数据来凑,示例中没有数据校验与代码优化。

接下来对剩余的几张图【Redux、Dva】以示例的方式展示出来,应该快轮到antd了。



全部评论: 0

    我有话说:

    「开源资讯」React 17 正式版发布,构建用户界面 JavaScript 库

    React简介 React(有时叫React.js或ReactJS)是 Facebook 推出一个为数据提供渲染为 HTML 视图,用来构建用户界面开源 JavaScript 库。 React

    详解React组件生命周期

    原文作者:前端小知识库原文链接:https://www.toutiao.com/a6658910963296

    Fluid 0.3 正式发布:实现云原生场景通用化数据加速

    简介 为了解决大数据、AI 等数据密集型应用在云原生计算存储分离场景下,存在数据访问延时高、联合分析难、多维管理杂等痛点问题,南京大学 PASALab、阿里巴巴、Alluxio 在 2020 年

    「轻阅读」图解 Java 线程生命周期

    Java 线程生命周期中都包含哪些状态?生命周期中各个状态都是什么含义?

    简单】Docker - 实战TLS加密通讯

    快速配置一个最简单docker TLS加密通讯

    用了近10年 CentOS 6 生命周期结束

    CentOS 开发者邮件列表显示,CentOS 6 已于11月30日 EOL。   邮件还提到,CentOS 6.10 目录将在12月第一周被迁移至 vault.centos.org

    单点登录原理简单实现

    一、单系统登录机制 1、http无状态协议   web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器每一次请求,服务器会独立处理,不与之前或之后请求

    简单解析一下扫码登陆原理

    作者:写代码木公

    阿里巴巴中间件-Nacos 发布 v0.8.0 Pre-GA版本,安全稳定上生产

    服务注册和服务配置开源项目 Nacos 本周发布了 v0.8.0 Pre-GA 版本,作为开源项目生命周期里程碑版本之一

    老板要我开发一个简单工作流引擎

    第1关 一天,老板找到我,说要做个简单工作流引擎。 我查了一天啥是工作流,然后做出了如下版本: 按顺序添加任意个审批人组成一个链表,最后加一个结束节点 记录当前审批人,当审批完后,审批人向后

    滴滴开源基于 React 移动端开发组件库-Pile.js

    Pile.js 是滴滴开发基于 React 移动端开发组件库。 轻量,易用,包含 52 个交互功能,支持多语言与自定义皮肤。可以非常轻松创建用户交互界面,让前端开发更专注于业务逻辑实现。

    基于 GraalVM PHP JIT 实现性能优于原生方案

    GraalVM 是 Oracle 打造高性能跨语言虚拟机,支持运行 JavaScript、Python 3、Ruby、R、基于 JVM 语言(如 Java、Scala 和 Kotlin),以及

    分享:一次深夜优化亿级数据分页奇妙经历

    原文:https://cnblogs.com/wzh2010/p/14316920.html 背景 1月22号晚上10点半,下班后愉快坐在在回家地铁上,心里想着周末生活怎么安排。 突然电话响

    前端实战篇:JavaScript 反调试技巧简单应用(下)

    通过时间差异、DevTools检测(Chrome)、隐式流完整性控制和 代理对象来达到JavaScript反调试目

    推荐一款功能强大,开源免费H5可视化编辑器

    H5-Dooring 是一款功能强大,开源免费H5可视化页面配置解决方案,致力于提供一套简单方便、专业可靠、无限可能H5落地页最佳实践。技术栈以react为主, 后台采用nodejs开发. 预览

    React UI 库:React Suite 4.0.2 版本更新-多项Bug修复和新手入门

    React Suite 是一套 React 组件库,为后台产品而生。

    React Suite 4.8.6 版本更新,React UI 库

    React Suite 是一套 React 组件库,为后台产品而生,支持 Typescript,支持 RTL,支持服务端渲染。 文档: https://rsuitejs.com

    蚂蚁宣布开源 KubeTEE:云原生集群化机密计算框架

    蚂蚁在上海外滩大会可信原生技术论坛上宣布开源 KubeTEE。 KubeTEE 是一个云原生大规模集群化机密计算框架,旨在解决在云原生环境中 TEE 可信执行环境技术特有从开发、部署到运维整体流程