reactjs - 如何集中不同的 proptypes
问题描述
我想集中可能包含不同属性并且需要或不需要的proptypes。举个例子:
组件 A 具有:
roomData: PropTypes.shape({
roomId: PropTypes.number,
roomType: PropTypes.string,
}).isRequired,
而组件 B 具有:
roomData: PropTypes.shape({
roomId: PropTypes.number.isRequired,
roomType: PropTypes.string.isRequired,
game: PropTypes.shape({
gameId: PropTypes.number.isRequired,
drawDescription: PropTypes.string.isRequired,
}).isRequired,
}),
如果两者完全一样,我知道该怎么做。问题在于它们不同。
解决方案
由于PropTypes.shape
期望一个普通的 JS 对象,您可以创建一个外部文件,在其中保存您的形状并在需要时使用/组合它们。
它会是这样的utils/propTypesShapes.js
:
import PropTypes from 'prop-types'
export const transformToRequired = (shape) => {
return Object.keys(shape).reduce((acc, curr) => {
acc[curr] = shape[curr].isRequired;
return acc;
}, {})
}
export const roomDataBaseShape = {
roomId: PropTypes.number,
roomType: PropTypes.string,
}
然后在您的组件中:
import { roomDataBaseShape, transformToRequired } from 'propTypes/shapes'
ComponentA.propTypes = {
roomData: PropTypes.shape(roomDataBaseShape).isRequired
}
ComponentB.propTypes = {
roomData: PropTypes.shape({
...transformToRequired(roomDataBaseShape),
game: PropTypes.shape({
gameId: PropTypes.number.isRequired,
drawDescription: PropTypes.string.isRequired
}).isRequired
})
}
推荐阅读
- php - 如何使用 laravel 在字段中插入唯一代码?
- android - 如何将用户名和密码映射到另一个移动应用程序以进行自动填充
- docker - Docker 量角器运行以 E/launcher 结束 - 进程退出并出现错误代码 135
- javascript - 如何管理包含主题数据的组件的单元测试快照?
- python-3.x - 两个相似的脚本创建不同的列表
- egl - EGL:EGL_SURFACE_TYPE 并渲染到纹理
- node.js - 在选择提示中修改选择验证 - Bot Framework
- python - 将来自不同数据框的聚合添加为列
- java - 当我尝试从不同的类调用方法时,空对象引用
- python - 如何解释 python 字节数组中的空格