将props传递到 React Native 中的外部样式表?

IT技术 javascript reactjs react-native react-jsx jsx
2021-04-10 06:57:30

我是 React 和 React Native 的新手。目前,对于每个组件,我将代码分成 2 个单独的文件:

  1. index.js 对于所有 React 代码,以及;
  2. styles.js 对于样式表

有没有办法将props传递到外部样式表中?

示例 index.js::

render() {
  const iconColor = this.props.color || '#000';
  const iconSize = this.props.size || 25;

  return (
    <Icon style={styles.icon} />
  );
}

示例styles.js

const styles = StyleSheet.create({
  icon : {
    color: iconColor,
    fontSize: iconSize
  }
});

上面的代码不起作用,但更多的是为了理解我正在尝试做的事情。任何帮助深表感谢!

5个回答

我宁愿将我的样式放在一个单独的文件 style.js 中。在styles.js 中:

export const styles = (props) => StyleSheet.create({
        icon : {
        color: props.iconColor,
        fontSize: props.iconSize
      }
    }

在主类中,您可以传递值

return (
    <Icon style={styles(this.props).icon} />
  );

或者,您可以直接使用这些值

export const styles = (iconColor,iconSize) => StyleSheet.create({
    icon : {
    color: iconColor,
    fontSize: iconSize
  }
}

在你的主班里

return (
    <Icon style={styles(this.props,iconColor, 
this.props.iconSize).icon} />
 );
使用此方法是否有任何性能缺陷,因为这会启动箭头函数?
2021-06-03 06:57:30
@JohnStuart“性能缺陷”与典型的内联样式完全相同:每次组件渲染时都会创建一个新的样式对象,因为每次组件渲染时都会调用 stylesheet.create 。不过,在实践中,它甚至不太可能有一点影响。
2021-06-14 06:57:30

我在样式表中发送 noFooter boolean prop

   <View style={styles.mainFooterCont(noFooter)}>
     <Text> Testing </Text>
    </View>

并收到它喜欢

  mainFooterCont: noFooter => ({
   flexDirection: 'row',
   justifyContent: 'space-between',
   alignItems: 'flex-end',
   paddingBottom: noFooter ? 0 : 20,
   paddingTop: Metrics.ratio(noFooter ? 0 : 5),
   }),
@DomagojVuković 不知道typescript
2021-06-10 06:57:30
这似乎确实有效,但typescript会抱怨。
2021-06-19 06:57:30

创建一个类,将 iconColor 和 iconSize 作为参数并返回一个 StyleSheet 对象

// styles.js

export default class StyleSheetFactory {
    static getSheet(iconSize, iconColor) {
        return StyleSheet.create({
            icon : {
                color: iconColor,
                fontSize: iconSize
            }
        })
    }
}

// index.js

render() {
    let myStyleSheet = StyleSheetFactory.getSheet(64, 'red')
}
这确实有效,所以谢谢你。我将您传入的静态参数替换为 props 以使其更具动态性。但是,我不确定这是最优雅的解决方案。如果我有超过 2 个怎么办?我也不是 100% 确定拆分样式和反应代码是最好的,我只是想尽可能多地学习。再次感谢!
2021-05-22 06:57:30
@chapeljuice 我个人更喜欢不拆分样式,因为我发现它使代码更具可读性,并且更喜欢使用内联样式制作附加组件,而不是拥有一个巨大的样式表,我必须在其中查找样式 - 最后它归结为偏好,但有使用单独的工作表有什么好处,请参见stackoverflow.com/questions/39336266/... -
2021-06-19 06:57:30

只需将样式表包装在一个函数中,您可以选择在其中传递props。

代替:

const styles = StyleSheet.create({
  Title: { color: 'white' }
});

你做:

const styles = (props?: any) => StyleSheet.create({
  Title: { color: 'white' }
});

现在当你将它们添加到你的组件中时,而不是

style={styles.Title}

你做:

style={styles(propsObjectHere).Title}

由于这是可选的并且您没有props可以通过,只需执行以下操作:

style={styles().Title}

PS 如果您出于某种原因不使用 TypeScript,请忽略该类型:P

TBH,在使用它后反思这一点,我发现它非常混乱并且在你的风格中产生了不必要的依赖。我最终做的是创建静态样式,并通过样式属性在组件级别有条件地更改样式。<Component style={ StyleSheet.flatten([MainStyle, props.darkMode ? {color: '#333'} : {}]) } /> <== 未经测试的代码
2021-06-18 06:57:30

解决方案:

render() {

   const iconColor = this.props.color || '#000';
   const iconSize = this.props.size || 25;

   return (
   <Icon style={{...styles.icon, color: iconColor, fontSize: iconSize }} />

示例样式.js:

  const styles = StyleSheet.create({
  icon : {
    color: iconColor,
    fontSize: iconSize
  }})