React组件化一

2023-11-06

29.9React课程

第02节:react组件化

第2节:02课react组件化

(02课react组件化&)

02课react组件化

初始化显示constructor构造函数,要使用super(),否则没法在内部使用this

2与3之间要对组件进行渲染

componentWillReceiverProps父组件传递的属性发生变化时执行

接收新的props和新的state

state发生更新,shouldComponentUpdate才会被激活,接收当前最新的props和state默认返回值是true

执行完render之后执行DidUpdate

如果为true返回后面内容,如果为false不展示child要执行willunMount

import React, { Component } from "react";

class Child extends React.Component {
  componentWillReceiveProps(nextProps, nextState) {
    // 父组件传递的属性有变化,做相应响应
    console.log(nextProps, nextState, "4.将要接收属性传递");
  }
  componentWillUnmount() {
    // 组件将要卸载, 可做清理工作
    console.log("8.组件将要卸载");
  }
  render() {
    return <div>hello child</div>;
  }
}

export default class Lifecycle extends Component {
  constructor(props) {
    super(props);
    // 常用于初始化状态
    this.state = {
      counter: 0,
      isShow: true
    };
    console.log("1.组件构造函数执行");
  }
  componentWillMount() {
    // 此时可以访问状态和属性,可进行api调用等
    console.log("2.组件将要挂载");
  }
  componentDidMount() {
    // 组件已挂载,可进行状态更新操作
    console.log("3.组件已挂载");
    setTimeout(() => {
      this.setState({
        isShow: false
      });
    }, 3000);
  }
  componentWillReceiveProps(nextProps, nextState) {
    // 父组件传递的属性有变化,做相应响应
    console.log("4.将要接收属性传递");
  }
  shouldComponentUpdate(nextProps, nextState) {
    // 组件是否需要更新,需要返回布尔值结果,优化点
    console.log("5.组件是否需要更新?");
    return true;
  }
  componentWillUpdate() {
    // 组件将要更新,可做更新统计
    console.log("6.组件将要更新");
  }
  componentDidUpdate() {
    // 组件更新
    console.log("7.组件已更新");
  }
  componentWillUnmount() {
    // 组件将要卸载, 可做清理工作
    console.log("8.组件将要卸载");
  }
  add = () => {
    this.setState({
      counter: this.state.counter + 1
    });
  };
  render() {
    console.log("组件渲染");
    return (
      <div onClick={this.add}>
        生命周期探究
        {this.state.isShow && <Child num={this.state.counter} />}
      </div>
    );
  }
}

16.4新版本的API

(context实现状态共享&)

context实现状态共享&

创建context,接收一个参数作为context的默认值

组件想要使用状态需要用conuser进行包裹,接收参数value就是privider提供的状态

...value以属性展开的方式获取counter值

消费provider提供的状态

传递add方法

一个值发生了变化其他的值一块变化

创建上下文给的默认值,如果没有Provider提供属性值使用默认值

consumer获取共享状态

定义多个组件不会产生冲突

child组件可以接收name属性了,相互独立互不影响

consumer接收的都是provider提供的值

import React, { Component } from "react";

//创建 Context
const Context = React.createContext({ counter: 0 });
// const Context2 = React.createContext({ name: "davy" });
// const Provider2 = Context2.Provider;
// const Consumer2 = Context2.Consumer;

const { Provider, Consumer } = Context;

//withConsumer是高阶组件工厂,他可以根据配置返回一个高阶组件

//Es5写法
function withConsumer(Consumer) {
  return function(Comp) {
    return function(props) {
      return <Consumer>{value => <Comp {...value} />}</Consumer>;
    };
  };
}

const Child = withConsumer(Consumer)(function(props) {
  return (
    <div
      onClick={() => {
        props.add();
      }}
    >
      {props.counter}
      {props.name}
    </div>
  );
});

// function Child(props) {
//   return (
//     <div
//       onClick={() => {
//         props.add();
//       }}
//     >
//       {props.counter}
//       {props.name}
//     </div>
//   );
// }

