组件的Props类型检查与默认值 - 图1

概述

在React中要是没有使用某一类静态语言的时候,。我们要想在组件的 props 上进行类型检查,我们可以使用prop-types库达到这个目的,使用起来很简单,下面我们就简单的看看如何指定props的类型和默认值,更多内容可以去库的首页去看。主要对比prop-types在Js和Ts是怎杨的。

组件(JS语言)

函数组件

  1. // 引入prop-types库 需要先npm 安装
  2. import PropTypes from "prop-types";
  3. import React from "react";
  4. function HelloWorld(props) {
  5. return <h1>Hello, {props.name}</h1>;
  6. }
  7. //定义props类型
  8. HelloWorld.propTypes = {
  9. //规定name 为string类类型
  10. name: PropTypes.string.isRequired
  11. };
  12. //定义props默认值
  13. HelloWorld.defaultProps = {
  14. name: "helloworld"
  15. };
  16. export default HelloWorld;

我们只需要在函数组件的方法名上添加propTypes来指定props的类型或者是否是必须的,上面的代码中,我们定义了一个类型为string的name prop,并且该prop是必须的(就是在使用该组件时候必须要传入,否则在控制台有错误提示),并且为该prop设置了一个默认值,当存在默认值的时候,在使用该组件的时候,isRequired就失效了。
下面我们在另外一个组件引入HelloWorld组件来测试下这个prop-types库的功能。

  1. import React from "react";
  2. import HelloWorld from "./HelloWorld";
  3. function App() {
  4. //传入一个非string的 name prop,看看控制台提示什么
  5. return <HelloWorld name={666}></HelloWorld>;
  6. }
  7. export default App;

我们在使用HelloWorld组件的时候,传入了 一个数字类型的name prop为666,控制台提示如下;

image.png
我们可以看到控制台有提示错误,但是程序没有报错,还是显示正确的结果,prop-types不会阻止程序,只会在控制台提示,并且这个提示只会在开发模式下有。

Class组件

使用Class组件实现Props的类型检查和默认值和函数组件差不多一样,也是在组件名上添加propTypes和defaultProps属性,不过在指定默认值的方式上,Class组件支持另一种指定默认值的写法,前提是装了transform-class-properties 的 Babel 转换工具 就可以在 React 组件类中声明 defaultProps 作为静态属性。

  1. import PropTypes from "prop-types";
  2. import React from "react";
  3. class HelloWorld extends React.Component {
  4. render() {
  5. return <h1>Hello, {this.props.name}</h1>;
  6. }
  7. }
  8. HelloWorld.propTypes = {
  9. name: PropTypes.string.isRequired
  10. };
  11. HelloWorld.defaultProps = {
  12. name: "helloWorld"
  13. };
  14. export default HelloWorld;

或者(装了transform-class-properties 的 Babel 转换工具 )

  1. import PropTypes from "prop-types";
  2. import React from "react";
  3. class HelloWorld extends React.Component {
  4. //props 默认值
  5. static defaultProps = {
  6. name: "helloWorld"
  7. };
  8. render() {
  9. return <h1>Hello, {this.props.name}</h1>;
  10. }
  11. }
  12. HelloWorld.propTypes = {
  13. name: PropTypes.string.isRequired
  14. };
  15. export default HelloWorld;

就不用再测试了,和函数组件是一样的。

补充

propsTypes 类型检查发生在 defaultProps 赋值后,所以类型检查也适用于 defaultProps。要是defaultProps的props类型和propsTypes不一支,也会在浏览器控制台给出提示,如下

  1. import PropTypes from "prop-types";
  2. import React from "react";
  3. class HelloWorld extends React.Component {
  4. static defaultProps = {
  5. // number类型和propTypes定义的string类型不一致
  6. name: 123
  7. };
  8. render() {
  9. return <h1>Hello, {this.props.name}</h1>;
  10. }
  11. }
  12. HelloWorld.propTypes = {
  13. name: PropTypes.string.isRequired
  14. };
  15. export default HelloWorld;

控制台
image.png

组件(TS语言)

因为Ts给函数组件和Class组件添加了Props类型,所以我们就需要看看props默认值该怎么写。

函数组件

  1. import React from 'react';
  2. type PropsType = { name: string };
  3. const defaultProps: PropsType = {
  4. name: 'Hello World22',
  5. };
  6. const HelloWorld = (props: PropsType) => {
  7. return <div>{props.name}</div>;
  8. };
  9. HelloWorld.defaultProps = defaultProps;
  10. export default HelloWorld;

上面的代码给函数组件HelloWorld 添加了默认prop name,注意我们给defaultProps的类型规定了和props一样的类型PropsType(上面代码定义的),要是我们的Props类型是引入其他地方的话,我们就很被动,需要写出所有的约束,其实我们可以不用给默认Props指定类型,只要确保最后的Props约束里面包含这些默认值的约束就Ok,所以我们可以换一种写法如下,这种写法对于Class组件也是一样的

  1. import React from 'react';
  2. //类型的交叉类型
  3. type PropsType = { age: number } & typeof defaultProps;
  4. const defaultProps = {
  5. name: "Hello World"
  6. };
  7. const HelloWorld = (props: PropsType) => {
  8. return <div>{props.name}</div>;
  9. };
  10. HelloWorld.defaultProps = defaultProps;
  11. export default HelloWorld;

Class组件

  1. import React from 'react';
  2. //类型的交叉类型
  3. type PropsType = { age: number } & typeof HelloWorld.defaultProps;
  4. class HelloWorld extends React.Component<PropsType>{
  5. static defaultProps = {
  6. name: "Hello World"
  7. }
  8. render(){
  9. return <div>{this.props.name}</div>;
  10. }
  11. }
  12. export default HelloWorld;

只能通过静态属性来定义Props默认值

总结

上面就是通过Ts来开发组件指定Props的默认值。