当前位置: 首页 > news >正文

React 入门:组件实例三大属性之props

文章目录

  • props 介绍
  • 代码准备
  • 定义支持 props 的组件
    • 函数式组件的 props
    • 类式组件的 props
  • 渲染(调用)组件
  • props 的特点
  • 限制组件标签属性
  • 指定组件标签属性的默认值
  • 完整代码(props 标准写法)
  • props 简写方式

props 介绍

  • 从 React 组件内部来讲,组件从概念上类似于 JavaScript 函数,它接受任意的入参,传入的参数就是 props
  • 从组件外部,也就是调用组件时,React 会将 JSX 所接收的属性以及子组件转换为单个对象传递给组件,这个对象就称之为 props。

代码准备

先准备一个基础 html 代码结构:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>函数式组件的props基本使用</title>
</head>

<body>
    <!-- 准备好一个容器 -->
    <div id="app"></div>

    <!-- step01: 引入react核心库 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!-- step02: 引入react-dom,用于支持react操作DOM -->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!-- step03: 引入babel,用于将jsx转为js -->
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <script type="text/babel"> /* 此处一定要写babel */
    </script>
</body>

</html>

下文的代码片段都可以添加到上面的基础代码中,来运行以验证结果。

定义支持 props 的组件

函数式组件的 props

函数组件接收唯一带有数据的 props 对象,由于函数式组件本质上就是 JavaScript 的函数,所以可以把 props 理解成函数的传入一个对象类型的参数的情况,并把 props 这个唯一参数作为函数组件的属性。
示例代码:

<script type="text/babel"> /* 此处一定要写babel */

        // 1. 创建函数式组件
        function Person(props) {
            const {name, age, sex} = props
            return (
                <ul>
                    <li>姓名:{name}</li>
                    <li>年龄:{age}</li>
                    <li>性别:{sex}</li>
                </ul>
            )
        }

  </script>

注意:函数式组件定义时,必须显式定义 props 参数(属性)。

类式组件的 props

示例代码:

<script type="text/babel"> /* 此处一定要写babel */

        // 1. 创建类式组件
        class Person extends React.Component {
            render() {
                const {name,sex,age} = this.props;
                return (
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age}</li>
                    </ul>
                );
            }
        }

</script>

注意:类式组件不是必须显式定义 props 属性。

渲染(调用)组件

  • 写法一
<script type="text/babel"> /* 此处一定要写babel */
        // 渲染组件到页面
        const p = { name: 'tom', age: 18, sex: '女'};
        ReactDOM.render(<Person name={p.name} age={p.age} sex={p.sex} />, document.getElementById('app'));

</script>
  • 写法二
<script type="text/babel"> /* 此处一定要写babel */
        // 渲染组件到页面
        const p = { name: 'tom', age: 18, sex: '女'};
        ReactDOM.render(<Person {...p} />, document.getElementById('app'));

</script>

渲染原理:React 渲染组件 Person 组件时,把 Person 的三个属性 name、age、sex,转化为单个对象 {name: 'tom', age: 18, sex: '女'} 传给组件,这个是对象就是 Person 组件的 props。

props 的特点

  • 只读性
    组件无论是使用函数声明还是通过 class 声明,都决不能修改自身的 props。
// 下面这行代码是错误的,
// 运行时控制台会报错:Uncaught TypeError: Cannot assign to read only property 'age' of object
this.props.age = 100;
  • 避免将 props 的值复制给 state。

限制组件标签属性

不同的组件标签属性,可能值的类型不同。如果你写的组件,他人使用,可能会输入的值不符合预期。所以我们就需要对组件标签属性的值进行限制。
比如,我们需要对上面的组件标签属性进行限制如下:

  • 姓名 name:必须为字符串且必传
  • 性别 sex: 必须为字符串,
  • 年龄 age: 必须为数值,
    代码实现如下:
<!--需要引入 prop-types 类库,用于对组件标签属性进行限制 -->
<script type="text/javascript" src="../js/prop-types.js"></script>

// 下面的代码就是对标签属性的限制,这端代码要写到标签代码块之外。
Person.propTypes = {
  name: PropTypes.string.isRequired, // 限制name必传,且为字符串
  sex: PropTypes.string, // 限制sex为字符串
  age: PropTypes.number, // 限制age为数字
};

添加上面的代码后,把属性的值设置为不符合限制的值,浏览器控制台就会出现相应的警告类型的错误。

指定组件标签属性的默认值

除了对标签属性的限制,可能我们还需要给一些属性提供默认值。
最常见的比如人的性别,一般都会有默认值,默认“未知”、“保密”或“男”。
当然某些场景,我们也可以给年龄设置默认值,比如默认 18.
代码实现如下:

<!--需要引入 prop-types 类库,用于对组件标签属性设置默认值-->
<script type="text/javascript" src="../js/prop-types.js"></script>

// 下面的代码就是给标签属性的设置默认值,这端代码要写到标签代码块之外。
Person.defaultProps = {
  sex: "未知", // sex默认值为“未知”
  age: 18, // age默认值为18
};

完整代码(props 标准写法)

以类式组件为例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>类式组件的props基本使用</title>
</head>

