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

Commit eae2b05

Browse files
committed
perf(Picky): 50% performance improvement
All Option components were re-rendering on a change. Used recompose/onlyUpdateForKeys to help with that.
1 parent fb8fe77 commit eae2b05

7 files changed

Lines changed: 59 additions & 12853 deletions

File tree

dist/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package-lock.json

Lines changed: 0 additions & 12808 deletions
This file was deleted.

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
"semantic-release": "semantic-release",
1818
"precommit": "npm run test"
1919
},
20-
"dependencies": {},
20+
"dependencies": {
21+
"recompose": "^0.30.0"
22+
},
2123
"devDependencies": {
2224
"@babel/core": "^7.4.3",
2325
"@babel/plugin-proposal-object-rest-spread": "^7.4.3",

src/Filter.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
import React, { PureComponent } from 'react';
1+
import React, { Component } from 'react';
22
import PropTypes from 'prop-types';
3-
class Filter extends PureComponent {
3+
class Filter extends Component {
4+
shouldComponentUpdate(nextProps) {
5+
return (
6+
this.props.placeholder !== nextProps.placeholder ||
7+
this.props.tabIndex !== nextProps.tabIndex
8+
);
9+
}
410
render() {
511
return (
612
<div className="picky__filter">

src/Option.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
3+
import onlyUpdateForKeys from 'recompose/onlyUpdateForKeys';
34
import { isDataObject } from './lib/utils';
45
const Option = props => {
56
const {
@@ -66,4 +67,10 @@ Option.propTypes = {
6667
tabIndex: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
6768
disabled: PropTypes.bool,
6869
};
69-
export default Option;
70+
export default onlyUpdateForKeys([
71+
'multiple',
72+
'isSelected',
73+
'id',
74+
'item',
75+
'tabIndex',
76+
])(Option);

src/Picky.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ class Picky extends React.PureComponent {
119119
* @memberof Picky
120120
*/
121121
allSelected(overrideSelected) {
122-
const { value, valueKey, options } = this.props;
122+
const { value, options } = this.props;
123123
const selectedValue = overrideSelected || value;
124124

125125
// If there are no options we are getting a false positive for all items being selected
@@ -246,12 +246,11 @@ class Picky extends React.PureComponent {
246246
* @memberof Picky
247247
*/
248248
onFilterChange(term) {
249-
250249
/**
251250
* getFilterValue function will provide the input value of filter to the picky dropdown, so that if we have a larger list of options then we can only supply the matching options based on this value
252251
*/
253252
if (this.props.getFilterValue) {
254-
this.props.getFilterValue(term)
253+
this.props.getFilterValue(term);
255254
}
256255
if (!term.trim()) {
257256
return this.setState({

yarn.lock

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,7 @@
674674
"@babel/plugin-transform-react-jsx-self" "^7.0.0"
675675
"@babel/plugin-transform-react-jsx-source" "^7.0.0"
676676

677-
"@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2":
677+
"@babel/runtime@^7.0.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2":
678678
version "7.4.3"
679679
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.3.tgz#79888e452034223ad9609187a0ad1fe0d2ad4bdc"
680680
integrity sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA==
@@ -1836,6 +1836,11 @@ chalk@^2.4.2:
18361836
escape-string-regexp "^1.0.5"
18371837
supports-color "^5.3.0"
18381838

1839+
change-emitter@^0.1.2:
1840+
version "0.1.6"
1841+
resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515"
1842+
integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=
1843+
18391844
chardet@^0.7.0:
18401845
version "0.7.0"
18411846
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
@@ -2344,7 +2349,7 @@ debug@^4.1.0, debug@^4.1.1:
23442349
dependencies:
23452350
ms "^2.1.1"
23462351

2347-
debuglog@*, debuglog@^1.0.1:
2352+
debuglog@^1.0.1:
23482353
version "1.0.1"
23492354
resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
23502355

@@ -3144,7 +3149,7 @@ fb-watchman@^2.0.0:
31443149
dependencies:
31453150
bser "^2.0.0"
31463151

3147-
fbjs@^0.8.16:
3152+
fbjs@^0.8.1, fbjs@^0.8.16:
31483153
version "0.8.17"
31493154
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
31503155
dependencies:
@@ -3663,6 +3668,11 @@ has@^1.0.1, has@^1.0.3:
36633668
dependencies:
36643669
function-bind "^1.1.1"
36653670

3671+
hoist-non-react-statics@^2.3.1:
3672+
version "2.5.5"
3673+
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
3674+
integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==
3675+
36663676
hook-std@^1.1.0:
36673677
version "1.1.0"
36683678
resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-1.1.0.tgz#7f76b74b6f96d3cd4106afb50a66bdb0af2d2a2d"
@@ -3805,7 +3815,7 @@ import-local@^2.0.0:
38053815
pkg-dir "^3.0.0"
38063816
resolve-cwd "^2.0.0"
38073817

3808-
imurmurhash@*, imurmurhash@^0.1.4:
3818+
imurmurhash@^0.1.4:
38093819
version "0.1.4"
38103820
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
38113821

@@ -4929,44 +4939,17 @@ lockfile@^1.0.4:
49294939
dependencies:
49304940
signal-exit "^3.0.2"
49314941

4932-
lodash._baseindexof@*:
4933-
version "3.1.0"
4934-
resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c"
4935-
integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=
4936-
49374942
lodash._baseuniq@~4.6.0:
49384943
version "4.6.0"
49394944
resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
49404945
dependencies:
49414946
lodash._createset "~4.0.0"
49424947
lodash._root "~3.0.0"
49434948

4944-
lodash._bindcallback@*:
4945-
version "3.0.1"
4946-
resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
4947-
integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4=
4948-
4949-
lodash._cacheindexof@*:
4950-
version "3.0.2"
4951-
resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92"
4952-
integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=
4953-
4954-
lodash._createcache@*:
4955-
version "3.1.2"
4956-
resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093"
4957-
integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=
4958-
dependencies:
4959-
lodash._getnative "^3.0.0"
4960-
49614949
lodash._createset@~4.0.0:
49624950
version "4.0.3"
49634951
resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
49644952

4965-
lodash._getnative@*, lodash._getnative@^3.0.0:
4966-
version "3.9.1"
4967-
resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
4968-
integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=
4969-
49704953
lodash._root@~3.0.0:
49714954
version "3.0.1"
49724955
resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
@@ -5012,11 +4995,6 @@ lodash.map@^4.5.1:
50124995
version "4.6.0"
50134996
resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
50144997

5015-
lodash.restparam@*:
5016-
version "3.6.1"
5017-
resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
5018-
integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=
5019-
50204998
lodash.set@^4.3.2:
50214999
version "4.3.2"
50225000
resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
@@ -6591,6 +6569,11 @@ react-is@^16.8.4:
65916569
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16"
65926570
integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==
65936571

6572+
react-lifecycles-compat@^3.0.2:
6573+
version "3.0.4"
6574+
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
6575+
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
6576+
65946577
react-test-renderer@^16.0.0-0:
65956578
version "16.4.1"
65966579
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.1.tgz#f2fb30c2c7b517db6e5b10ed20bb6b0a7ccd8d70"
@@ -6732,7 +6715,7 @@ readable-stream@~1.1.10:
67326715
isarray "0.0.1"
67336716
string_decoder "~0.10.x"
67346717

6735-
readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0:
6718+
readdir-scoped-modules@^1.0.0:
67366719
version "1.0.2"
67376720
resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
67386721
dependencies:
@@ -6757,6 +6740,18 @@ recast@^0.11.17:
67576740
private "~0.1.5"
67586741
source-map "~0.5.0"
67596742

6743+
recompose@^0.30.0:
6744+
version "0.30.0"
6745+
resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0"
6746+
integrity sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==
6747+
dependencies:
6748+
"@babel/runtime" "^7.0.0"
6749+
change-emitter "^0.1.2"
6750+
fbjs "^0.8.1"
6751+
hoist-non-react-statics "^2.3.1"
6752+
react-lifecycles-compat "^3.0.2"
6753+
symbol-observable "^1.0.4"
6754+
67606755
redent@^2.0.0:
67616756
version "2.0.0"
67626757
resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa"
@@ -7664,6 +7659,11 @@ supports-hyperlinks@^1.0.1:
76647659
has-flag "^2.0.0"
76657660
supports-color "^5.0.0"
76667661

7662+
symbol-observable@^1.0.4:
7663+
version "1.2.0"
7664+
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
7665+
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
7666+
76677667
symbol-tree@^3.2.2:
76687668
version "3.2.2"
76697669
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"

0 commit comments

Comments
 (0)