启用 禁止道具规则后,eslint禁止我使用 style: React.PropTypes.object,建议使用 shape。
eslint
style: React.PropTypes.object
shape
但是真的有必要像这样定义所有可用的属性吗?
DEMO.propTypes = { style: React.PropTypes.shape({ color: React.PropTypes.string, fontSize: React.PropTypes.number, ... }) };
定义代码太多了!
一种可能性是这样使用 反应式原型机反应式原型机软件包:
import stylePropType from 'react-style-proptype'; MyComponent.propTypes = { style: stylePropType, };
View.propTypes.style
或者
Text.propTypes.style
它看起来像这样:
DEMO.propTypes = { style: Text.propTypes.style, ... };
Https://facebook.github.io/react-native/releases/0.21/docs/style.html#pass-styles-around
反应本机现在包含 ViewPropTypes,它将取代 View.propTypes.style。使用示例:
ViewPropTypes
import { ViewPropTypes } from 'react-native'; MyComponent.propTypes = { style: ViewPropTypes.style };
使用 ViewPropTypes.style。已不推荐使用 View.propTypes
ViewPropTypes.style
View.propTypes
我通常使用 PropTypes.objectOf(PropTypes.string)不需要定义所有的 css 样式。
PropTypes.objectOf(PropTypes.string)
又快又脏,像黑客一样
扩展@jalal246回答:
PropTypes.objectOf(PropTypes.oneOfType([ PropTypes.string, PropTypes.number, ]))
这可以用于 Web 样式(参考其他答案的反应本机) ,而不必使用其他包。
使用下面的简单代码。
PropTypes.oneOfType([PropTypes.object, PropTypes.array])
因此,您可以将您的代码应用于此。
DEMO.propTypes = { style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]), };
测试的 RN > 0.57。
有两种可能。第一种,我更喜欢,是使用反应中的 ViewPropType。另一个是使用 PropType 的:
Component.propTypes = { textStyles: PropTypes.oneOfType([ PropTypes.object, PropTypes.number ]) }
您可能会问“如果样式只是一个对象,为什么要使用 PropTypes.number?”答案是本地反应团队进行了一些优化,缓存了样式表并简单地发送了缓存的 ID。
对付 JSDoc 有个简单的办法。
/** * @typedef Props * @prop {React.CSSProperties} style */ /** * some component * @augments {Component<Props, State>} */ export default class SomeRandomClass extends React.Component { }
将上面的 JSDoc 添加到您的反应组件将使 VS Code 能够建议所有可能的 CSS 属性。
由于前面的一些答案已经被分解了,所以我将在这里分享我的解决方案。
实际上,您可以简单地从反应本机导入原始类型,如 ViewStyle、 TextStyle、 ImageStyle、 FlexStyle和 ImageStyle。
ViewStyle
TextStyle
ImageStyle
FlexStyle
例如:
import React from 'react'; import { TouchableOpacity, ViewStyle } from 'react-native'; interface IProps { style?: ViewStyle } <TouchableOpacity style={[props.style]}> ... </TouchableOpacity>
备注: 如果您正在使用支持 TypeScript 的第三方库,那么也应该有相关的样式属性,就像上面的例子一样。