What is the point of StyleSheet.create

前端 未结 3 1910
旧时难觅i
旧时难觅i 2020-12-05 17:01

I\'m reading the React Native docs / tutorial, and I\'m wondering what the point of the StyleSheet.create function is.

For example, the tutorial has the

相关标签:
3条回答
  • 2020-12-05 17:22

    StyleSheet.create does not add performance gains anymore.

    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/29265#issuecomment-430783289

    quoting the github comment:

    @alloy I understand what docs says, but can prove that code:

    const myStyle: ViewStyle = { flex: 1 } export const FlexView:
    React.SFC = (props) => <View style={myStyle}>{props.children}</View>
    

    has almost same performance (even slightly faster) compared to

    const s = StyleSheet.create({ flex: { flex: 1 } }) 
    export const FlexView: React.SFC = (props) => <View style={s.flex}>{props.children}</View> 
    

    because if you look at sources, you discover that latest chunk effectively extracted to this (see: https://github.com/facebook/react-native/blob/0.57-stable/Libraries/StyleSheet/StyleSheet.js#L373):

    const s = { flex: { flex: 1 } }
    export const FlexView = (props) => <View style={s.flex}>{props.children}</View>
    

    And yes, in previous versions of RN it was global registry of styles, but it was even more slow, because it never crossed bridge border actually (proof from 0.55 branch)

    0 讨论(0)
  • 2020-12-05 17:27

    Here is there source code of create.

    create<T: Object, U>(obj: T): {[key:$Keys<T>]: number} {
      var result: T = (({}: any): T);
      for (var key in obj) {
        StyleSheetValidation.validateStyle(key, obj);
        result[key] = ReactNativePropRegistry.register(obj[key]);
      }
      return result;
    }
    

    I am not an expert of React in any. I actually never used it but here are my insights. It seems that create does some kind of validation over your keys and register them to React.

    I think you could skip the validation by simply not calling create but I'm not sure what ReactNativePropRegistry.register does exactly.

    Reference to the source

    0 讨论(0)
  • 2020-12-05 17:36

    TL;DR Always use StyleSheet.create() when you can.

    The answer by Nico is correct, but there is more to it.

    To summarize:

    1. It validates the styles as mentioned by Nico
    2. As mentioned in the documentation:

    Making a stylesheet from a style object makes it possible to refer to it by ID instead of creating a new style object every time.

    1. Also mentioned in the documentation:

    It also allows to send the style only once through the bridge. All subsequent uses are going to refer an id (not implemented yet).

    As you might know, sending the data across the bridge is a very costly operation that has significant impact on the performance of the application. So, using StyleSheet.create() you reduce the strain on the bridge.

    0 讨论(0)
提交回复
热议问题