class ContextTest extends Component {
  constructor(props) {
    super(props);
    this.state = {
      counter: 0
    };
  }
  add = () => {
    this.setState({
      counter: this.state.counter + 1
    });
  };
  render() {
    return (
      <div>
        <Provider value={{ counter: this.state.counter, add: this.add }}>
          {/* consumer 接收一个函数 当没有provider 会接收context默认值*/}
          <Child />
          {/* <Consumer2>{value => <Child {...value} />}</Consumer2> */}
          <Child />
          <Child />
        </Provider>
      </div>
    );
  }
}

// // <div>
// <div>
//     <Provider2 value={{ name: "han" }}>
//         <div>
//             <Consumer2>{value => <Child {...value} />}</Consumer2>
//         </div>
//     </Provider2>
// </div>
//           </div >
export default ContextTest;

(高阶组件&)

高阶组件&

本质是工厂函数,接收组件做为参数返回一个新的组件就是高阶组件

为了提升组件的复用率

 

保证Lession产生新组件,传递index索引根据索引,新的组件展示里面的stage和title

接收一个组件Comp,返回一个新的组件props=>{}

使用的时候LessWidthContent传递进idx索引

最后展示reat - 核心API

高阶组件变形,容易理解

使用高阶组件保证consumer

箭头函数演变,接收一个组件,返回一个组件

(链式调用&)

链式调用&

类组件才有生命周期钩子,传入的所有属性以this.props接收展示

组件设计哲学,一定要把一个ui抽象为最小颗粒度去实现,再通过高阶组件拓展

(装饰器写法&)

装饰器写法&

装饰器不支持函数式组件,

import React, { Component } from "react";

// Lesson保证功能单一,它不关心数据来源,只负责显示
function Lesson(props) {
  return (
    <div>
      {props.stage} - {props.title}
    </div>
  );
}

// 模拟数据
const lessons = [
  { stage: "React", title: "核心API" },
  { stage: "React", title: "组件化1" },
  { stage: "React", title: "组件化2" }
];

//高阶组件withContent 负责包装这个Lesson
// 包装后的组件具备根据传入的索引,渲染课程

//hoc接收一个组件作为参数,返回一个新的组件

// function withConetnt(Comp) {
//   return function(props) {
//     const content = lessons[props.idx];
//     return <Comp {...content} />;
//   };
// }

const withConetnt = Comp => props => {
  const content = lessons[props.idx];
  return <Comp {...content} />;
};

//高阶组件withlog负责包装传入的组件,具备挂载到Dom上可以输出日志

const withlog = Comp => {
  return class extends React.Component {
    componentDidMount() {
      console.log("has did mount", this.props);
    }
    render() {
      return <Comp {...this.props} />;
    }
  };
};
//包装Lesson
const LessWidthContent = withlog(withConetnt(Lesson));

// @withlog
@withConetnt
class EndTest extends React.Component {
  render() {
    return (
      <div>
        {this.props.stage} - {this.props.title}
      </div>
    );
  }
}

class HocTest extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }
  render() {
    return <EndTest idx={0} />;
  }
}

export default HocTest;
import React from "react";
// import Lifecycle from "./Lifecycle";
// import ContextTest from "./ContextTest";
import HocTest from "./HocTest.tsx";
import CompositionTest from "./CompositionTest";
import ContextTest2 from "./ContextTest2";

class App extends React.Component {
  render() {
    return (
      <div>
        <h1>hello react</h1>
        {/* 生命周期 */}
        {/* <Lifecycle /> */}
        {/* context 上下文 达到状态共享 */}
        {/* <ContextTest /> */}
        <HocTest />
        {/* <CompositionTest /> */}
        {/* <ContextTest2 /> */}
      </div>
    );
  }
}

export default App;

(组件复合&)

组件复合&

组件只赋值展示,内容外部调用的时候传入,props.children也是jsx是一个对象

