React 之常用组件类型

2023-11-08

无状态组件

主要用于内部没有状态更新操作的组件。 同构props进行基本的数据渲染或常量展示。 该类组件职责单一,有利于组件的高复用。

const PureComponent = (props) => (
    <div>
       {
           props.list.map((txt, index) => {
               return <li key={index}>{txt}</li>
           })
       }
    </div>
)


// 使用:
class ParentComponent extends Component {
   .....
   render(){
       <PureComponent  list={this.state.list} />
   }
}

有状态组件

该类型组件可在constructor 中自定义初始状态, 并拥有完整的生命周期钩子。 可以执行一些较为负责的逻辑处理及交互展示。

class StatefulComponent extends Component {

    constructor(props) {
        super(props);
        this.state = {
            //定义状态
        }
    }

    componentWillMount() {
        //do something
    }

    componentDidMount() {
        //do something
    }
    ... //其他生命周期

    render() {
        return (
            //render
        );
    }
}

容器组件

在实际开发中容器组件可以用来作为数据请求加工的地方。 为了使组件的职责更单一,降低组件耦合度, 引入容器组件的概念。(React Redux 的connect() 等都有用到这种组件方式)

      const ProductListComtainer = React.createClass({
          getInitialState(){
              return {
                 pList: [ ]
              }
          },
         componentDidMount() {
         var _this = this;
         axios.get('/api/productList').then((response) =>{
            _this.setState({pList: response.data});
         });
        },
         render(){
            return (<ProductListComtainer pList={pList}></ProductListComtainer>)
         }
      })

高阶组件

该类组件组要用在中大型项目中,对复杂的需求,交互情况往往可以利用高阶组件写出更强复用性的组件。其本质是接收一个组件并返回一个新组件(实质是返回组件的函数)。


const HigherOrderComponent = (WrappedComponent) => {
  return class WrapperComponent extends Component {
    render() {
      //do something with WrappedComponent
    }
  }
}

高阶组件在原组件的基础上,可以增加功能,属性和行为。通常的开发中我们希望组件尽量纯净或业务单一。 但通常部分组件需要增加一些辅助功能: 打印日志,获取数据或校验等, 这些公共代码会被重复写多遍。所以,可以抽象出一个高阶组件,用于给基础组件增加这些功能。

Render Callback 组件

该类型组件在组件中使用渲染回调方式, 将组件中的渲染逻辑委托给其子组件。

import { Component } from "react";

class RenderCallbackCmp extends Component {
  constructor(props) {
    super(props);
    this.state = {
      msg: "hello"
    };
  }

  render() {
    return this.props.children(this.state.msg);
  }
}

const ParentComponent = () =>
  (<RenderCallbackCmp>
    //  <p>{多个子节点时,返回Array}</p>
    //  <p>{多个子节点时,返回Array}</p>
    {msg =>
      //use the msg  返回Object 类型
      <div>
        {msg}
      </div>}
  </RenderCallbackCmp>);

关于this.props.children 值有三种情况: 如果没有子节点,值为: undefined; 如果有一个子节点, 值为:Object; 如果有多个子节点, 值为: Array。
通过使用React提供的 React.Children来处理this.props.children可以避免返回值类型不一的情况。
如:

