React Refactoring 组件有太多的道具
React Refactoring component with too many props
我有一个组件“Collage”,它呈现 4 种类型的图像:BANNER、SQUARE、PORTRAIT 和 POSTER。
function Collage({ banner, square, portrait, poster }) {
return (
<View>
<Image uri={banner?.uri} style={styles.banner} />
<Image uri={square?.uri} style={styles.square} />
<Image uri={portrait?.uri} style={styles.portrait} />
<Image uri={poster?.uri} style={styles.poster} />
</View>
);
}
Collage.propTypes = {
banner: PropTypes.shape({
uri: PropTypes.string.isRequired
}),
square: PropTypes.shape({
uri: PropTypes.string.isRequired
}),
portrait: PropTypes.shape({
uri: PropTypes.string.isRequired
}),
poster: PropTypes.shape({
uri: PropTypes.string.isRequired
}),
}
现在,我想添加在按下拼贴图像时执行某些操作(每个图像不同)的功能。
类似于:
<Collage
banner={banner}
onPressBanner={handleOnPressBanner}
square={square}
onPressSquare={handleOnPressSquare}
portrait={portrait}
onPressPortrait={handleOnPressPortrait}
poster={poster}
onPressPoster={handleOnPressPoster}
/>
...
function Collage({ banner, onPressBanner ... }) {
return (
<View>
<TouchableOpacity onPress={onPressBanner}>
<Image uri={banner?.uri} style={styles.banner} />
</TouchableOpacity>
... repeat for others
</View>
);
}
在我看来,这似乎是不专业的代码,并且可能有一种方法可以使其更简单,使用更少的道具和更多的泛化。有什么想法吗?
我会延长评论:
您要么想在 Collage 组件中创建函数(而不是将它们作为道具接收)
或者将图像数组发送到 View
组件。类似于:
function Collage({ images }) {
return (
<View>
images.map(image => (
<Image key={`collage-image-${image.type}`} uri={image.uri} style={styles[image.type]} onClick={image.onClick} />
)
</View>
);
}
其中 images 是一个数组,每个数组元素包含一个 uri、一个类型(在您的情况下应该是 banner, square, portrait, poster
之一)和一个点击处理程序。
警告:如果您在同一页面上有多个拼贴画,您可能需要发送一些额外的道具以确保您不会two children with the same key
我有一个组件“Collage”,它呈现 4 种类型的图像:BANNER、SQUARE、PORTRAIT 和 POSTER。
function Collage({ banner, square, portrait, poster }) {
return (
<View>
<Image uri={banner?.uri} style={styles.banner} />
<Image uri={square?.uri} style={styles.square} />
<Image uri={portrait?.uri} style={styles.portrait} />
<Image uri={poster?.uri} style={styles.poster} />
</View>
);
}
Collage.propTypes = {
banner: PropTypes.shape({
uri: PropTypes.string.isRequired
}),
square: PropTypes.shape({
uri: PropTypes.string.isRequired
}),
portrait: PropTypes.shape({
uri: PropTypes.string.isRequired
}),
poster: PropTypes.shape({
uri: PropTypes.string.isRequired
}),
}
现在,我想添加在按下拼贴图像时执行某些操作(每个图像不同)的功能。
类似于:
<Collage
banner={banner}
onPressBanner={handleOnPressBanner}
square={square}
onPressSquare={handleOnPressSquare}
portrait={portrait}
onPressPortrait={handleOnPressPortrait}
poster={poster}
onPressPoster={handleOnPressPoster}
/>
...
function Collage({ banner, onPressBanner ... }) {
return (
<View>
<TouchableOpacity onPress={onPressBanner}>
<Image uri={banner?.uri} style={styles.banner} />
</TouchableOpacity>
... repeat for others
</View>
);
}
在我看来,这似乎是不专业的代码,并且可能有一种方法可以使其更简单,使用更少的道具和更多的泛化。有什么想法吗?
我会延长评论:
您要么想在 Collage 组件中创建函数(而不是将它们作为道具接收)
或者将图像数组发送到 View
组件。类似于:
function Collage({ images }) {
return (
<View>
images.map(image => (
<Image key={`collage-image-${image.type}`} uri={image.uri} style={styles[image.type]} onClick={image.onClick} />
)
</View>
);
}
其中 images 是一个数组,每个数组元素包含一个 uri、一个类型(在您的情况下应该是 banner, square, portrait, poster
之一)和一个点击处理程序。
警告:如果您在同一页面上有多个拼贴画,您可能需要发送一些额外的道具以确保您不会two children with the same key