作用域插槽,动态传进来的内容不是当前组件作用域而是父组件的作用域,值是内部提供的

()语法糖返回一个对象

props.children变为一个函数可以直接执行,调用来传递参数

通过函数解构出titile和content属性值,并把title和content返回过去

Dialog接收一个返回过来的title和content

调用children函数,children就是Dialog内部的内容,传递什么children就是什么,传递对象props.children就是对象

children也可以以属性的方式传递,同时组件内部有内容

组件内部props.children优先解析组件内部内容,如果内部没有内容就是test

​
import React, { Component } from "react";

// Dialog定义组件外观和行为
function Dialog(props) {
  const messages = {
    foo: { title: "foo", content: "foo~" },
    bar: { title: "bar", content: "bar~" }
  };
  console.log(props.children);
  const { title, content } = props.children(messages[props.msg]);

  return (
    <div style={{ border: "1px solid blue" }}>
      <div>{title}</div>
      <span>---------------</span>
      <div>{content}</div>
    </div>
  );
}
//props.children 什么是Children
//组件的内容部分
class CompositionTest extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }
  render() {
    return (
      <div>
        <Dialog msg={"bar"} children={"test"}>
          {({ title, content }) => ({
            title: <h1>{title}</h1>,
            content: <p>{content}</p>
          })}

          {/* jsx
          {{
            title: <h1>标题2</h1>,
            content: <p>内容2</p>
          }} */}
        </Dialog>
      </div>
    );
  }
}

export default CompositionTest;

​

(Context API&)

Context API&

import React, { Component } from "react";

const Context = React.createContext({ counter: 30 });

class Child extends Component {
  static contextType = Context;
  render() {
    return <div>{this.context.counter}</div>;
  }
}

// Child.contextType = Context;

class ContextTest2 extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }
  render() {
    return (
      // <Context.Provider value={{ counter: 0 }}>
      //   <Context.Consumer>{value => <Child {...value} />}</Context.Consumer>
      // </Context.Provider>
      <div>
        <Child />
      </div>
    );
  }
}

export default ContextTest2;
import React, { Component } from "react";

// Lesson保证功能单一,它不关心数据来源,只负责显示
function Lesson(props) {
  return (
    <div>
      {props.stage} - {props.title}
    </div>
  );
}

// 模拟数据
const lessons = [
  { stage: "React", title: "核心API" },
  { stage: "React", title: "组件化1" },
  { stage: "React", title: "组件化2" }
];

//高阶组件withContent 负责包装这个Lesson
// 包装后的组件具备根据传入的索引,渲染课程

//hoc接收一个组件作为参数,返回一个新的组件

// function withConetnt(Comp) {
//   return function(props) {
//     const content = lessons[props.idx];
//     return <Comp {...content} />;
//   };
// }

const withConetnt = Comp => props => {
  const content = lessons[props.idx];
  return <Comp {...content} />;
};

//高阶组件withlog负责包装传入的组件,具备挂载到Dom上可以输出日志

const withlog = Comp => {
  return class extends React.Component {
    componentDidMount() {
      console.log("has did mount", this.props);
    }
    render() {
      return <Comp {...this.props} />;
    }
  };
};
//包装Lesson
const LessWidthContent = withlog(withConetnt(Lesson));

// @withlog
@withConetnt
class EndTest extends React.Component {
  render() {
    return (
      <div>
        {this.props.stage} - {this.props.title}
      </div>
    );
  }
}

class HocTest extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }
  render() {
    return <EndTest idx={0} />;
  }
}

export default HocTest;

 

 

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

