请解析React JavaScript的const语法及Flow类型React组件代码
嘿,我来帮你拆解这段带Flow类型校验的React组件代码,先从React里的const语法说起~
React中const语法解析
在React(或者说JavaScript)里,const是用来声明块级作用域常量的关键字。它有几个核心特点:
- 一旦赋值就不能重新赋值(注意:如果是对象、数组这类引用类型,虽然不能改变变量的引用,但可以修改内部的属性或元素);
- 在React函数式组件里,我们常用
const来声明组件本身、内部变量或者自定义hooks,这符合函数式编程的 immutable 理念,能避免意外的变量修改,让代码更稳定。
先把完整的代码放出来,方便咱们逐段分析:
// @flow import React from 'react'; import PropTypes from 'prop-types'; import { ImageButton } from '../Button'; type AddEmojiButtonPropTypes = { small?: boolean, children?: any, // eslint-disable-line react/require-default-props }; const AddEmojiButton = ({ small, children, ...other }: AddEmojiButtonPropTypes) => ( <ImageButton type="button" {...other} > {small ? ( <img alt="Add Emoji" src="https://res.cloudinary.com/df9jsefb9/image/upload/c_scale,h_54,q_auto/v1503278075/assets/btn-add-emoji-small.svg" /> ) : ( <img alt="Add Emoji" src="https://res.cloudinary.com/df9jsefb9/image/upload/c_scale,h_72,q_auto/v1503278075/assets/btn-add-emoji-large.svg" /> )} {children} </ImageButton> ); // 通常会补充的运行时校验与默认值 AddEmojiButton.propTypes = { small: PropTypes.bool, children: PropTypes.node, }; AddEmojiButton.defaultProps = { small: false, };
1. Flow启用与依赖导入
// @flow:这是Flow的专属注释指令,用来告诉Flow工具“要对这个文件做静态类型检查”,开启类型校验模式;import React from 'react';:必须导入React才能使用JSX语法,这是React的核心依赖;import PropTypes from 'prop-types';:导入React官方的PropTypes库,用来做运行时的props校验(和Flow的静态校验互补,开发环境下能快速发现props类型错误);import { ImageButton } from '../Button';:从上级目录的Button.js(或对应文件)中导入封装好的ImageButton组件,作为当前按钮的基础容器。
2. Flow自定义类型:AddEmojiButtonPropTypes
type AddEmojiButtonPropTypes = { small?: boolean, children?: any, // eslint-disable-line react/require-default-props };
type是Flow的类型声明关键字,用来定义自定义的类型别名,方便复用;small?: boolean:?表示这个props是可选的,类型限定为布尔值;children?: any:children也是可选props,any表示可以接受任意类型的子元素;后面的// eslint-disable-line react/require-default-props是ESLint的禁用规则注释,因为ESLint默认要求可选props必须设置默认值,但这里children用了any类型,不需要默认值,所以临时禁用这条规则。
3. 函数组件声明与props解构
const AddEmojiButton = ({ small, children, ...other }: AddEmojiButtonPropTypes) => ( // JSX内容 );
const AddEmojiButton:用const声明函数组件,因为组件本身不需要被重新赋值,符合函数式组件的设计思路;- 解构赋值:
({ small, children, ...other })直接从传入的props对象中提取small和children两个属性,...other是剩余运算符,把剩下的所有props都收集到other对象里,这样后面可以把这些额外props透传给ImageButton; : AddEmojiButtonPropTypes:这是Flow的类型注解,指定这个组件接收的props必须严格符合前面定义的AddEmojiButtonPropTypes类型,在编译阶段就能检测出props类型错误,提前规避bug。
4. JSX渲染逻辑
<ImageButton type="button" {...other} > {small ? ( <img alt="Add Emoji" src="https://res.cloudinary.com/df9jsefb9/image/upload/c_scale,h_54,q_auto/v1503278075/assets/btn-add-emoji-small.svg" /> ) : ( <img alt="Add Emoji" src="https://res.cloudinary.com/df9jsefb9/image/upload/c_scale,h_72,q_auto/v1503278075/assets/btn-add-emoji-large.svg" /> )} {children} </ImageButton>
<ImageButton type="button" {...other} >:把固定的type="button"和剩余的props(通过...other扩展运算符传递)都传给ImageButton,这样父组件传入的额外props(比如onClick、className)都会被透传给基础按钮组件,增强了组件的灵活性;- 条件渲染:
{small ? ... : ...}根据smallprops的值动态渲染小尺寸或大尺寸的表情按钮图片,实现了按钮的响应式样式切换; {children}:渲染父组件传入的子元素,让这个按钮组件支持嵌套内容(比如文字、图标),提升了组件的复用性。
5. 运行时校验与默认值(补充说明)
虽然原代码里没写,但通常会配合Flow加上PropTypes和defaultProps,用来做运行时的校验和默认值设置:
AddEmojiButton.propTypes = { small: PropTypes.bool, children: PropTypes.node, }; AddEmojiButton.defaultProps = { small: false, };
propTypes:在开发环境下,如果父组件传入的small不是布尔值,或者children不符合node类型(React元素、字符串、数字等),控制台会抛出警告;defaultProps:给可选的small设置默认值false,确保当父组件没传这个props时,组件默认渲染大尺寸按钮,避免渲染异常。
内容的提问来源于stack exchange,提问作者Jungwoo Lee
相关产品推荐
相关产品推荐

