react学习—属性默认值和类型验证

2023-11-16

一、属性默认值

通过一个静态属性defaultProps告知react属性默认值

1、函数组件属性默认值

//FuncDefault.js
import React from 'react'

export default function FuncDefault(props) {
  return (
    <div>
      a: { props.a },b: { props.b },c: { props.c }
    </div>
  )
}
//属性默认值
FuncDefault.defaultProps = {
  a: 1,
  b: 2,
  c: 3
}
import React, { Component } from 'react'
import FuncDefault from './FuncDefault'

export default class Input extends Component {
  render() {
    return (
      <div>
        {/* 注意我们没有传入属性值哦 */}
        <FuncDefault />
      </div>
    )
  }
}

然后组件就会默认调用我们设置的默认属性值。
在这里插入图片描述
如果我们又传入属性值,有设置默认属性值呢?

import React from 'react'

export default function FuncDefault(props) {
  console.log(props);// 给函数组件之前,props已经与defaultProps完成了混合
  return (
    <div>
      a: { props.a },b: { props.b },c: { props.c }
    </div>
  )
}
//属性默认值
FuncDefault.defaultProps = {
  a: 1,
  b: 2,
  c: 3
}

在这里插入图片描述

2、类组件默认属性值

//ClassDefault.js
import React, { Component } from 'react'

export default class ClassDefault extends Component {
  // he函数组件一样,在调用组件时props已经混合完成
  constructor(props) {
    console.log(props);
    super(props);
  }
  render() {
    return (
      <div>
        a: { this.props.a},b: { this.props.b},c: { this.props.c}
      </div>
    )
  }
}
ClassDefault.defaultProps = {
  a: 1,
  b: 2,
  c: 3
}
import React, { Component } from 'react'
import ClassDefault from './ClassDefault'

export default class Input extends Component {
  render() {
    return (
      <div>
        {/* 注意我们没有传入属性值哦 */}
        <ClassDefault a={4} b={5} />
      </div>
    )
  }
}

在这里插入图片描述
此外,类组件的默认属性值,也可以直接使用静态成员的方式书写。

export default class ClassDefault extends Component {
  // he函数组件一样,在调用组件时props已经混合完成
  constructor(props) {
    console.log(props);
    super(props);
  }
  static defaultProps = {
    a: 1,
    b: 2,
    c: 3
  }
  render() {
    return (
      <div>
        a: { this.props.a},b: { this.props.b},c: { this.props.c}
      </div>
    )
  }
}

二、属性类型验证

使用库:prop-types

对组件使用静态属性propTypes告知react如何检查属性

1、常见值类型

// ValidationComp.js
import React, { Component } from 'react'
import PropTypes from 'prop-types';

export default class ValidationComp extends Component {
  static propTypes = {
    a: PropTypes.number,
    b: PropTypes.bool
  }
  render() {
    return (
      <div>
        a: { this.props.a },b: { this.props.b }
      </div>
    )
  }
}
import React, { Component } from 'react'
import ValidationComp from './ValidationComp'

export default class Input extends Component {
  render() {
    return (
      <div>
        <ValidationComp a={4} b={'true'} />
      </div>
    )
  }
}

由于我们b属性开启了类型验证为布尔,此时我们传入的是字符,虽然页面上成功显示,单控制台会进行报错。
在这里插入图片描述
也可以使用jsx语法,直接传入b即可,默认为true。

import React, { Component } from 'react'
import ValidationComp from './ValidationComp'

export default class Input extends Component {
  render() {
    return (
      <div>
        {/* 注意我们没有传入属性值哦 */}
        <ValidationComp a={4} b />
      </div>
    )
  }
}

也可以不传入b值,使用属性默认值。

export default class ValidationComp extends Component {
  static defaultProps = {
    b: false
  }
  static propTypes = {
    a: PropTypes.number,
    b: PropTypes.bool
  }
  render() {
    return (
      <div>
        a: { this.props.a },b: { this.props.b }
      </div>
    )
  }
}

通过这里我们也可以发现,仍然是在调用组件时,属性值和默认属性值已经完成混合,所以此时属性类型验证才能知道b的值类型为布尔
在这里插入图片描述

2、是否必传isRequired

在之前的学习中我们知道,哪怕我么适应了b属性值,但b属性值不传不设置默认值,react不会有报错提示。

import React, { Component } from 'react'
import PropTypes from 'prop-types';

export default class ValidationComp extends Component {
  // static defaultProps = {
  //   b: false
  // }
  // static propTypes = {
  //   a: PropTypes.number,
  //   b: PropTypes.bool
  // }
  render() {
    return (
      <div>
        a: { this.props.a },b: { this.props.b }
      </div>
    )
  }
}

一旦我们对属性类型验证开启必传验证后。

export default class ValidationComp extends Component {
  // static defaultProps = {
  //   b: false
  // }
  static propTypes = {
    a: PropTypes.number,
    b: PropTypes.bool.isRequired
  }
  render() {
    return (
      <div>
        a: { this.props.a },b: { this.props.b }
      </div>
    )
  }
}