React组件化一 的相关文章

  • React + Umi + Dva + Antd 简述 及创建项目过程简述

    React 你的第一个组件 React React是前端三大主流框架之一 你可以在React里传递多种类型的参数 如声明代码 帮助你渲染出UI 也可以是静态的HTML DOM元素 也可以传递动态变量 甚至是可交互的应用组件 安装react框
  • 函数式组件与类组件有何不同?

    与React类组件相比 React函数式组件究竟有何不同 在过去一段时间里 典型的回答是类组件提供了更多的特性 比如state 当有了Hooks后 答案就不再是这样了 或许你曾听过它们中的某一个在性能上的表现优于另一个 那是哪一个 很多此类
  • React重点知识拓展,含Hooks、路由懒加载等

    第7章 React扩展 一 setState 1 setState更新状态的2种写法 setState stateChange callback 对象式的setState stateChange为状态改变的对象 该对象可以体现出状态的更改
  • Antd DatePicker 设置默认值报clone.weekday is not a function

    代码 dayjs版本1 11 7 页面 当点击页面日期框会报clone weekday is not a function 解决方法 在jsx文件中添加如下js import dayjs from dayjs import advanced
  • React Router 路由守卫

    React Router 路由守卫 组件内路由守卫 1 下面是使用高阶组件实现路由守卫的示例代码 import React from react import Route Redirect from react router dom con
  • ant design pro v5 配置拦截器,header

    ant design pro v5 配置拦截器 header 1 资料文档 https umijs org zh CN plugins plugin request requestinterceptors 2 编写app tsx 我这里是自
  • 如何在 Ubuntu 20.04 上使用 React 前端设置 Ruby on Rails v7 项目

    作者选择了电子前沿基金会接受捐赠作为为捐款而写程序 介绍 红宝石 on Rails是一个流行的服务器端 Web 应用程序框架 它为当今网络上存在的许多流行应用程序提供支持 例如GitHub Basecamp 声云 Airbnb and Tw
  • 配置使用Eslint的时候 版本错误 "eslint": "5.6.0" a different version of eslint was detected higher up in the tr

    1 如果你也遇到下面的问题 你可以 按照命令行提示的那样 下面这四步完成的一般就可以了 但是不排除你在运行的时候忘记下载某些依赖 1 删除 package lock json 不是package json 你可以选择 yarn lock 或
  • Ionic3开发教程 - 开发(2)

    Ionic3开发系列教程Ionic3开发教程 环境准备 1 Ionic3开发教程 开发 2 Ionic3开发教程 发布Android版本 3 Ionic3开发教程 发布IOS版本 4 Ionic3开发教程 更新 5 本文中介绍的Ionic3
  • react 使用 scss

    react 使用 scss 日常记录开发中遇到的坑 1 使用 npm install sass loader node sass S 进行安装 2 在页面中直接使用 有时候可以 有时候不行 原因 我个人觉得安装的两个插件本版兼容问题 nod
  • react组件状态同步-状态提升

    假设定义组件TemperatureInputSon import React from react class TemperatureInputSon extends React Component constructor props su
  • 关于Vue.js和React.js,听听国外的开发者怎么说?

    VueJS 与 ReactJS 到底怎么样如何 听听别人怎么说 使用所有新的库和框架 很难跟上所有这些库和框架 也就是说 这就需要您决定哪些是值得花时间的 让我们看看人们说什么 和Vue JS一起工作是很愉快的 我发现学习曲线很浅 然而 这
  • Umi+Dva初印象<基础应用,结构,流转逻辑>

    目录 前言 知识储备 generator函数 Dva初识 实际交互 函数式组件 class组件 前言 项目初始为umi脚手架进行初始化 lt 初始化过程 http t csdn cn cuTaY gt 工程中加载了umi自带的antd ui
  • React之state、hooks性能分析

    目录 一 state 1 为什么使用setState 2 setState异步更新 3 如何获取异步的结果 4 setState一定是异步吗 5 源码分析 6 数据的合并 7 多个state的合并 二 为什么需要Hook 三 Class组件
  • React实现关键字高亮

    先看效果 实现很简单通过以下这个函数 highLight text keyword gt return text split keyword flatMap str gt span keyword span str slice 1 展示某段
  • 【react】回调函数形式的ref

    回调函数有3个特点 是我定义的函数 我没有调用这个函数 在我没有调用的情况下这个函数自己执行了 ref绑定一个箭头函数作为回调函数 可以输出以下这段看下 ref绑定的箭头函数是会自己执行的 class Demo extends React
  • ant design pro 代码学习(七) ----- 组件封装(登录模块)

    以登录模块为例 对ant design pro的组件封装进行相关分析 登录模块包含基础组件的封装 组件按模块划分 同类组件通过配置文件生成 跨层级组件直接数据通信等 相对来说还是具有一定的代表性 1 登录模块流程图 首先 全局了解一下登录模
  • 值得收藏的UmiJS 教程

    点击上方关注 前端技术江湖 一起学习 天天进步 前言 网上的umi教程是真的少 很多人都只写了一点点 很多水文 所以打算自己写一篇 自己搭建umi 并封装了一下常用的功能 并用到公司实际项目中 umi介绍 Umi 是什么 Umi 中文可发音
  • React配置@src根路径

    第一种 直接修改node modules包中的webpack config js文件 找到node modules react scripts config webpack config js文件 修改其中alias中的配置 添加 src
  • 如何提高React组件的渲染效率的?在React中如何避免不必要的render?

    面试官 说说你是如何提高组件的渲染效率的 在React中如何避免不必要的render 一 是什么 react 基于虚拟 DOM 和高效 Diff 算法的完美配合 实现了对 DOM 最小粒度的更新 大多数情况下 React 对 DOM 的渲染

