Skip to content

Commit 7a7da5c

Browse files
authored
Merge pull request #3 from schettino/v2
Rely on useState to bail out when params are unchanged BREAKING CHANGE: Rely on newest React's version as peer dependency
2 parents 70fe704 + d825af9 commit 7a7da5c

File tree

3 files changed

+54
-43
lines changed

3 files changed

+54
-43
lines changed

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
},
2727
"peerDependencies": {
2828
"axios": "^0.18.0",
29-
"react": "^16.7.0-alpha.2",
30-
"react-dom": "^16.7.0-alpha.2"
29+
"react": "^16.8.2",
30+
"react-dom": "^16.8.2"
3131
},
3232
"jest": {
3333
"collectCoverageFrom": [
@@ -46,8 +46,8 @@
4646
"babel-runtime": "^6.26.0",
4747
"cross-env": "^5.1.4",
4848
"gh-pages": "^1.2.0",
49-
"react": "16.7.0-alpha.2",
50-
"react-dom": "16.7.0-alpha.2",
49+
"react": "16.8.6",
50+
"react-dom": "16.8.6",
5151
"react-scripts": "2.1.5",
5252
"react-testing-library": "^6.0.0",
5353
"rollup": "^0.66.6",

src/useResource.ts

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {useEffect, useCallback, useRef, useReducer, useMemo} from 'react';
1+
import {useEffect, useCallback, useReducer, useMemo, useState} from 'react';
22
import isEqual from 'fast-deep-equal';
33
import {Canceler} from 'axios';
44
import {useRequest} from './useRequest';
@@ -49,46 +49,57 @@ export function useResource<TRequest extends Request>(
4949
isLoading: Boolean(defaultParams),
5050
});
5151

52-
const lastAppliedParams = useRef<Arguments<TRequest> | null>(null);
52+
const [requestParams, setRequestParams] = useState(defaultParams);
5353

5454
const request = useCallback(
5555
(...args: Arguments<TRequest> | any[]) => {
5656
clear(REQUEST_CLEAR_MESSAGE);
5757
const {ready, cancel} = createRequest(...(args as Arguments<TRequest>));
58-
dispatch({type: 'start'});
59-
ready()
60-
.then(data => {
58+
59+
(async function flow() {
60+
try {
61+
dispatch({type: 'start'});
62+
const data = await ready();
6163
dispatch({type: 'success', data});
62-
})
63-
.catch((error: RequestError) => {
64-
if (!error.isCancel) {
65-
dispatch({type: 'error', error});
66-
}
67-
});
64+
} catch (error) {
65+
if (!error.isCancel) dispatch({type: 'error', error});
66+
}
67+
})();
68+
6869
return cancel;
6970
},
7071
[createRequest],
7172
);
7273

73-
const cancel = (message?: string) => {
74-
dispatch({type: 'reset'});
75-
clear(message);
76-
};
74+
useEffect(() => {
75+
// The array of default request params is a dependency that we pass directly
76+
// as a dependency to this useEffect, which will run on the initial render
77+
// and subsequent params updates, triggering new requests as the params change.
78+
// If the dependency is not set, we avoid going down this road. Hooks should be
79+
// either fully controlled or self-contained.
80+
if (!defaultParams) return;
81+
82+
// We perform an deep equality check of the params and rely on React's bail out
83+
// to control future request calls made passing default params as dependency
84+
setRequestParams(current =>
85+
isEqual(current, defaultParams) ? current : defaultParams,
86+
);
87+
}, defaultParams);
7788

7889
useEffect(() => {
79-
let canceller: Canceler;
80-
if (defaultParams && !isEqual(defaultParams, lastAppliedParams.current)) {
81-
lastAppliedParams.current = defaultParams;
82-
canceller = request(...defaultParams);
90+
let canceller: Canceler = () => {};
91+
if (requestParams) {
92+
canceller = request(...requestParams);
8393
}
84-
return () => {
85-
if (canceller) {
86-
canceller();
87-
}
88-
};
89-
}, defaultParams);
94+
return canceller;
95+
}, [requestParams]);
9096

9197
return useMemo(() => {
98+
const cancel = (message?: string) => {
99+
dispatch({type: 'reset'});
100+
clear(message);
101+
};
102+
92103
const result: UseResourceResult<TRequest> = [{...state, cancel}, request];
93104
return result;
94105
}, [state, request]);

yarn.lock

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8828,15 +8828,15 @@ react-dev-utils@^7.0.3:
88288828
strip-ansi "5.0.0"
88298829
text-table "0.2.0"
88308830

8831-
react-dom@16.7.0-alpha.2:
8832-
version "16.7.0-alpha.2"
8833-
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.7.0-alpha.2.tgz#16632880ed43676315991d8b412cce6975a30282"
8834-
integrity sha512-o0mMw8jBlwHjGZEy/vvKd/6giAX0+skREMOTs3/QHmgi+yAhUClp4My4Z9lsKy3SXV+03uPdm1l/QM7NTcGuMw==
8831+
react-dom@16.8.6:
8832+
version "16.8.6"
8833+
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f"
8834+
integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==
88358835
dependencies:
88368836
loose-envify "^1.1.0"
88378837
object-assign "^4.1.1"
88388838
prop-types "^15.6.2"
8839-
scheduler "^0.12.0-alpha.2"
8839+
scheduler "^0.13.6"
88408840

88418841
react-error-overlay@^5.1.3:
88428842
version "5.1.3"
@@ -8906,15 +8906,15 @@ react-testing-library@^6.0.0:
89068906
"@babel/runtime" "^7.3.1"
89078907
dom-testing-library "^3.13.1"
89088908

8909-
react@16.7.0-alpha.2:
8910-
version "16.7.0-alpha.2"
8911-
resolved "https://registry.yarnpkg.com/react/-/react-16.7.0-alpha.2.tgz#924f2ae843a46ea82d104a8def7a599fbf2c78ce"
8912-
integrity sha512-Xh1CC8KkqIojhC+LFXd21jxlVtzoVYdGnQAi/I2+dxbmos9ghbx5TQf9/nDxc4WxaFfUQJkya0w1k6rMeyIaxQ==
8909+
react@16.8.6:
8910+
version "16.8.6"
8911+
resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe"
8912+
integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==
89138913
dependencies:
89148914
loose-envify "^1.1.0"
89158915
object-assign "^4.1.1"
89168916
prop-types "^15.6.2"
8917-
scheduler "^0.12.0-alpha.2"
8917+
scheduler "^0.13.6"
89188918

89198919
read-pkg-up@^1.0.1:
89208920
version "1.0.1"
@@ -9515,10 +9515,10 @@ saxes@^3.1.4:
95159515
dependencies:
95169516
xmlchars "^1.3.1"
95179517

9518-
scheduler@^0.12.0-alpha.2:
9519-
version "0.12.0"
9520-
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.12.0.tgz#8ab17699939c0aedc5a196a657743c496538647b"
9521-
integrity sha512-t7MBR28Akcp4Jm+QoR63XgAi9YgCUmgvDHqf5otgAj4QvdoBE4ImCX0ffehefePPG+aitiYHp0g/mW6s4Tp+dw==
9518+
scheduler@^0.13.6:
9519+
version "0.13.6"
9520+
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889"
9521+
integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==
95229522
dependencies:
95239523
loose-envify "^1.1.0"
95249524
object-assign "^4.1.1"

0 commit comments

Comments
 (0)