Skip to content
This repository was archived by the owner on Mar 15, 2025. It is now read-only.

Commit 37e4271

Browse files
authored
Version 0.3.0, now using percentages. (#9)
* updated to use percentages * remove unneeded width * cleaned up code and updated readme * bump version to 0.3.0 * updated changelog
1 parent 5166776 commit 37e4271

File tree

9 files changed

+131
-101
lines changed

9 files changed

+131
-101
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 0.3.0
2+
- Updated to work with React Native 0.42. Internal components now rely on percentages.
3+
14
## 0.2.2 (May 9, 2016)
25

36
### react-native-flexbox-grid

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ The main difference is you can specify the grid size. By default `<Row>` is a si
5151

5252
[Documentation](https://github.com/rundmt/react-native-flexbox-grid/wiki/Documentation)
5353

54+
#### Changes for 0.3.0
55+
56+
React Native now supports percentages as of 0.42. All of our versions going forward will rely on percentages. It has much faster performance compared to what we did before when we relied on `onLayout`. The API for apps is the same. There should be no difference in expected output of your app.
57+
5458
#### Changes for 0.2.0
5559

5660
As of 0.2.0 Row will automatically wrap components. If you do not want components to automatically wrap you must specify `nowrap` in the row's prop.
@@ -59,6 +63,11 @@ As of 0.2.0 Row will automatically wrap components. If you do not want component
5963
<Row size={12} nowrap>
6064
```
6165

66+
## Known Issues
67+
68+
For react-native 0.41 and earlier you muse use `[email protected]` or earlier.
69+
70+
Since React Native before 0.41 and earlier doesn't support percentages we have to rely on using React Native's `onlayout` to pass the width of the parent to the child. This causes layouts to be a bit slow, because the child has to wait for the parent to layout and then rerender. This problem is resolved by using react native 0.42 and the `[email protected]` or later.
6271

6372

6473
### What's working

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-native-flexbox-grid",
3-
"version": "0.2.2",
3+
"version": "0.3.0",
44
"description": "Grid system for react native based on flexbox grid's api",
55
"main": "src/index.js",
66
"scripts": {

src/components/Column.js

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,53 @@
1-
'use strict';
2-
31
import React, {Component, PropTypes} from 'react';
42
import {screenSize} from '../lib/ScreenSize';
53
import {isHidden, getComponentWidth, getComponentOffset} from '../lib/helpers';
64
import {View} from 'react-native';
75

8-
export default class Column extends Component {
9-
render(){
10-
if(isHidden(screenSize, this.props)){
6+
const Column = (props) => {
7+
const {
8+
sm,
9+
smOffset,
10+
smHidden,
11+
md,
12+
mdOffset,
13+
mdHidden,
14+
lg,
15+
lgOffset,
16+
lgHidden,
17+
rowSize,
18+
...rest
19+
} = props;
20+
21+
const gridProps = {
22+
sm,
23+
smOffset,
24+
smHidden,
25+
md,
26+
mdOffset,
27+
mdHidden,
28+
lg,
29+
lgOffset,
30+
lgHidden,
31+
rowSize
32+
};
33+
34+
if(isHidden(screenSize, gridProps)){
1135
return null;
1236
} else {
1337
return (
1438
<View
15-
{...this.props}
16-
style={[this.props.style, {width: getComponentWidth(screenSize, this.props), flexDirection: 'column', marginLeft: getComponentOffset(screenSize, this.props)}]}>
17-
{this.props.children}
39+
{...rest}
40+
style={[
41+
props.style, {
42+
width: getComponentWidth(screenSize, gridProps),
43+
flexDirection: 'column',
44+
marginLeft: getComponentOffset(screenSize, gridProps)
45+
}]}>
46+
{rest.children}
1847
</View>
1948
);
2049
}
21-
}
22-
}
50+
};
2351

2452
Column.propTypes = {
2553
sm: PropTypes.number,
@@ -31,5 +59,6 @@ Column.propTypes = {
3159
lg: PropTypes.number,
3260
lgOffset: PropTypes.number,
3361
lgHidden: PropTypes.bool,
34-
width: PropTypes.number
3562
};
63+
64+
export default Column;

src/components/Row.js

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,33 @@
1-
'use strict';
2-
31
import React, {Component, PropTypes} from 'react';
42
import {screenSize} from '../lib/ScreenSize';
53
import {isHidden} from '../lib/helpers';
64
import {View} from 'react-native';
75

8-
export default class Row extends Component {
9-
constructor(props){
10-
super(props);
11-
this.state = {
12-
width: 0
13-
};
14-
}
15-
16-
_getWidth(res){
17-
this.setState({width: res.nativeEvent.layout.width});
18-
}
19-
20-
_cloneElements(){
21-
// Check if state is updated before cloning. Causes layout to rerender less.
22-
if(this.state.width > 0){
23-
//if size doesn't exist or is 0 default to 12
24-
const rowSize = this.props.size > 0 ? this.props.size : 12;
6+
const cloneElements = (props) => {
7+
//if size doesn't exist or is 0 default to 12
8+
const rowSize = props.size > 0 ? props.size : 12;
259

26-
return React.Children.map(this.props.children, (element) => {
27-
return React.cloneElement(element, {parentWidth: this.state.width, rowSize: rowSize});
28-
});
29-
}
30-
}
10+
return React.Children.map(props.children, (element) => {
11+
return React.cloneElement(element, {rowSize: rowSize});
12+
});
13+
}
3114

32-
render() {
33-
if(isHidden(screenSize, this.props)){
15+
const Row = (props) => {
16+
if(isHidden(screenSize, props)){
3417
return null;
3518
} else {
3619
return (
37-
<View {...this.props}
38-
onLayout={this._getWidth.bind(this)}
39-
style={[this.props.style,
20+
<View {...props}
21+
style={[props.style,
4022
{ flexDirection: 'row',
41-
flexWrap: this.props.nowrap ? 'nowrap' : 'wrap',
42-
alignItems: this.props.alignItems,
43-
justifyContent: this.props.justifyContent}]}>
44-
{this._cloneElements()}
23+
flexWrap: props.nowrap ? 'nowrap' : 'wrap',
24+
alignItems: props.alignItems,
25+
justifyContent: props.justifyContent
26+
}]}>
27+
{cloneElements(props)}
4528
</View>
4629
);
4730
}
48-
}
4931
}
5032

5133
Row.propTypes = {
@@ -55,3 +37,5 @@ Row.propTypes = {
5537
mdHidden: PropTypes.bool,
5638
lgHidden: PropTypes.bool,
5739
};
40+
41+
export default Row;

src/lib/helpers.js

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module.exports.isHidden = function(screenSize, props){
1+
const isHidden = (screenSize, props) => {
22
switch(screenSize) {
33
case 'small':
44
return props.smHidden ? true : false;
@@ -11,31 +11,33 @@ module.exports.isHidden = function(screenSize, props){
1111
}
1212
};
1313

14-
module.exports.getComponentWidth = function(screenSize, props){
14+
const toPercent = (num) => (num * 100) + '%';
15+
16+
const getComponentWidth = (screenSize, props) => {
1517
switch(screenSize) {
1618
case 'small':
1719
if(props.sm){
18-
return props.parentWidth * props.sm/props.rowSize;
20+
return toPercent(props.sm/props.rowSize);
1921
} else {
2022
return props.parentWidth;
2123
}
2224
break;
2325
case 'medium':
2426
if(props.md){
25-
return props.parentWidth * props.md/props.rowSize;
27+
return toPercent(props.md/props.rowSize);
2628
} else if(props.sm){
27-
return props.parentWidth * props.sm/props.rowSize;
29+
return toPercent(props.sm/props.rowSize);
2830
} else {
2931
return props.parentWidth;
3032
}
3133
break;
3234
case 'large':
3335
if(props.lg){
34-
return props.parentWidth * props.lg/props.rowSize;
36+
return toPercent(props.lg/props.rowSize);
3537
} else if(props.md){
36-
return props.parentWidth * props.md/props.rowSize;
38+
return toPercent(props.md/props.rowSize);
3739
} else if(props.sm){
38-
return props.parentWidth * props.sm/props.rowSize;
40+
return toPercent(props.sm/props.rowSize);
3941
} else {
4042
return props.parentWidth;
4143
}
@@ -45,31 +47,31 @@ module.exports.getComponentWidth = function(screenSize, props){
4547
}
4648
};
4749

48-
module.exports.getComponentOffset = function(screenSize, props){
50+
const getComponentOffset = (screenSize, props) => {
4951
switch(screenSize) {
5052
case 'small':
5153
if(props.smOffset){
52-
return props.parentWidth * props.smOffset/props.rowSize;
54+
return toPercent(props.smOffset/props.rowSize);
5355
} else {
5456
return 0;
5557
}
5658
break;
5759
case 'medium':
5860
if(props.mdOffset){
59-
return props.parentWidth * props.mdOffset/props.rowSize;
61+
return toPercent(props.mdOffset/props.rowSize);
6062
} else if(props.smOffset){
61-
return props.parentWidth * props.smOffset/props.rowSize;
63+
return toPercent(props.smOffset/props.rowSize);
6264
} else {
6365
return 0;
6466
}
6567
break;
6668
case 'large':
6769
if(props.lgOffset){
68-
return props.parentWidth * props.lgOffset/props.rowSize;
70+
return toPercent(props.lgOffset/props.rowSize);
6971
} else if(props.mdOffset){
70-
return props.parentWidth * props.mdOffset/props.rowSize;
72+
return toPercent(props.mdOffset/props.rowSize);
7173
} else if(props.smOffset){
72-
return props.parentWidth * props.smOffset/props.rowSize;
74+
return toPercent(props.smOffset/props.rowSize);
7375
} else {
7476
return 0;
7577
}
@@ -78,3 +80,5 @@ module.exports.getComponentOffset = function(screenSize, props){
7880
return 0;
7981
}
8082
};
83+
84+
module.exports = {isHidden, getComponentWidth, getComponentOffset}

tests/getComponentOffset-specs.js

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,27 @@ var assert = require('assert');
33

44
describe('Get Component Width ', function() {
55
it('it should get component width for small screen', function () {
6-
assert.equal(320, getComponentOffset('small', {parentWidth: 320, rowSize: 12, smOffset: 12, mdOffset: 6, lgOffset: 4}));
7-
assert.equal(160, getComponentOffset('small', {parentWidth: 320, rowSize: 12, smOffset: 6, mdOffset: 6, lgOffset: 4}));
8-
assert.equal(80, getComponentOffset('small', {parentWidth: 320, rowSize: 12, smOffset: 3, mdOffset: 4, lgOffset: 4}));
9-
assert.equal(0, getComponentOffset('small', {parentWidth: 768, rowSize: 12}));
6+
assert.equal('100%', getComponentOffset('small', {rowSize: 12, smOffset: 12, mdOffset: 6, lgOffset: 4}));
7+
assert.equal('50%', getComponentOffset('small', {rowSize: 12, smOffset: 6, mdOffset: 6, lgOffset: 4}));
8+
assert.equal('25%', getComponentOffset('small', {rowSize: 12, smOffset: 3, mdOffset: 4, lgOffset: 4}));
9+
assert.equal(0, getComponentOffset('small', {rowSize: 12}));
1010
});
1111

1212
it('it should get component width for medium screen', function () {
13-
assert.equal(768, getComponentOffset('medium', {parentWidth: 768, rowSize: 12, smOffset: 12, mdOffset: 12, lgOffset: 4}));
14-
assert.equal(384, getComponentOffset('medium', {parentWidth: 768, rowSize: 12, smOffset: 6, mdOffset: 6, lgOffset: 4}));
15-
assert.equal(192, getComponentOffset('medium', {parentWidth: 768, rowSize: 12, smOffset: 3, mdOffset: 3, lgOffset: 4}));
16-
assert.equal(768, getComponentOffset('medium', {parentWidth: 768, rowSize: 12, smOffset: 12, mdOffset: 12, lgOffset: 12}));
17-
assert.equal(384, getComponentOffset('medium', {parentWidth: 768, rowSize: 12, smOffset: 12, mdOffset: 6, lgOffset: 12}));
18-
assert.equal(192, getComponentOffset('medium', {parentWidth: 768, rowSize: 12, smOffset: 12, mdOffset: 3, lgOffset: 12}));
19-
assert.equal(0, getComponentOffset('medium', {parentWidth: 768, rowSize: 12}));
13+
assert.equal('100%', getComponentOffset('medium', {rowSize: 12, smOffset: 12, mdOffset: 12, lgOffset: 4}));
14+
assert.equal('50%', getComponentOffset('medium', {rowSize: 12, smOffset: 6, mdOffset: 6, lgOffset: 4}));
15+
assert.equal('25%', getComponentOffset('medium', {rowSize: 12, smOffset: 3, mdOffset: 3, lgOffset: 4}));
16+
assert.equal('100%', getComponentOffset('medium', {rowSize: 12, smOffset: 12, mdOffset: 12, lgOffset: 12}));
17+
assert.equal('50%', getComponentOffset('medium', {rowSize: 12, smOffset: 12, mdOffset: 6, lgOffset: 12}));
18+
assert.equal('25%', getComponentOffset('medium', {rowSize: 12, smOffset: 12, mdOffset: 3, lgOffset: 12}));
19+
assert.equal(0, getComponentOffset('medium', {rowSize: 12}));
2020
});
2121

2222
it('it should get component width for large screen', function () {
23-
assert.equal(1024, getComponentOffset('large', {parentWidth: 1024, rowSize: 12, smOffset: 12, mdOffset: 12}));
24-
assert.equal(1024, getComponentOffset('large', {parentWidth: 1024, rowSize: 12, smOffset: 12}));
25-
assert.equal(512, getComponentOffset('large', {parentWidth: 1024, rowSize: 12, smOffset: 6, mdOffset: 6, lgOffset: 6}));
26-
assert.equal(512, getComponentOffset('large', {parentWidth: 1024, rowSize: 12, smOffset: 6, mdOffset: 6}));
27-
assert.equal(0, getComponentOffset('large', {parentWidth: 1024, rowSize: 12}));
23+
assert.equal('100%', getComponentOffset('large', {rowSize: 12, smOffset: 12, mdOffset: 12}));
24+
assert.equal('100%', getComponentOffset('large', {rowSize: 12, smOffset: 12}));
25+
assert.equal('50%', getComponentOffset('large', {rowSize: 12, smOffset: 6, mdOffset: 6, lgOffset: 6}));
26+
assert.equal('50%', getComponentOffset('large', {rowSize: 12, smOffset: 6, mdOffset: 6}));
27+
assert.equal(0, getComponentOffset('large', {rowSize: 12}));
2828
});
2929
});

tests/getComponentWidth-specs.js

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,27 @@ var getComponentWidth = require('../src/lib/helpers').getComponentWidth;
22
var assert = require('assert');
33

44
describe('Get Component Width ', function() {
5-
it('it should get component width for small screen', function () {
6-
assert.equal(320, getComponentWidth('small', {parentWidth: 320, rowSize: 12, sm: 12, md: 6, lg: 4}));
7-
assert.equal(160, getComponentWidth('small', {parentWidth: 320, rowSize: 12, sm: 6, md: 6, lg: 4}));
8-
assert.equal(80, getComponentWidth('small', {parentWidth: 320, rowSize: 12, sm: 3, md: 4, lg: 4}));
5+
it('should get component width for small screen', function () {
6+
assert.equal('100%', getComponentWidth('small', {rowSize: 12, sm: 12, md: 6, lg: 4}));
7+
assert.equal('50%', getComponentWidth('small', {rowSize: 12, sm: 6, md: 6, lg: 4}));
8+
assert.equal('25%', getComponentWidth('small', {rowSize: 12, sm: 3, md: 4, lg: 4}));
99
});
1010

11-
it('it should get component width for medium screen', function () {
12-
assert.equal(768, getComponentWidth('medium', {parentWidth: 768, rowSize: 12, sm: 12, md: 12, lg: 4}));
13-
assert.equal(384, getComponentWidth('medium', {parentWidth: 768, rowSize: 12, sm: 6, md: 6, lg: 4}));
14-
assert.equal(192, getComponentWidth('medium', {parentWidth: 768, rowSize: 12, sm: 3, md: 3, lg: 4}));
15-
assert.equal(768, getComponentWidth('medium', {parentWidth: 768, rowSize: 12, sm: 12, md: 12, lg: 12}));
16-
assert.equal(384, getComponentWidth('medium', {parentWidth: 768, rowSize: 12, sm: 12, md: 6, lg: 12}));
17-
assert.equal(192, getComponentWidth('medium', {parentWidth: 768, rowSize: 12, sm: 12, md: 3, lg: 12}));
11+
it('should get component width for medium screen', function () {
12+
assert.equal('100%', getComponentWidth('medium', {rowSize: 12, sm: 12, md: 12, lg: 4}));
13+
assert.equal('50%', getComponentWidth('medium', {rowSize: 12, sm: 6, md: 6, lg: 4}));
14+
assert.equal('25%', getComponentWidth('medium', {rowSize: 12, sm: 3, md: 3, lg: 4}));
15+
assert.equal('100%', getComponentWidth('medium', {rowSize: 12, sm: 12, md: 12, lg: 12}));
16+
assert.equal('50%', getComponentWidth('medium', {rowSize: 12, sm: 12, md: 6, lg: 12}));
17+
assert.equal('25%', getComponentWidth('medium', {rowSize: 12, sm: 12, md: 3, lg: 12}));
1818
});
1919

20-
it('it should get component width for large screen', function () {
21-
assert.equal(1024, getComponentWidth('large', {parentWidth: 1024, rowSize: 12, sm: 12, md: 12}));
22-
assert.equal(1024, getComponentWidth('large', {parentWidth: 1024, rowSize: 12, sm: 12}));
23-
assert.equal(512, getComponentWidth('large', {parentWidth: 1024, rowSize: 12, sm: 6, md: 6, lg: 6}));
24-
assert.equal(512, getComponentWidth('large', {parentWidth: 1024, rowSize: 12, sm: 6, md: 6}));
25-
assert.equal(256, getComponentWidth('large', {parentWidth: 1024, rowSize: 12, sm: 3}));
20+
it('should get component width for large screen', function () {
21+
assert.equal('100%', getComponentWidth('large', {rowSize: 12, sm: 12, md: 12}));
22+
assert.equal('100%', getComponentWidth('large', {rowSize: 12, sm: 12}));
23+
assert.equal('50%', getComponentWidth('large', {rowSize: 12, sm: 6, md: 6, lg: 6}));
24+
assert.equal('50%', getComponentWidth('large', {rowSize: 12, sm: 6, md: 6}));
25+
assert.equal('25%', getComponentWidth('large', {rowSize: 12, sm: 3}));
26+
assert.equal('100%', getComponentWidth('large', {rowSize: 12, sm: 3, lg: 12}));
2627
});
2728
});

0 commit comments

Comments
 (0)