此时系统会进行提示报错,b必须传入。
在这里插入图片描述

3、其它类型验证

由于react的验证方法很多,但是常用的往往就那几个,剩下的就不再一一详细举例了。
博主直接将其他的验证方法直接附上。

import React, { Component } from 'react'
import PropTypes from 'prop-types'
export class A {}

export default class ValidationComp extends Component {
  static defaultProps = {
    b: false
  }
  static propTypes = {
    a: PropTypes.number.isRequired,  //a属性必须是一个数字类型,并且必填
    b: PropTypes.bool.isRequired, //b必须是一个bool属性,并且必填
    onClick: PropTypes.func, //onClick必须是一个函数
    c: PropTypes.any, //1. 可以设置必填   2. 阵型保持整齐(所有属性都在该对象中)
    d: PropTypes.node.isRequired, //d必填,而且必须是一个可以渲染的内容,字符串、数字、React元素   d={<Comp />}
    e: PropTypes.element, //e必须是一个React元素  e={<Comp />}
    F: PropTypes.elementType, //F必须是一个组件类型  F={Comp}
    g: PropTypes.instanceOf(A), //g必须是A的实例,普通对象也不行  g={new A}
    sex: PropTypes.oneOf(["男", "女"]), //属性必须是数组当中的一个,非'男'即'女'  sex={'男'}
    h: PropTypes.arrayOf(PropTypes.number), //数组的每一项必须满足类型要求(可以使空数组)  n={[1,2,3]}
    i: PropTypes.objectOf(PropTypes.number), //每一个属性必须满足类型要求  i={{a: 1}}
    j: PropTypes.shape({ //属性必须满足该对象的要求,相当于组合使用
      name: PropTypes.string.isRequired, //name必须是一个字符串,必填
      age: PropTypes.number, //age必须是一个数字
      address: PropTypes.shape({// 如果继续嵌套函数,别忘了用shape
        province: PropTypes.string,
        city: PropTypes.string
      })
    }),
    k: PropTypes.arrayOf(PropTypes.shape({// 如果想验证数组每一个元素,可以灵活嵌套使用
      name: PropTypes.string.isRequired,
      age: PropTypes.number.isRequired
    })),
    l: PropTypes.exact({...}),// 对象必须精确匹配传递的数据,不能设置无效验证且不传属性
    m: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),// 数组元素的类型必须为其中一个,和oneOf类似
  }
  render() {
    return (
      <div>
        a: { this.props.a },b: { this.props.b }
      </div>
    )
  }
}

4、自定义验证

如果以上验证方法仍不能对你的属性进行验证,也可以自定义验证。
自定义属性检查,如果有错误,返回错误对象即可

// ValidationComp.js
import React, { Component } from 'react'
import PropTypes from 'prop-types'

export default class ValidationComp extends Component {
  static defaultProps = {
    b: false
  }
  static propTypes = {
    a: PropTypes.number.isRequired,  //a属性必须是一个数字类型,并且必填
    b: PropTypes.bool, //b必须是一个bool属性,并且必填
    fn: function (props, propName, componentName) {
      console.log(props, propName, componentName);
      const val = props[propName];
      if(typeof val === 'string'){
        return new Error(`invalid prop ${propName} in ${componentName}${propName} is String`);
      }
    }
  }
  render() {
    return (
      <div>
        a: { this.props.a },b: { this.props.b },fn: { this.props.fn }
      </div>
    )
  }
}
import React, { Component } from 'react'
import ValidationComp from './ValidationComp'

export default class Input extends Component {
  render() {
    return (
      <div>
        <ValidationComp a={4} b={true} fn={'自定义验证'} />
      </div>
    )
  }
}

在这里插入图片描述

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

react学习—属性默认值和类型验证 的相关文章

  • ElasticSearch text 和 keyword 类型

    ElasticSearch text 和 keyword 类型 text 会进行分词 先把对象进行分词处理 然后存入到es中 当使用多个单词进行查询的时候 查不到已经分词过的内容 keyword 不会进行分词 不会对es中的对象进行分词处理

