- Hands-On Design Patterns with React Native
- Mateusz Grzesiukiewicz
- 397字
- 2021-08-13 15:12:57
Decoupling styles
In the preceding examples, you may have noticed that styles are tightly coupled to presentational components. Why tightly? Because we explicitly include them by using style={styles.container}, but the styles object is not configurable. We cannot replace any style part with props, and that tightly couples us to the existing implementation. In some cases, this is a desired behavior, but in others, it is not.
You will bump into this problem if you have tried to split code into separate files. How can we fix this issue?
Let the styles be the optional prop. If styles are not provided, then we can fall back to the default values:
// src/ Chapter_1/ Example_10_Decoupling_styles/ App.js
export const HelloBox = ({
isExpanded,
expandOrCollapse,
containerStyles,
expandedTextStyles
}) => (
<View style={containerStyles || styles.container}>
<HelloText onPress={() => expandOrCollapse()}>...</HelloText>
<HelloText onPress={() => expandOrCollapse()}>...</HelloText>
{
isExpanded &&
<HelloText style={expandedTextStyles || styles.text}>
...
</HelloText>
}
</View>
);
Notice the use of the || operator. In the preceding example (expandedTextStyles || styles.text), it first checks if expandedTextStyles is defined and if so returns that value. If expandedTextStyles is undefined, then it return styles.text, which is a default style object that was hard-coded by us.
Now, if we wish, in some places, we can override our styles by passing respective props:
render = () => (
<HelloBox
isExpanded={this.state.expanded}
expandOrCollapse={this.expandOrCollapse}
expandedTextStyles={{ color: 'red' }}
/>
);
This is how we split markup, styles, and logic. Remember to use presentational components as often as possible to make your features truly reusable across many screens/views.
- View: This is a presentational component.
- Model: This is a data representation, which in our case is the state that is built either in a stateful component or using so-called store and reducers (check Chapter 5, Store Patterns, to learn more details about what Redux is and how to use it).
- Controller: This is a container component that is responsible for application logic, including event handlers and services. It should be lean and import logic from the respective files.
- 編程的修煉
- 深入淺出Java虛擬機(jī):JVM原理與實(shí)戰(zhàn)
- DevOps入門與實(shí)踐
- Python高級(jí)編程
- Koa開發(fā):入門、進(jìn)階與實(shí)戰(zhàn)
- Learning Laravel 4 Application Development
- Expert Android Programming
- Hands-On GPU:Accelerated Computer Vision with OpenCV and CUDA
- Elasticsearch for Hadoop
- TMS320LF240x芯片原理、設(shè)計(jì)及應(yīng)用
- Android開發(fā)三劍客:UML、模式與測試
- 體驗(yàn)之道:從需求到實(shí)踐的用戶體驗(yàn)實(shí)戰(zhàn)
- C/C++程序設(shè)計(jì)教程
- Hands-On Data Visualization with Bokeh
- 軟件測試項(xiàng)目實(shí)戰(zhàn)之功能測試篇