Skip to content

Commit 1a9765f

Browse files
Nicolas Gallagherrxaviers
authored andcommitted
Miminize work taking place in 'render'
1 parent bb122f2 commit 1a9765f

File tree

8 files changed

+45
-35
lines changed

8 files changed

+45
-35
lines changed

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
"README.md",
1111
"src/"
1212
],
13-
"scripts": {},
13+
"scripts": {
14+
"test": "grunt test"
15+
},
1416
"keywords": [
1517
"react",
1618
"globalize",

src/currency.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ import React from "react";
22
import generator from "./generator";
33
import "globalize/currency";
44

5-
export default React.createClass(generator("formatCurrency", ["value", "currency", "options"]));
5+
export default generator("formatCurrency", ["value", "currency", "options"]);

src/date.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ import React from "react";
22
import generator from "./generator";
33
import "globalize/date";
44

5-
export default React.createClass(generator("formatDate", ["value", "options"]));
5+
export default generator("formatDate", ["value", "options"]);

src/generator.js

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from "react";
22
import Globalize from "globalize";
33

4-
var commonProps = ["elements", "locale"];
4+
var commonPropNames = ["elements", "locale"];
55

66
function capitalizeFirstLetter(string) {
77
return string.charAt(0).toUpperCase() + string.slice(1);
@@ -13,42 +13,43 @@ function omit(set) {
1313
};
1414
}
1515

16-
function generator(fn, argArray, options) {
17-
var Fn = capitalizeFirstLetter(fn);
16+
function generator(fn, localPropNames, options) {
1817
options = options || {};
18+
var Fn = capitalizeFirstLetter(fn);
1919
var beforeFormat = options.beforeFormat || function() {};
2020
var afterFormat = options.afterFormat || function(formattedValue) {
2121
return formattedValue;
2222
};
23-
return {
23+
var globalizePropNames = commonPropNames.concat(localPropNames);
24+
25+
return React.createClass({
2426
displayName: Fn,
25-
format: function() {
26-
return this.instance[fn].apply(this.instance, this.args);
27+
componentWillMount: function() {
28+
this.setup(this.props);
2729
},
28-
render: function() {
29-
var props = this.props;
30-
this.instance = Globalize;
31-
this.args = argArray.map(function(element) {
32-
return props[element];
33-
});
34-
35-
// otherProps = this.props - argArray - commonProps.
36-
var otherProps = Object.keys(props).filter(omit(argArray)).filter(omit(commonProps)).reduce(function(memo, propKey) {
30+
componentWillReceiveProps: function(nextProps) {
31+
this.setup(nextProps);
32+
},
33+
setup: function(props) {
34+
this.globalize = props.locale ? Globalize(props.locale) : Globalize;
35+
this.domProps = Object.keys(props).filter(omit(globalizePropNames)).reduce(function(memo, propKey) {
3736
memo[propKey] = props[propKey];
3837
return memo;
3938
}, {});
4039

41-
// Get value from this.props.children.
42-
this.args[0] = props.children;
43-
44-
if (props.locale) {
45-
this.instance = Globalize(props.locale);
46-
}
40+
this.globalizePropValues = localPropNames.map(function(element) {
41+
return props[element];
42+
});
43+
this.globalizePropValues[0] = props.children;
4744

4845
beforeFormat.call(this);
49-
return React.DOM.span(otherProps, afterFormat.call(this, this.format()));
46+
const formattedValue = this.globalize[fn].apply(this.globalize, this.globalizePropValues);
47+
this.value = afterFormat.call(this, formattedValue);
48+
},
49+
render: function() {
50+
return React.DOM.span(this.domProps, this.value);
5051
}
51-
};
52+
});
5253
}
5354

5455
export default generator;

src/message.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import generator from "./generator";
44
import "globalize/message";
55
import "globalize/plural";
66

7-
function messageSetup(componentProps, instance, args) {
7+
function messageSetup(componentProps, globalize, args) {
88
var defaultMessage, path;
99
var children = componentProps.children;
1010
var scope = componentProps.scope;
@@ -19,7 +19,7 @@ function messageSetup(componentProps, instance, args) {
1919
}
2020

2121
function getMessage() {
22-
return instance.cldr.get(["globalize-messages/{bundle}"].concat(path));
22+
return globalize.cldr.get(["globalize-messages/{bundle}"].concat(path));
2323
}
2424

2525
function setMessage(message) {
@@ -37,7 +37,7 @@ function messageSetup(componentProps, instance, args) {
3737
}
3838
node[path[i]] = value;
3939
}
40-
set(data, [instance.cldr.attributes.bundle].concat(path), message);
40+
set(data, [globalize.cldr.attributes.bundle].concat(path), message);
4141
Globalize.loadMessages(data);
4242
}
4343

@@ -65,7 +65,7 @@ function messageSetup(componentProps, instance, args) {
6565
}
6666

6767
// Development mode only.
68-
if (instance.cldr) {
68+
if (globalize.cldr) {
6969
if (!getMessage()) {
7070
defaultMessage = defaultMessage || getDefaultMessage(children);
7171
setMessage(defaultMessage);
@@ -189,11 +189,11 @@ Globalize.prototype.messageFormatter = function(pathOrMessage) {
189189
return messageFormatterSuper.apply(this, arguments);
190190
};
191191

192-
export default React.createClass(generator("formatMessage", ["path", "variables"], {
192+
export default generator("formatMessage", ["path", "variables"], {
193193
beforeFormat: function() {
194-
messageSetup(this.props, this.instance, this.args);
194+
messageSetup(this.props, this.globalize, this.globalizePropValues);
195195
},
196196
afterFormat: function(formattedValue) {
197197
return replaceElements(this.props, formattedValue);
198198
}
199-
}));
199+
});

src/number.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ import React from "react";
22
import generator from "./generator";
33
import "globalize/number";
44

5-
export default React.createClass(generator("formatNumber", ["value", "options"]));
5+
export default generator("formatNumber", ["value", "options"]);

src/relative-time.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ import React from "react";
22
import generator from "./generator";
33
import "globalize/relative-time";
44

5-
export default React.createClass(generator("formatRelativeTime", ["value", "unit", "options"]));
5+
export default generator("formatRelativeTime", ["value", "unit", "options"]);

test/general.spec.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,11 @@ describe("Any Component", () => {
1717
const wrapper = shallow(<FormatCurrency locale="de" currency="EUR">{150}</FormatCurrency>);
1818
expect(wrapper.text()).to.equal("150,00 €");
1919
});
20+
21+
it("updates when props change", () => {
22+
const wrapper = shallow(<FormatMessage className="a-class-name">Hello</FormatMessage>);
23+
expect(wrapper.props().className).to.equal("a-class-name");
24+
wrapper.setProps({ className: "b-class-name" });
25+
expect(wrapper.props().className).to.equal("b-class-name");
26+
});
2027
});

0 commit comments

Comments
 (0)