随机推荐

  • FreeRTOS任务创建、删除

    目录 一 FreeRTOS任务创建与删除有关函数 1 1 创建 删除任务的API函数 1 1 1 动态创建任务 1 1 2 静态创建任务 1 1 3 删除任务 二 FreeRTOS任务创建与删除 动态方法 2 1 实例 三 FreeRTOS
  • LeetCode 沙漏的最大总和

    以最中间的的那个元素来移动 整个沙漏移动 class Solution public int maxSum int grid int max 0 int sum 0 for int i 1 i lt grid length 1 i for
  • 【华为OD机试】路灯照明问题【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 在一条笔直的公路上安装了N个路灯 从位置0开始安装 路灯之间间距固定为100米 每个路灯都有自己的照明半径 请计算第一个路灯和最后一个路灯之间 无法照明的区间的长度和
  • 线上git仓库地址更改,本地如何更改?

    1 进入终端查看本地代码关联的git仓库地址 git remote v 2 删除本地关联的git仓库地址 git remote rm origin 3 本地代码关联新的仓库地址 git remote add origin 新地址 4 再次查
  • 获取BDUSS的简单方式

    BDUSS是登录百度 web wap 后的唯一身份凭证 baidu com 受http only保护 拿到BDUSS就等于拿到帐号的控制权 通行贴吧 知道 百科 文库 空间 百度云等百度主要产品 在 贴吧云签系统 中 需要用到BDUSS进行
  • Linux下查看磁盘使用率及文件和文件夹大小

    原文地址 http blog sina com cn s blog 4ab088470106ge0o html 大家在使用linux的过程中 或许遇到过数据无法入库 无法上传数据等等 这就要多长个心眼 去查看一下磁盘使用率和文件大小吧 这时
  • 贪心+二分解决最大值最小、最小值最大问题

    在刷题时 总会遇到求最大值最小 最小值最大问题 也许它会暗喻是这样的一个问题 对于这样的一个问题 你会发现用dp和枚举都会超时超内存 或者说很麻烦 所以这是一个比较简单的解题方式 二分逼近思想 对于难以直接确定解的问题 采取二分枚举 检验的
  • mysql常见六大约束

    DDL语言 常见约束 约束的含义 一种限制 用于限制表中的数据 为了保证表中的数据的准确性和可靠性 分类 六大约束 1 NOT NULL 非空约束 用于保证该字段的值不能为空 比如姓名 学号等 2 DEFAULT 默认约束 用于保证该字段有
  • Pycharm中放大和缩小代码界面

    直接上图流程 打开文件 点击设置 选择 keymap 右侧搜索框输入 increase 搜索出来之后双击 选择 Add Mouse Shortcut 然后在操作框按住 Ctrl 并将鼠标滚轮上滑 完成设置 一直点击OK关闭界面即可 之后按住
  • TortoiseGit如何变动项目Ip地址

    第一步 进到项目所在目录 找到git文件夹里的config文件 第二步 用记事本打开config文件 修改ip地址信息并保存即可
  • Spring的内部bean

    当一个bean仅被用作另一个bean的属性时 才能被声明为一个内部bean 为了定义inner bean 在Spring的基于XML的配置元数据中 可以在
  • 激光炸弹题解

    维生素C吃多了会上火 个人CSDN博文目录 2022蓝桥杯 目录 题目链接 题解 题目链接 题解 1 不同目标可能在同一位置所以 w 2 可能在 5000 5000 所以要算到5001 3 long long 超内存 include
  • EasyPoi实现Excel数据导入

    EasyPoi是一个基于Java的Excel导入导出框架 主要提供了Excel读取 写入等基本功能 并且支持通过注解来定义Excel文件的格式 添加maven依赖
  • 【WinForm】WebView2-个性化浏览器-桌面程序开发详解

    这是一个桌面程序上的浏览器 是用插件WebView2开发的浏览器桌面程序 功能体验堪比Edge浏览器 相比使用Chrome内核插件开发浏览器来说 还是用插件WebView2开发来得简单一些 接下来讲一讲实现过程 开发之前 建议先看看微软的
  • spring boot工程创建(idea无法联网)

    1 进入spring官网Spring Home 2 点击spring boot 3 翻到最下边 点击此处 或者直接进入网址Spring Initializr 4 设定项目基本内容 5 选择对应依赖 6 删除依赖 7 创建项目 8 将项目压缩
  • 自监督学习-MoCo-论文笔记

    论文 Momentum Contrast for Unsupervised Visual Representation Learning CVPR 2020 最佳论文提名 用动量对比学习的方法做无监督的表征学习任务 动量的理解即是指数移动平
  • 初学者写一个程序(一)(PyCharm配置Python解释器)

    5 PyCharm配置Python解释器 1 首先安装 PyCharm 完成之后 打开它会显示如下所示的界面在file中也有settings 点击后一样的操作 图六 在此界面中 可以手动给 PyCharm 设置 Python 解释器 点击图
  • 指数平滑法(Exponential Smoothing,ES)

    目录 1 指数平滑 2 一次指数平滑预测 又叫简单指数平滑 simple exponential smoothing SES 2 1 定义 2 2 例题 3 二次指数平滑法 Holt s linear trend method 3 1 定义
  • torch.nn.modules.module.ModuleAttributeError: ‘DataParallel‘ object has no attribute ‘step‘

    错误位置定点 解决方法
  • react学习—属性默认值和类型验证

    属性默认值和类型验证 一 属性默认值 1 函数组件属性默认值 2 类组件默认属性值 二 属性类型验证 1 常见值类型 2 是否必传isRequired 3 其它类型验证 4 自定义验证 一 属性默认值 通过一个静态属性defaultProp