..............
   return (
       React.Children.map(this.props.children, (child)=>{
           return <li>{child}</li>
       })
   )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 之常用组件类型 的相关文章

  • Flux + React.js - 操作中的回调是好还是坏?

    让我解释一下我最近遇到的问题 我有 React js Flux 驱动的应用程序 有一个列表显示文章数量 注意 应用程序中有多个不同的列表 和文章详情查看在里面 但每个列表只有一个 API 端点 它返回文章数组 为了显示我需要的详细信息fin
  • 微前端架构中如何共享redux store?

    我正在尝试创建一个小项目来实现微前端架构 如下微前端 https martinfowler com articles micro frontends html文章 我正在为每个 MFE 微前端 创建多个存储库 并为该应用程序使用 Redux
  • Material-UI 4.8.1 API 更改 - 指定“组件”属性的新方法?

    Edit 这是 4 8 x 的打字错误 升级到 4 9 0 即可解决该问题 上版本4 8 0 以下代码编译并运行良好
  • React.js 和 Ajax 之间的区别

    当我在 google 上搜索 React js 时 我得到的是 React js 是一个用于创建用户界面的框架 如果网站的某个特定部分经常更新 则意味着我们可以使用 React 但我很困惑 Ajax 仅用于此目的 我们可以使用 Ajax 更
  • React:未捕获的引用错误:未定义需求

    我正在阅读 React 教程 http facebook github io react docs animation html http facebook github io react docs animation html 并且我无法
  • React hooks 状态变量在重新渲染后未更新

    在下面的示例中 我有一个想要更新的元素 水果 数组 并使用更新后的数组执行其他操作 在本例中保存更新后的列表 我的理解是重新渲染状态将更新 但它不在这里 或者状态更新和我的操作之间存在延迟 In the addFruit功能我可以看到 Pe
  • 删除旧版本的 create-react-app

    我想使用创建一个新的反应应用程序create react app脚本 我仍然安装了一个不再受支持的全局版本 因此我卸载了全局版本并尝试创建一个新版本 如下所示 npx create react app myapp 然后我得到了一个没有使用模
  • 有没有办法在 React 中自动播放音频而不使用 onClick 事件?

    我在尝试在 componentDidMount 中播放音频时收到此错误 未捕获 承诺中 DOMException play 失败 因为用户没有先与文档交互 componentDidMount document getElementById
  • 重定向时重新初始化类

    我目前在http example com parentdir module 2 此 URL 实际上加载 Module js 类 如以下路由所示
  • 如何使用 NextJS 使用自托管字体face?

    使用 NextJS 的字体 我已经阅读了有关如何在 NextJS 中使用自托管字体的不同主题 我得到了什么 wait compiling 当我这样做时 font face font family montserrat src url myp
  • 在非输入元素上反应 onKeyDown/onKeyUp 事件

    我需要捕获 cmd 按钮向上和向下事件 以便选择是否在 setState 中使用串联 例如 我如何在表元素上获取这些事件 您必须在主体 窗口级别捕获按键 表元素没有输入焦点 因此您无法从表中捕获键 没有输入元素 var cmdDown fa
  • 我应该使用 redux-form 存储而不是组件状态和 Redux 自定义存储吗?

    我相信任何应用程序都应该有一个事实来源 我的应用程序将有 90 多种交易表格和 150 份报告 复杂的数据结构 父级 子级 计算 所以在 React 中我发现了三个令人困惑的存储状态的地方 组件状态 当我们don t想要共享数据 Redux
  • 新部署后,React 应用程序必须清除浏览器缓存

    我们正在使用 Jenkins 管道在 apache 服务器上部署 React 应用程序 当我们部署新代码时 大多数新功能都可以正常工作 但并非所有更改都反映浏览器中的最新内容 用户必须打开隐身窗口或清除缓存才能看到新功能 我见过一些相关的解
  • 为子元素提供属性时,如何为 React.cloneElement 分配正确的类型?

    我正在使用 React 和 Typescript 我有一个充当包装器的反应组件 我希望将其属性复制到其子组件 我正在遵循 React 的使用克隆元素的指南 https facebook github io react blog 2015 0
  • 即使不改变对象和数组,也无法更改减速器中的嵌套对象

    我正在尝试更新减速器内的状态 我知道我不应该改变对象或嵌套对象 所以我使用map用于数组或对象的对象扩展 但似乎我无法真正更改深层嵌套的值 除了我无法更改状态这一事实之外 我真的不喜欢代码的外观 尤其是仅更改一个属性所需执行的循环数量 我觉
  • 如何在 render 方法中的 React const 变量内循环

    我有一个映射的 const 变量 我用它来注入渲染方法中的返回值 我现在的问题是 我正在映射的对象本身有一个对象集合 我想循环遍历每一个并添加 jsx 语法 这就是我所拥有的 const tasks this state tasks map
  • 什么时候使用useEffect?

    我目前正在查看 React 文档的 useEffect 示例 import React useState useEffect from react function Example const count setCount useState
  • JSX 中的“导出默认值”有什么作用?

    我想问最后一句的含义和作用 导出默认 HelloWorld 但我找不到任何有关它的教程 hello world jsx import React from react class HelloWorld extends React Compo
  • 将 React 构建输出合并到单个 js 文件中

    这类似于这个问题 https stackoverflow com questions 49123097 generate single physical javascript file using create react app然而 这两
  • 带标签的 Material-ui 文本字段[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 谁能告诉我如何在material ui lib中制作带有标签的文本字段 寻找这样的东西 https github com callem

随机推荐

  • 快速WordPress个人博客并内网穿透发布到互联网

    快速WordPress个人博客并内网穿透发布到互联网 文章目录 快速WordPress个人博客并内网穿透发布到互联网 我们能够通过cpolar完整的搭建起一个属于自己的网站 并且通过cpolar建立的数据隧道 从而让我们存放在本地电脑上的网
  • @EnableCircuitBreaker found, but there are no implementations. Did you forget to include a starter?

    java lang IllegalStateException Annotation EnableCircuitBreaker found but there are no implementations Did you forget to
  • ChatGPT vs. Bing vs. Bard

    随着 2022 年 ChatGTP 的推出 人工智能聊天机器人的世界突然走上了一条新道路 如今 密切关注 AI 的人都知道 不同公司推出了几款产品 从谷歌拥有自己的 Bard AI 到微软发布新的 Bing AI Chat 再到 OpenA
  • 6.6开发社区搜索功能

    业务层 新建ElasticsearchService类 package com nowcoder community service import com nowcoder community dao elasticsearch Discu
  • 【电源】DC-DC电路中的伏秒平衡原理

    上一篇我们科普了开关电源 在提到的开关电源中我们常用也就DC DC电路 所以从今天开始将进入到我们的DC DC电路专题 在DC DC电路应用中 我们很多工程师比较难理解BUCK BOOST的升降压区别 或者原理看完就忘又区分不开 那是因为没
  • window子系统使用及问题汇总

    window子系统使用及问题汇总 安装 配置子系统的资源大小 切换默认源 安装docker 解决wsl无法使用systemctl的问题 子系统访问windows系统中的文件 window访问子系统的文件 总结 最近在使用windows上的d
  • nginx vue2+webpack 和 vue3+vite 配置二级目录访问

    我们开发中会遇到这样的需求 让我们用服务器nginx部署一个用域名的二级目录来访问项目 https xxx 二级目录 来放访问项目 目录 思路 1 nginx配置 vue2 和 vue3配置的nginx相同 2 vue2 webpack的配
  • 如何在IDEA设置Java类和方法的注释模板?

    如何在IDEA设置Java类和方法的注释模板 1 类的注释模板设置 首先我们打开IDEA软件 进行如下操作 File gt Settings gt Editor gt File and Code Templates 设置好后 当我们再次创建
  • 磁盘性能基本测试方法

    author skate time 2011 08 22 磁盘性能基本测试方法 dd if dev zero of tmp bs 1M count 10 用dd命令测试瞬间写的能力 iozone a i 1 i 0 c g 5M n 1M
  • PC电脑版微信聊天记录迁移方法

    微信电脑版自带的 备份与恢复 功能 只能把手机上的聊天记录 备份在电脑上 仅仅是备份 是不能在微信电脑版上查看刚备份的聊天记录的 备份后就可以删除手机上的聊天记录 需要的时候再用电脑版留存的备份恢复到手机上 适用场景 可自行琢磨 微信手机版
  • config:invalid signature

    之前服务器换了IP 啥都配置对了 就是IP没改过来 好了 又是花了半天时间排查问题 问题解决 微信config invalid signature 的其中一个错误就是ip地址问题 需在公众号后台 gt 基本配置 gt 设置IP白名单 欢迎关
  • Python time time()方法返回的是秒

    描述 Python time time 返回当前时间的时间戳 1970纪元后经过的浮点秒数 语法 time 方法语法 time time 参数 NA 返回值 返回当前时间的时间戳 1970纪元后经过的浮点秒数 实例 以下实例展示了 time
  • Linux目录操作命令

    1 查看目录命令 ls 用法 ls 选项 目录名 常用选项 a 显示所有文件 包含隐藏文件 l 显示长文件信息 案例 查看 user下的所有文件 ls a user ls 文件或目录路径信息 ls d 查看目录信息 ls l 文件或目录信息
  • Unity Shader入门精要文章目录

    前言 从今天开始 我将每天开始学习一些有关于Shader的知识 并把所学到的知识简化 写成文章来供大家参考或者学习 一方面是为了巩固知识 另一方面是我也没有找到什么系统的文章来学习Shader的知识 我的Shader学习大部分是参考了Uni
  • GDI+ 中路径类使用总结

    背景 路径是一系列相互连接的直线和曲线 由许多不同类型的点所构成 用于表示复杂的不规则图形 GraphicsPath 类表示 要绘制一组图形 如线条 矩形 多边形和曲线等 可以通过 Graphcis 类的 DrawPath 方法一次性绘制
  • 《Python进阶系列》二十六:面试题目:[lambda x: x*i for i in range(4)]

    quad quad 闲着无聊 看了道面试题 瞬间涨姿势了 特地做个总结 题目 题目如下 lst lambda x x i for i in range 4 res m 2 for m in lst print res 上述式子的输出结果 预
  • VirtualBox中出现 UUID have already exists : 修改 UUID

    VirtualBox中出现UUID have already exists 解决方法 要点 C Program Files Oracle VirtualBox VBoxManage exe internalcommands sethduui
  • C++——vector

    文章目录 vector的介绍 vector的使用 为什么vector不提供find 排序 sort vector的模拟实现 搭一个最简单的架子 构造函数和析构函数 尾插 尾删 operator 迭代器 insert erase 迭代器失效
  • [caffe安装]配置环境过程中出现的问题及解决

    今天要跑一下Convolutional Autoencoder for Loop Closure 轻量级神经网络闭环方法 caffe安好之后编译程序出现以下错误 Scanning dependencies of target deeplcd
  • React 之常用组件类型

    无状态组件 主要用于内部没有状态更新操作的组件 同构props进行基本的数据渲染或常量展示 该类组件职责单一 有利于组件的高复用 const PureComponent props gt div props list map txt ind