React教程(四):React组件进阶

news/2024/7/15 19:09:10 标签: react.js, javascript, 前端

传送门:
React教程(一):React基础
React教程(二):React组件基础
React教程(三):React组件通信

一.Children属性

1.children属性是什么?

表示该组件的子节点,只要组件内部有子节点,props中就有该熟悉感。

2.children可以是什么?

  • 普通文本
  • 普通标签元素
  • 函数
  • JSX

举个例子:


// 子组件A
const SonA = (props) => {
  return <div>组件A:{props.children}</div>;
};
// 子组件B
const SonB = (props) => {
  return <div>组件B{props.children}</div>;
};

// 子组件C
const SonC = (props) => {
  return <div>组件C{props.children}</div>;
};

// 子组件C
const SonD = (props) => {
  console.log("dddd", props.children);
  return <div>组件D{props.children}</div>;
};
// 根组件
class App extends React.Component {
  state = {
    msg: "11111好耶111",
  };
  renderUI = () => {
    return <span>111</span>;
  };
  render() {
    return (
      <div>
        {/* 普通文本 */}
        <SonA>aaaaa</SonA>
        {/* 标签 */}
        <SonB>
          <span>bbbb</span>
        </SonB>
        {/* jsx元素 */}
        <SonC>{true && <span>ccccc</span>}</SonC>
        {/* 函数 */}
        <SonD>{this.renderUI()}</SonD>
      </div>
    );
  }
}

显示结果:
在这里插入图片描述
这里要注意的是,如果直接在jsx中使用匿名函数,他将不会解析为jsx元素,会被当成一个函数。
比如下面这种写法:

        <SonD>
          {() => {
            return <span>111</span>;
          }}
        </SonD>

导致的报错如下:
大致就是函数无法作为react组件的子节点
在这里插入图片描述
这个时候,我们传递过去的是函数,那么我们需要调用这个函数:
子组件D中需要去调用它,后面加一个括号就行:

// 子组件C
const SonD = (props) => {
  console.log("dddd", props.children);
  return <div>组件D{props.children()}</div>;
};

我们使用children一般用来做高阶组件,诸如fusion组件库中的navbar就是使用了chidren属性。

二.props校验-场景和使用

使用场景:

对于组件来说,props是由外部传入的,我们其实无法保证组件使用者传入了什么格式的数据,如果传入的数据格式不对,就可能导致内部错误。且组件使用者无法知道报错原因

举个栗子:

// 随便声明一个函数组件
const ShowPersonList = (props) => {
  const { personList, id, kind } = props;
  return (
    <div>
      {personList.map((item) => {
        return (
          <div>
            {item.name}
            {id}----{kind}
          </div>
        );
      })}
    </div>
  );
};

我们知道personList表示的是一个数组,我们在渲染jsx时使用了数组的方法map。
但是组件的使用者并不知道我们组件内部使用了这个api呀(黑盒)。
所以使用者在使用时如果传入一个非数组例如1

// 根组件
function App() {
  return (
    <div>
      <ShowPersonList personList={1} id={"22"} kind={122} />
    </div>
  );
}

那么就会导致控制台报错
在这里插入图片描述
类型错误,personList.map不是一个方法。因为我们传的是数字number,number当然没有map方法。
而使用者就会很蒙蔽,这是哪里的报错,我哪里用了map这种疑问。

当然有的人可能会说啦,啊,我的组件是TS写的,有TS声明,当然,现在开发都是基于TS的,组件可以规定使用者必须传入什么类型的数据甚至什么字段,极大减少了因为传入错误的数据而导致的错误的发生。(还能提示报错原因)
在这里插入图片描述

但!!!!

我知道你很急,你先别急,这里是React教程!!
在这里插入图片描述

我们假设只使用js的情况下怎么解决这个问题。

面对这样的问题,我们可以使用props校验
做法就是使用第三方的校验包(当然你也可以自己写,不过现成的不香吗)

实现步骤:

  1. 安装属性校验包:
    npm add prop-types
  2. 导入prop-types
  3. 使用组件名.propTypes={}给组件添加校验规则。

在这里插入图片描述

好,我装好了,记得command/ctrl +shift + p 再enter重启下vscode窗口。

代码演示实战:



http://www.niftyadmin.cn/n/183436.html

相关文章

初识linux之信号

信号的声明周期主要分为三个部分&#xff0c;即信号产生、信号保存和信号递达。但是在这之前&#xff0c;要先知道什么是信号。所以在这一篇里将按照概念预备->信号产生->信号保存->信号递达的顺序讲解。一、信号的概念大家应该知道&#xff0c;在system V标准中&…

Android 9.0 禁止拖拽hotseat到其他屏功能实现

1.前言 在9.0的系统rom产品定制化开发中,在launcher3中,对于系统hotseat 文件夹 和app图标的拖拽功能也是比较重要的,由于在hotseat中的几个图标都是固定的,所以 产品要求不能拖拽hotseat的图标去其他屏,其他屏的图标也不能拖拽到hotseat区域,所以需要了解hotseat的拖拽…

我们的身边,“AR”在哪里?

AR技术 文章目录AR技术一、游戏二、教育三、建筑设计四、营销五、医疗AR技术已经广泛应用于各个领域&#xff0c;简单了解一些我们身边常见的AR技术应用吧。看看“AR”都在哪里&#xff1f; 一、游戏 AR技术可以将虚拟游戏元素与现实世界相结合&#xff0c;创造出更加真实的游戏…

Prometheus监控实战系列一: Prometheus介绍

1、Prometheus简介 Prometheus受启发于Google的Brogmon监控系统&#xff08;相似的Kubernetes是从Google的Brog系统演变而来&#xff09;&#xff0c;从2012年开始由前Google工程师在Soundcloud以开源软件的形式进行研发&#xff0c;并且于2015年早期对外发布早期版本。2016年…

电脑开机出现英文字母开不了机怎么办?收藏好这份实用指南!

案例&#xff1a;电脑开机出现英文字母开不了机 “家人们&#xff0c;好奇怪呀&#xff0c;我的电脑开机时出现了一串英文字母&#xff0c;一直都开不了机&#xff0c;这是怎么回事呢&#xff1f;我应该怎么解决这个问题呢&#xff1f;” 在使用电脑时&#xff0c;我们有时会…

【gitlab部署】centos8安装gitlab(搭建属于自己的代码服务器)

这里写目录标题部署篇序言要求检查系统是否安装OpenSSH防火墙问题准备gitlab.rb 配置坑点一忘记root密码重置使用篇gitlab转换成中文git关闭注册入口创建用户部署篇 序言 在团队开发过程中&#xff0c;想要拥有高效的开发效率&#xff0c;选择一个好的代码开发工具是必不可少的…

C++ OpenCV推理一个人脸识别案例

1. 概念 1.1 RTSP推流 RTSP&#xff08;Real-Time Streaming Protocol&#xff09;是一种网络协议&#xff0c;用于在客户端和服务器之间传输实时流媒体数据。在视频监控领域&#xff0c;RTSP通常用于从摄像头或其他视频源获取视频流并将其推送到其他设备或平台。在这种情况下…

C++的异常机制导致的crash问题

问题背景 最近工作中遇到了一个非常奇怪的crash问题&#xff0c;反反复复分析了好久。由于保密原因&#xff0c;这里只记录一下分析思路&#xff0c;不会涉及到代码。 初步log分析 tombstone显示这是一个abort&#xff1a;Cmdline: /vendor/bin/hw/vendor.qti.camera.provid…