随机推荐

  • 大数据时代的 9 大Key-Value存储数据库

    在过去的十年中 计算世界已经改变 现在不仅在大公司 甚至一些小公司也积累了TB量级的数据 各种规模的组织开始有了处理大数据的需求 而目前关系型数据库在可缩放方面几乎已经达到极限 一个解决方案是使用键值 Key Value 存储数据库 这是一
  • JSR303和拦截器

    目录 一 JSR303 1 pom依赖 二 拦截器 1 什么是拦截器 2 拦截器与过滤器 3 应用场景 4 拦截器的快速入门 三 拦截器链 1 拦截器链的概念 2 TwoHandlerInterceptor java 3 在springmv
  • 912.排序数组

    目录 一 题目 二 代码 一 题目 912 排序数组 力扣 LeetCode 二 代码 class Solution public void MergeSort vector
  • C# 异常:已引发: "线程间操作无效: 从不是创建控件“textBox1”的线程访问它。" (System.InvalidOperationException)

    当使用多线程功能时 在子线程里修改UI控件参数时 如 textBox1 Text str 会引发异常 异常 已引发 线程间操作无效 从不是创建控件 textBox1 的线程访问它 System InvalidOperationExcepti
  • mysql脱库_php+mysql注入拿webshell到脱库

    注 此文章献给那些还对注入不怎么理解的人学习 本次实站过程已经过去一个月了 但是还是写出这个文章 来跟大家分享一下希望大家都能喜欢 就算这次大家再找到此战漏洞也别破坏 毕竟我们只是学习一下 目标站 http www XXXteam cn 注
  • Vue模板语法

    目录 前言 一 插值 1 1 文本 1 2 html 1 3 属性 1 4 class style绑定 1 5 表达式 二 指令 三 过滤器 四 计算属性 监听器 总结 前言 上次分享了Vue的入门 简单的入了个门 本篇文章将要分享的内容为
  • 从零开始学习JavaScript:轻松掌握编程语言的核心技能②

    从零开始学习JavaScript 轻松掌握编程语言的核心技能 一 JavaScript 函数 1 1 JavaScript 函数语法 1 2 局部 JavaScript 变量 1 3 全局 JavaScript 变量 二 JavaScrip
  • 细数阿里达摩院2019年的十个Flag

    戳蓝字 CSDN云计算 关注我们哦 来自 人工智能与大数据 作者 AI小哥 1月2日 阿里达摩院发布 2019十大科技趋势 在未来的一年 科技领域究竟会再次迎来春天 还是继续在寒冬中前行 达摩院给出了自己的判断 该报告覆盖智能城市 语音AI
  • springboot log4j:WARN No appenders could be found for logger

    这里写自定义目录标题 log4j WARN No appenders could be found for logger org springframework web context support StandardServletEnvi
  • 华北电力大学的计算机类专业排名,2018年华北电力大学王牌专业排行榜,考生和家长们都好好看看!...

    华北电力大学有两个校区 一个是北京校区 一个是保定校区 在理科类的院校中 这所大学还是非常不错的 小编有幸去这个学校玩过几次 这个学校的占地面积非常大 环境相对比较优美 而且学校的灯 师资力量也非常大 所以说呢 这次学校还是值得报考的 而且
  • EOS私钥恢复,EOS私钥破解,附私钥恢复破解程序

    EOS私钥恢复 EOS私钥破解 附私钥恢复破解程序 程序地址 https www eos key com 请用谷歌浏览器或火狐浏览器打开才能正常运行
  • 对数据进行补全

    想获取一批数据时 例如 维度 日期 2023 01 03 2023 02 03 品牌 吉利 比亚迪 宝马 指标值 销售数量 但是从源头获取时 只获取了部分数据 做趋势处理时 因为缺少数据图例不好看 想将没有获取的数据进行补全处理 销售数量显
  • DECLARE_MESSAGE_MAP()与消息传递网

    一 总体结构 首先 在 h文件中 DECLARE MESSAGE MAP 然后在 CPP文件中 BEGIN MESSAGE MAP CView CWnd ON COMMAND CViewid 0 END MESSAGE MAP 上面 h中的
  • Kotlin 系统入门到进阶

    目录 前言 Kotlin学习资料 关于Kotlin 你应该学 Kotlin 吗 Android 必备技能 最有可能接替Java的语言 Kotlin 你为什么需要 Kotlin 为什么我要改用Kotlin 如何看待 Kotlin 成为 And
  • 会议OA项目之会议发布(多功能下拉框的详解)

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于OA项目的相关操作吧 目录 Welcome Huihui s Code World 一 主要功能点介绍 二 效果展示 三 前端代码 jsp js 四 后端代码
  • DNS解析与CDN加速

    DNS解析与CDN加速 一 DNS解析 1 域名系统DNS 2 DNS解析 二 CDN加速 1 什么是CDN 2 静态加速 3 动态加速 一 DNS解析 1 域名系统DNS 域名系统的前世今生 域名系统的产生的原因是用户通过形如198 26
  • Web自动化测试流程:从入门到精通,帮你成为测试专家!

    摘要 Web应用程序在今天的软件开发中占据着越来越重要的地位 保证Web应用程序的质量和稳定性是非常必要的 而自动化测试是一种有效的方法 本文将介绍Web自动化测试流程 并提供代码示例 步骤一 选取测试工具 选择适合自己团队的自动化测试工具
  • Linux下安装Mysql5.7,超详细完整教程,以及云mysql连接

    安装前环境检查 1 首先检查自己电脑有没有安装过mysql 输入如下 rpm qa grep mysql 如果有则清理干净在安装 输入 whereis mysql 找到文件夹目录 再把它删除 rpm e nodeps mysql xxxx
  • 华为手机微信与电脑连接到服务器失败怎么办,华为微信到电脑上找不到了怎么办...

    1 华为手机连接电脑后找不到微信保存的视频 应该是在微信专用的文件夹里 文件夹的名字是英文的腾信 如果视频不多可以登陆电脑版微信 然后用文件助手传到电脑再保存 2 华为荣耀10微信存储图片连接电脑找不到 查找微信保存图片的文件信息 打开 文
  • React组件化一

    29 9React课程 第02节 react组件化 第2节 02课react组件化 02课react组件化 02课react组件化 初始化显示constructor构造函数 要使用super 否则没法在内部使用this 2与3之间要对组件进