<body>
    <!-- 准备好一个容器 -->
    <div id="app"></div>

    <!-- step01: 引入react核心库 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!-- step02: 引入react-dom,用于支持react操作DOM -->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!-- step03: 引入babel,用于将jsx转为js -->
    <script type="text/javascript" src="../js/babel.min.js"></script>
    <!-- step04: 引入 prop-types,用于对组件标签属性进行限制 -->
    <script type="text/javascript" src="../js/prop-types.js"></script>

    <script type="text/babel"> /* 此处一定要写babel */

        // 1. 创建类式组件
        class Person extends React.Component {
            render() {
                const {name,sex,age} = this.props;
                return (
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age}</li>
                    </ul>
                );
            }
        }

        // 对标签属性进行类型和必填限制
        Person.propTypes = {
            name: PropTypes.string.isRequired, // 限制name必传,且为字符串
            sex: PropTypes.string, // 限制sex为字符串
            age: PropTypes.number // 限制age为数字
        }

        // 给标签属性设置默认值
        Person.defaultProps = {
            sex: '未知', // sex默认值为“未知”
            age: 18 // age默认值为18
        }

        // 渲染组件到页面
        const p = { name: 'Tom', age: 18, sex: '女'};
        // ReactDOM.render(<Person name={p.name} age={p.age} sex={p.sex} />, document.getElementById('app'));
        ReactDOM.render(<Person {...p} />, document.getElementById('app'));
    </script>
</body>

</html>

props 简写方式

特别说明:函数式组件不支持简写方式。

上面的完整代码示例,美中不足的是,对组件标签属性的限制写到了组件外部,感觉不是太美观,也不便于维护。所以根据 JavaScript 类的static的特性,来规范简化 props 的编码。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>类式组件的props基本使用</title>
</head>

<body>
    <!-- 准备好一个容器 -->
    <div id="app"></div>

    <!-- step01: 引入react核心库 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!-- step02: 引入react-dom,用于支持react操作DOM -->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!-- step03: 引入babel,用于将jsx转为js -->
    <script type="text/javascript" src="../js/babel.min.js"></script>
    <!-- step04: 引入 prop-types,用于对组件标签属性进行限制 -->
    <script type="text/javascript" src="../js/prop-types.js"></script>

    <script type="text/babel"> /* 此处一定要写babel */

        // 1. 创建类式组件
        class Person extends React.Component {

            // 对标签属性进行类型和必填限制
            static propTypes = {
                name: PropTypes.string.isRequired, // 限制name必传,且为字符串
                sex: PropTypes.string, // 限制sex为字符串
                age: PropTypes.number // 限制age为数字
            }

            // 给标签属性设置默认值
            static defaultProps = {
                sex: '未知', // sex默认值为“未知”
                age: 18 // age默认值为18
            }

            render() {
                const {name,sex,age} = this.props;
                return (
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age}</li>
                    </ul>
                );
            }
        }

        // 渲染组件到页面
        const p = { name: 'Tom', age: 19, sex: '女'};
        // ReactDOM.render(<Person name={p.name} age={p.age} sex={p.sex} />, document.getElementById('app'));
        ReactDOM.render(<Person {...p} />, document.getElementById('app'));
    </script>
</body>

</html>

在 JavaScript 的类中,通过关键字 static 定义的属性,可以通过类名直接访问。
代码示例:

class Car {
  static wheel = 4;
}

// 可以如下访问 wheel
console.log(Car.wheel); // 控制台输出:4

相关文章:

  • 云原生 | kubernetes - Ingress
  • 为什么在激活 think-cell 时我的 Excel 宏速度缓慢?
  • ESP8266-Arduino网络编程实例-BME280传感器数据仪表显示
  • 使用VScode创建ipynb文件选择kernel运行python代码
  • API接口测试-postman批量执行测试用例及参数化
  • 【Linux集群教程】15 集群装机 - Cobbler 简介和搭建
  • C · 进阶 | 慎看!深剖文件操作,怕你停不下
  • 【JavaWeb】之MVC三层架构
  • 算法模型总结:二分查找
  • 基于遗传算法的二进制图像重建(Matlab代码实现)
  • opencv训练自己的模型,实现特定物体的识别
  • Long类型的数据,后端传给前端产生的精度丢失问题
  • 机器学习之神经网络的公式推导与python代码(手写+pytorch)实现
  • Spring | Spring整合Mybatis
  • 【学生管理系统】权限管理之角色管理
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES6语法详解(一)
  • ES学习笔记(12)--Symbol
  • IDEA常用插件整理
  • JavaScript服务器推送技术之 WebSocket
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • nfs客户端进程变D,延伸linux的lock
  • REST架构的思考
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spring核心 Bean的高级装配
  • SSH 免密登录
  • 从setTimeout-setInterval看JS线程
  • 给第三方使用接口的 URL 签名实现
  • 精彩代码 vue.js
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • scrapy中间件源码分析及常用中间件大全
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C语言)fread与fwrite详解
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (待修改)PyG安装步骤
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)php投票系统 毕业设计 121500
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (原創) 未来三学期想要修的课 (日記)
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Reactor简单使用教程
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net开发时的诡异问题,button的onclick事件无效
  • ::before和::after 常见的用法
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [16/N]论得趣
  • [ai笔记9] openAI Sora技术文档引用文献汇总