React Native中同一组件能否同时传入Stylesheet与自定义样式?
样式合并问题解答
完全可以在同一个组件上同时传入StyleSheet定义的样式和自定义动态样式,但你写的&&拼接写法是错误的,达不到样式合并的效果。
- 错误写法的问题:JS里
&&是逻辑与运算符,只要左侧值为真值,整个表达式就会直接返回右侧值。你写的style = {styles.text} && {{color: colors.text}}最终只会传入后面的内联颜色对象,styles.text里定义的marginBottom、fontWeight、fontSize这些属性会全部丢失。 - React Native 原生支持样式合并的标准写法:给
style属性传入样式数组就行,数组里靠后的样式优先级更高,同名属性会自动覆盖前面的定义。
正确写法示例:
<View> <Text style={[styles.text, { color: colors.text }]}> hello this is a sample image with text</Text> </View>
这种写法刚好适配你当前做深色模式适配的场景:把不随主题变化的固定样式(边距、字号、字重等)全部写在静态的StyleSheet.create定义里,把随主题变化的动态属性(文字颜色、背景色等)单独写成内联对象,放到样式数组的后半段覆盖默认值即可,这本身就是React Native主题适配的通用方案,没有额外性能问题。
顺便说下你之前遇到的「无法在StyleSheet中调用useTheme返回的colors属性」的原因:StyleSheet.create是在组件渲染逻辑外执行的,执行时机早于组件内hook的调用,本来就拿不到组件内useTheme()返回的动态主题值,不需要找复杂方案绕这个限制,用上面的数组合并写法就能解决问题。
内容的提问来源于stack exchange,提问作者Corey Sutton
相关产品推荐
相关产品推荐

