đĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄ
ăăŽć稿ă¸ăŽăłăĄăłăăĺćăăŚăăŹă¤ăăłăšăćäžăăžăăďź https ďź//github.com/facebook/react/issues/14920#issuecomment-471070149ă
đĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄđĄ
ăăăŻă useEffect
ăŞăŠăŽăăăŻăŽäžĺé˘äżăŽăŞăšăăć¤č¨źăăć°ăăESLintăŤăźăŤă§ăăăĺ¤ăăŻăăźă¸ăŁăŽč˝ă¨ă犴ăăäżčˇăăžăă ăťă¨ăăŠăŽĺ ´ĺăčŞĺ俎ćŁăăăăžăă äťĺžć°éąéă§ăăăĽăĄăłăăčż˝ĺ ăăäşĺŽă§ăă
yarn add eslint-plugin-react-hooks<strong i="18">@next</strong>
# or
npm install eslint-plugin-react-hooks<strong i="19">@next</strong>
ESLintć§ćďź
{
"plugins": ["react-hooks"],
// ...
"rules": {
"react-hooks/rules-of-hooks": 'error',
"react-hooks/exhaustive-deps": 'warn' // <--- THIS IS THE NEW RULE
}
}
ăŤăźăŤăćŠč˝ăăăă¨ă確čŞăăăăăŽç°ĄĺăŞăăšăăąăźăšďź
function Foo(props) {
useEffect(() => {
console.log(props.name);
}, []); // <-- should error and offer autofix to [props.name]
}
ăăŽć°ăăreact-hooks/exhaustive-deps
lintăŤăźăŤăéŠç¨ăăăŚăăăłăźăăćŁăăă¨ćăăăĺ ´ĺăŻăăăŽĺˇăŤć稿ăăŚăă ăăă
揥ăŽ3ă¤ăĺŤăăŚăă ăăă
ăăăŻăăŞăăŤă¨ăŁăŚăŻç°Ąĺăăăăăžăăăăç§ăăĄăŤă¨ăŁăŚăŻăžăŁăăç°Ąĺă§ăŻăăăžăăă ăłăĄăłăăŤăŠăĄăăĺŤăžăăŚăăŞăĺ ´ĺďźCodeSandboxăŞăłăŻăăŞăĺ ´ĺăŞăŠďźăăă䝼ĺ¤ăŽĺ ´ĺăŻăăŁăšăŤăăˇă§ăłă追补ăăăŽăé常ăŤéŁăăăă
ăăŽăšăŹăăăŽćçľçŽć¨ăŻăä¸čŹçăŞăˇăăŞăŞăčŚă¤ăăŚăăăăăăăĺŞăăăăăĽăĄăłăă¨čŚĺăŤĺ¤ćăăăă¨ă§ăă ăăăŻăĺĺăŞčŠłç´°ăĺŠç¨ĺŻč˝ăŞĺ ´ĺăŤăŽăżçşçăăĺŻč˝ć§ăăăăžăă ä¸ĺŽĺ ¨ăŞăłăźăăšăăăăăĺŤăăăŠă¤ăăă¤ăłăĄăłăăŻăăăŁăšăŤăăˇă§ăłăŽčłŞăĺ¤§ĺš ăŤä˝ä¸ăăăžăâăăă ăăŽäžĄĺ¤ăŻăăăžăăă
ăăŽäžăŤăŻčżäżĄăăăăžăďź https ďź
ăăăŻĺśĺžĄăăăŚăăŞăăă§ăăŻăăăŻăšăłăłăăźăăłăă§ăăă defaultIndeterminate
ĺ°éĺ
ˇă使ç¨ăăŚĺćăŹăłăăŞăłă°ă§ä¸ç˘şĺŽăŞăšăăźăżăšăč¨ĺŽăăžăďź indeterminate
čŚç´ ĺąć§ăăŞăăăăĺç
§ă使ç¨ăăŚJSă§ăŽăżĺŽčĄă§ăăžăďźă ăăŽĺ°éĺ
ˇăŻdefaultValue
ăăăŤĺä˝ăăăă¨ăçŽçă¨ăăŚăăăăăŽĺ¤ăŻćĺăŽăŹăłăăŞăłă°ă§ăŽăżä˝żç¨ăăăžăă
ăăŽăŤăźăŤăŻăäžĺé˘äżăŽé
ĺăŤdefaultIndeterminate
ăăŞăăă¨ă訴ăăžăăăăăăčż˝ĺ ăăă¨ăć°ăăĺ¤ă渥ăăăĺ ´ĺăŤăłăłăăźăăłăăĺśĺžĄăăăŚăăŞăçść
ă誤ăŁăŚä¸ć¸ăăăĺĺ ăŤăŞăăžăă äžĺé˘äżăŽé
ĺăĺŽĺ
¨ăŤĺé¤ăăăă¨ăŻă§ăăžăăăăăăŻăä¸ç˘şĺŽăŞăšăăźăżăšăĺ°éĺ
ˇăŤăăŁăŚĺŽĺ
¨ăŤĺśĺžĄăăăĺĺ ă¨ăŞăăăă§ăă
ăăă¨ăăŤăźăŤăăăŁăăăăăŽă_ćĺłăăă_ăąăźăšăŽăżă¤ăăĺşĺĽăăćšćłăŻăăăăžăăăăćçľçăŞăŤăźăŤăŽăăăĽăĄăłăăŤć¨ĺĽ¨ăăăĺéżçăĺŤăžăăŚăăă¨äžżĺŠă§ăă đ
Reďź https ďź
@billyjanitsch䝣ăăăŤăăăŻćŠč˝ăăžăăďź https://codesandbox.io/s/jpx1pmy7ry
defaultIndeterminate
ĺćĺăăăindeterminate
useState
ăčż˝ĺ ăăžăăă 揥ăŤăă¨ăă§ăŻăăŻ[indeterminate]
ăĺźć°ă¨ăăŚĺăĺ
Ľăăžăă çžĺ¨ăŻĺ¤ć´ăăŚăăžăăăăĺžă§ĺ¤ć´ăăĺ ´ĺăŻăăăă§ăćŠč˝ăăă¨ćăăžăăďź ăăăăŁăŚăăłăźăăŻĺ°ćĽăŽĺŻč˝ăŞăŚăźăšăąăźăšăăăĺ°ăčŻăäşć¸Źăăžăă
ă ăăç§ăŻăăă¤ăăŽhtmlă渥ăăăăădangerouslySetInnerHtml
ă¨ä¸çˇăŤä˝żç¨ăăŚăłăłăăźăăłăďźăăă¤ăăŽçˇ¨éăłăłăăłăďźăć´ć°ăă揥ăŽďźă¨ăă¸ďźďźăąăźăšăĺĺžăăžăăă
ç§ăŻhtml
ĺ°éĺ
ˇă使ç¨ăăŚăăžăăăă ref.current.querySelectorAll
ă使ç¨ăăŚéćłăăăăăă¨ăă§ăăĺç
§ă使ç¨ăăŚăăžăă
ć示çăŤä˝żç¨ăăŚăăŞăăŚăă useEffect
äžĺé˘äżăŤhtml
ăčż˝ĺ ăăĺż
čŚăăăăžăă ăăăŻăĺŽéăŤăŤăźăŤăçĄĺšăŤăăĺż
čŚăăăăŚăźăšăąăźăšă§ăăďź
ă˘ă¤ăă˘ăŻă硨éăłăłăăłăăăăŽăăšăŚăŽăŞăłăŻăŻăŞăăŻăĺĺăăăăă¤ăăŽĺćă追补ăăăăäťăŽé˘éŁăăăă¨ăčĄăăă¨ă§ăă
ăăăŻăĺŽéăŽăłăłăăźăăłăăăăŽéިćăăŽäžă§ăă
https://codesandbox.io/s/8njp0pm8v2
ç§ăŻreact-reduxă使ç¨ăăŚăăăŽă§ăĺ°éĺ
ˇă§ă˘ăŻăˇă§ăłăŻăŞă¨ăźăżăźămapDispatchToProps
ăă渥ăăăăŽă˘ăŻăˇă§ăłăŻăŞă¨ăźăżăźăăăăŻă§ä˝żç¨ăăă¨ă exhaustive-deps
čŚĺă襨示ăăăžăă
ă ăăç§ăŻćăăăŤreduxă˘ăŻăˇă§ăłăäžĺé˘äżé ĺăŤčż˝ĺ ăăăă¨ăă§ăăžăăăreduxă˘ăŻăˇă§ăłăŻé˘ć°ă§ăăćąşăăŚĺ¤ć´ăăăŞăăŽă§ăăăăŻä¸ĺż čŚă§ăăăďź
const onSubmit = React.useCallback(
() => {
props.onSubmit(emails);
},
[emails, props]
);
lintădepsă[emails, props.onSubmit]
ăŤäżŽćŁăăăă¨ăćĺž
ăăŚăăžăăăçžĺ¨ăŻĺ¸¸ăŤdepsă[emails, props]
俎ćŁăăŚăăžăă
- ćĺłă襨çžăăćĺ°éăŽăłăźăäžă示ăCodeSandboxďźăfoobarăă§ăŻăŞăăĺŽčŁ ăăŚăăĺŽéăŽUIăăżăźăłďźă
https://codesandbox.io/s/xpr69pllmz
- ăŚăźăśăźăĺŽčĄăă
ăŚăźăśăźăŻăĄăźăŤăčż˝ĺ ăăăăăăŽăĄăźăŤăă˘ăăŞăŤćĺž
ăăžăă UIăŽćŽăăŽé¨ĺăŻăç§ăŽĺéĄă¨ăŻçĄé˘äżă§ăăăăăćĺłçăŤbutton
ă ăăŤĺé¤ăăžăă
- ăăăŻ/ăłăłăăźăăłăăŽçŽçăŽAPIăŽčŞŹćă
ç§ăŽăłăłăăźăăłăăŤăŻă onSubmit: (emails: string[]) => void
ă¨ăăĺä¸ăŽĺ°éĺ
ˇăăăăžăă ăŚăźăśăźăăăŠăźă ăé俥ăăă¨ă emails
çść
ă§ĺźăłĺşăăăžăă
硨éďź httpsďź //github.com/facebook/react/issues/14920#issuecomment-467494468ă§ĺç
ăăăŻăćčĄçăŤăŻ
props.foo()
ăprops
čŞä˝ăthis
ăăfoo
ĺźăłĺşăă¨ăăŚć¸Ąăăăă§ăă ăăăăŁăŚăfoo
ăŻćéťçăŤprops
äžĺăăĺŻč˝ć§ăăăăžăă ăă ăăăăŽĺ ´ĺăŻăăŁă¨čŻăăĄăăťăźă¸ăĺż čŚă§ăă ăăšăăăŠăŻăăŁăšăŻĺ¸¸ăŤç ´ĺŁăăăă¨ă§ăă
ăľăźăăăźăăŁăŽăŠă¤ăăŠăŞăçľąĺăăă¨ăăŤăăăŚăłăă¨ć´ć°ăć確ăŤç°ăŞăĺŻč˝ć§ăăăăă¨ăŻčć ŽăăăŚăăžăăă ă¤ăłăšăżăłăšăŻăăšăŚăŽăŹăłăăŞăłă°ă§ç ´ćŁăăăăšăă§ăŻăŞăăăăć´ć°ĺšćăăăŚăłă1ăŤĺŤăăăă¨ďźăăăłé ĺăĺŽĺ ¨ăŤĺé¤ăăăă¨ďźăŻă§ăăžăăă
ăăă
ăăă§ç§ăŽăłăźăăŽä˝ăĺéĄăŤăŞăŁăŚăăăŽăăăăăŞăďź
const [client, setClient] = useState(0);
useEffect(() => {
getClient().then(client => setClient(client));
}, ['client']);
ç§ăŻReact Hook useEffect has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked
ăćăŤĺ
Ľăăžăă
@joelmoss @sylvainbaronnetăăŁăźăăăăŻăŤćčŹăăžăăăĺéĄăŽĺé ă§ćąăăć ĺ ąăĺŤăžăăŚăăŞăăŁăăăăăłăĄăłăăé襨示ăŤăăžăăă ăăŽăăăăłăłăăăšăăćŹ č˝ăăŚăăăăăăăŽč°čŤăŻčŞ°ăŤă¨ăŁăŚăä¸ĺż čŚăŤĺ°éŁăŤăŞăăžăă ăăä¸ĺşŚć稿ăăŚăé˘éŁăăăăšăŚăŽć ĺ ąăĺŤăăŚăăă ăăă°ăäźčŠąăçśăăăăŚăăă ăăžăďźä¸çŞä¸ăŽć稿ăĺç §ďźă ç解ăăŚăăă ăăăăă¨ăăăăăžăă
çžçśăŽăłăźăăŻă¨ăŠăźăŤăŞăăŞăăŻăă ă¨ćăăžăă çžĺ¨ă35čĄçŽă§ă setLastName
ăé
ĺăŤĺŤăăĺż
čŚăăăă¨č¨ăŁăŚăăžăă ăăăŤă¤ăăŚä˝ăăăšăăăŤă¤ăăŚä˝ăčăăŻăăăžăăďź ç§ăŻäşćăăŞăăă¨ăăăŚăăžăăďź
ç§ăŻĺŽĺ ¨ăŤç解ăăŚăăăé常ăŻăăšăŚăăăŞăăŤäťŁăăŁăŚčĄăăžăăăç§ăŽçšĺŽăŽăąăźăšă§ăŻăăŠăŽăłăźăăç§ăŤĺşćăŽăăŽă§ăŻăăăžăăă ăăăŻăŽĺ¤é¨ă§ĺŽçžŠăăďźă¤ăžăăreduxă˘ăŻăˇă§ăłăŻăŞă¨ăźăżăźďźăăăăŻĺ ă§ä˝żç¨ăăăé˘ć°ă使ç¨ăăăŤăŻăăăŽé˘ć°ăăăăŻdepă¨ăăŚčż˝ĺ ăăĺż čŚăăăăăŠăăăŤă¤ăăŚăŽčłŞĺă§ăă
ăăăŤć ĺ ąăĺż čŚăŞĺ ´ĺăŻăăłăźăăľăłăăăăŻăšăä˝ćăăŚăă ăăă THX
@joelmossç§ăŽăŞăăăăăŞăăŽăąăźăšăăŤăăźăăŚăăă¨ćăăžăă
ăŻăăCodeSandboxăŻĺźăçśă彚çŤăĄăžăă äşşă ăŽăłăźăăšăăăăăä¸ćĽä¸ăłăłăăăšăăšă¤ăăăăăŽăăŠăŽăăăŞăăŽăćłĺăăŚăżăŚăă ăăă ăăăŻĺ¤§ăăŞç˛žçĽçç ç˛ă§ăă ăăăăŽăŠăăĺăăŤčŚăăžăăă äşşă ăReduxăReactăŽĺ¤é¨ăŤăăäťăŽćŚĺżľă§ă˘ăŻăˇă§ăłăŻăŞă¨ăźăżăźăăŠăŽăăăŤä˝żç¨ăăŚăăăăčŚăăŚăăĺż čŚăăăĺ ´ĺăăăăŻăăăŤĺ°éŁă§ăă ĺéĄăŻăăŞăăŤăŻćç˝ăŤčăăăăăăăăžăăăăăăŞăăä˝ăćĺłăăăŽăăŻç§ăŤăŻăžăŁăăćç˝ă§ăŻăăăžăăă
@gaearonç§ăŻăăăçăŤăăŞăŁăŚăăăă¨ăç解ăăŚăăžăăç§ăéćăăăăŁăççąăŻďź
ă¨ăă§ăŻăăĺŽčĄăăŚ1ĺă ăăŻăŞăźăłă˘ăăăăĺ ´ĺďźăăŚăłăćă¨ă˘ăłăăŚăłăćďźă2çŞçŽăŽĺźć°ă¨ăăŚçŠşăŽé ĺďź[]ďźă渥ăăă¨ăă§ăăžăă
誏ćăăŚăăăŚăăăă¨ăă ďźăăăŚăŞăăăăăŻă§çłă訳ăăăžăăďź
ăăăç§ăĺŽčŁ ăăŚăăăăŽăŽăłăźăăăźă¸ă§ăłă§ăă ăăžăčŚăăžăăăăăăżăźăłăŻç§ăŽĺŽéăŽăłăźăă¨100ďź ĺăă§ăă
https://codesandbox.io/s/2x4q9rzwmp?fontsize=14
ăăŽäžă§ăŻăăšăŚăăăžăćŠč˝ăăžăďź ăŞăłăżăźăŽĺéĄăé¤ăăŚă
ăăŽăăăŞăăĄă¤ăŤăăăă¤ăăăăă¨ăă§ăŻăă§é˘ć°ăĺŽčĄăăŚăăžăăăăˇăŞăźăşIDăŽĺ¤ć´ăŞăŠăä˝ăăăŽćĄäťśăćşăăăăĺ ´ĺăŤăŽăżĺŽčĄăăăă¨čăăŚăăžăă é˘ć°ăé ĺăŤĺŤăăăăăăžăăă
ăăăŻăăľăłăăăăŻăšăłăźăă§ĺŽčĄăăă¨ăăŤăŞăłăżăźăăĺĺžăăăăŽă§ăă
25:5 warning React Hook useEffect has a missing dependency: 'fetchPodcastsFn'. Either include it or remove the dependency array react-hooks/exhaustive-deps
ç§ăŽčłŞĺăŻćŹĄăŽă¨ăăă§ăďźăăăŻăŠăŽăăăŤĺä˝ăăĺż čŚăăăăžăăďźăŞăłăżăźăŤăźăŤăžăăŻăăăŻé ĺăŤăźăŤăŽăăăăďźďź ăăŽĺšćă誏ćăăăăć Łç¨çăŞćšćłăŻăăăžăăďź
@svenanders ă fetchPodcastsFn
ăĺŤăăăăŞăççąăć°ăŤăŞăăžăăďź ăŹăłăăŞăłă°ăă¨ăŤĺ¤ĺăăăăă§ăăďź ăăă§ăăĺ ´ĺăŻăăăŽé˘ć°ăăĄă˘ĺăăăăéçăŤăăžăďźăăŠăĄăźăżăźăăŞăĺ ´ĺďźă
ä¸ă¤ăŤăŻăăăăŻć忍ăăŤă¤ăăŚă§ăă é˘ć°ăčŚăă¨ăăă¤čľˇĺăăăăç°ĄĺăŤç解ăăăă¨ćăăžăă é
ĺăŤ_one_idă襨示ăăăŚăăĺ ´ĺăăăăŻé常ăŤć確ă§ăă ăăŽIDă¨ä¸éŁăŽé˘ć°ăčŚăă¨ăăăăŤćˇˇäšąăăžăă ä˝ă辡ăăŁăŚăăăŽăăç解ăăăăăŤăćéă¨ĺ´ĺă貝ăăăŞăăă°ăŞăăăĺ ´ĺăŤăăŁăŚăŻăăăă°ćŠč˝ăăă貝ăăăŞăăă°ăŞăăžăăă
ç§ăŽé˘ć°ăŻĺŽčĄćăŤĺ¤ć´ăăăŞăăŽă§ăăăăăăĄă˘ĺăăăă¨ăéčŚăăŠăăăŻăăăăžăăďźăăăŻçšăŤăă¨ăăăŻă辡ĺăăŚćçľçăŤçść
ăĺ¤ć´ăăăăŁăšăăăă˘ăŻăˇă§ăłă§ăďźă
https://codesandbox.io/s/4xym4yn9kx
ăŚăźăśăźăŻăăźă¸ä¸ăŽăŤăźăăŤă˘ăŻăťăšăăžăăăăšăźăăźăŚăźăśăźă§ăŻăŞăăăăăăźă¸ăăăŞăă¤ăŹăŻăăăžăă props.navigate
ăŻăŤăźăżăźăŠă¤ăăŠăŞăäťăăŚćł¨ĺ
Ľăăăăăăăăźă¸ăŽĺčŞăżčžźăżăé˛ăăăăŤĺŽéăŤăŻwindow.location.assign
ă使ç¨ăăăăăăžăăă
ăăšăŚăćŠč˝ăăžăďź
ăłăźăăľăłăăăăŻăšăŽăăăŤäžĺé˘äżăćŁăăĺ
ĽĺăăžăăăăăŞăłăżăźăŻäžĺé˘äżăŞăšăăŤprops.navigate
ă§ăŻăŞăprops
ăĺż
čŚă§ăăă¨č¨ăŁăŚăăžăă ä˝ć
ă§ăăďź
ăšăŻăŞăźăłăˇă§ăăäťăăŽăă¤ăźăďź https://twitter.com/ferdaber/status/1098966716187582464
硨éďźăăăăă°ă§ăăĺŻč˝ć§ăăă1ă¤ăŽćŁĺ˝ăŞççąăŻă navigate()
ăăă¤ăłăăăăthis
ăŤäžĺăăăĄă˝ăăă§ăăĺ ´ĺă§ăăăăŽĺ ´ĺăćčĄçăŤăŻă props
ĺ
ăŽä˝ăăĺ¤ć´ăăăĺ ´ĺăĺ
é¨ăŽăăŽăĺ¤ć´ăăăžăă this
ăĺ¤ć´ăăăžăă
CodeSandboxďź https ďź//codesandbox.io/s/711r1zmq50
寞蹥ăŽAPIďź
ăăŽăăăŻă使ç¨ăăă¨ăćĽéăŤĺ¤ĺăăĺ¤ăăăăŚăłăšă§ăăžăă ăăăŚăłăšăăăĺ¤ăŻăuseDebounceăăăŻăćĺŽăăăćéĺźăłĺşăăăŞăăŁăĺ ´ĺăŤăŽăżăćć°ăŽĺ¤ăĺć ăăžăă ăŹăˇăă§čĄăŁăŚăăăăăŤăuseEffectă¨çľăżĺăăăŚä˝żç¨ââăăă¨ăAPIĺźăłĺşăăŞăŠăŽăłăšăăŽăăăćä˝ăé ťçšăŤĺŽčĄăăăŞăăăăŤăăăă¨ăç°ĄĺăŤă§ăăžăă
ćé ďź
ăăŽäžă§ăŻăMarvel Comic APIăć¤ç´˘ăăuseDebounceă使ç¨ăăŚăăăźăšăăăźăŻăă¨ăŤAPIĺźăłĺşăăçşçăăŞăăăăŤăăžăă
ăă¨ăă°ă useDebounceăăăŻăŤă¤ăăŚčăăŚdelay
ăŻćĺăŽăŹăłăăŞăłă°ĺžăŤĺ¤ć´ăăăžăăăăăăšăŚăŽĺăŹăłăăŞăłă°ă§ĺ¤ć´ăăăŚăăăăŠăăă確čŞăăŚăăžăă ăăăăŁăŚăăăŽăăăŻă§ăŻă useEffect
ăŽ2çŞçŽăŽĺźć°ăŻă [value, delay]
ă§ăŻăŞă[value]
ăăćšăéŠĺă§ăă
ćľ ăçĺźăă§ăăŻă漾獯ăŤĺŽăă¨ăŻćăăŞăă§ăă ăăă ćŚçĽçăŤé 罎ăăă¨ă˘ăăŞăćŻć´ă§ăăžăăăăăšăŚăŽăłăłăăźăăłăăç´ç˛ăŤăăă ăă§ăĺŽéăŤăŻă˘ăăŞăŽé庌ăä˝ä¸ăăĺŻč˝ć§ăăăăžăă ăăŹăźăăŞăă
äžĺé˘äżăŽé ĺăŤăăšăŚăčż˝ĺ ăăă¨ăăŠăă§ăç´ç˛ăŞăłăłăăźăăłăă使ç¨ăăăŽă¨ĺăďźăžăăŻăăăŤćŞăďźăăăŠăźăăłăšăŽĺéĄăăăă¨ćăăžăă 使ç¨ăăŚăăĺ¤ăŽä¸é¨ăĺ¤ć´ăăăŞăăă¨ăăăăŁăŚăăăˇăăŞăŞăĺ¤ć°ăăăăă @ gaearonăčż°ăšăăăăŤăćľ ăç䞥ć§ăă§ăăŻăŻăăăťăŠĺŽäžĄă§ăŻăŞăăăăăĺŻč˝ă§ăăăăăäžĺé˘äżé ĺăŤăăăăčż˝ĺ ăăŞăă§ăă ăăăă˘ăăŞăé ăăăžăă
ć ŁäžăŤăăăăăŽăŤăźăŤăăŤăšăżă ăăăŻă§čŞĺçăŤćŠč˝ăăăăăŤăăăă¨ăŤă¤ăăŚăăŁăźăăăăŻăăăăžăă
ă˝ăźăšăłăźăăčŚăă¨ăĺĺă§ăŤăšăżă ăăăŻăăăŁăăăŁăăăăăŤćŁčŚčĄ¨çžăćĺŽă§ăăăăăŤăăćĺłăăăăă¨ăăăăăžăă
Reactăăźă ăŻăäžĺé˘äżé
ĺăćă¤ăŤăšăżă ăăăŻăŽčż˝ĺ ăŽĺ˝ĺčŚĺăŤă¤ăăŚăŠăćăăžăăďź ăăăŻăŻăăăŽăăŠă°ă¤ăłăŤăăŁăŚăăăŻă¨ăăŚć¤ĺşăăăăăăŤăćĽé čžuse
ăŽčŚĺăŤĺžăŁăŚăăžăă çšĺŽăŽäžĺé˘äżăŤäžĺăăăŤăšăżă ăăăŻăć¤ĺşăăăăăŤććĄăăčŚĺăŻă WithDeps
ăăăŞĺžç˝ŽăŽăăăŞăăŽă§ăăă¤ăžăăĺŽĺ
¨ăŞăŤăšăżă ăăăŻĺăŻuseCustomHookWithDeps
ăăăŞăăŽăŤăŞăăžăă WithDeps
ćĽĺ°žčžăŻăćĺžăŽé
ĺĺźć°ăäžĺé˘äżăŽ1ă¤ă§ăăăă¨ăăăŠă°ă¤ăłăŤéçĽăăžăă
ăăŠă°ă¤ăłăŻĺźăçśăćŁčŚčĄ¨çžăăľăăźăă§ăăžăăăăŠă¤ăăŠăŞăŽä˝ćč
ăăăŠă¤ăăŠăŞăŽĺŠç¨č
ăŤăăŠă°ă¤ăłăăăšăŚăŽăŤăšăżă ç¨ăŤć示çăŤć§ćăăăŽă§ăŻăŞăă WithDeps
ă§ĺžç˝ŽăăăăŤăšăżă ăăăŻăă¨ăŻăšăăźăă§ăăăăăŤăăăă¨ă§ă大ăăŞăĄăŞăăăĺžăăăă¨ćăăžăăăľăźăăăźăăŁăžăăŻăăŽäťăăăăŻăăžăă
ăăăŻčŚĺăăăŤăšăżă ăŽĺçć§ăă§ăăŻăčŞĺçăŤĺé¤ăăžăă
const myEqualityCheck = a => a.includes('@');
useCallback(
() => {
// ...
},
[myEqualityCheck(a)]
);
useEffectăŽĺ ´ĺăăä¸ĺż čŚăŞäžĺé˘äżăăŽčŚĺă襨示ăăăăšăă§ăŻăŞăă¨ćăăžăăăăăăŽăäžĺé˘äżăăŤăăŁăŚăĺšćăŽçşçŤćšćłăĺ¤ăăăăă§ăă
茪ă¨ĺăŽ2ă¤ăŽăŤăŚăłăżăźăăăă¨ăăžăăăă
ĺŽčŁ ďź
const [parent, setParent] = useState(0);
const [child, setChild] = useState(0);
useEffect(
() => {
setChild(0);
},
[parent] // "unnecessary dependency: 'parent'"
);
ĺžšĺşçăŞdepsăŤăźăŤăŻčŚĺReact Hook useEffect has an unnecessary dependency: 'parent'. Either exclude it or remove the dependency array.
ä¸ăăžă
ă˘ăăŞăŽĺä˝ăĺ¤ăăăăăăŞăłăżăźăăăŽććĄăčĄăăšăă§ăŻăŞăă¨ćăăžăă
parent
ăĺ¤ć´ăăăă¨ă child
ăŻăźăăŤăŞăťăăăăăžăăparent
ăuseEffect
ăŽĺä˝ăĺ¤ć´ăăăă¨ăčŞčăăăăăĺé¤ăăăăăŤă˘ăăă¤ăšăăăšăă§ăŻăăăžăăă[硨é]
ĺéżçă¨ăăŚăç§ăŻćŹĄăŽăăăŞăăŽăć¸ăăă¨ăă§ăăžă
const [parent, setParent] = useState(0)
const [child, setChild] = useState(0)
const previousParent = useRef(parent)
useEffect(() => {
if (parent !== previousParent.current) {
setChild(0)
}
previousParent.current = parent
}, [parent])
ăăăăç§ă弽ăăŞĺ ăŽăšăăăăăŤăŻă芊ăăăăăžăă
ĺéĄăŻăäžĺé˘äżăŽé ĺăăăăăŠăźăăłăšăŽćéŠĺă¨ĺŽéăŽăłăłăăźăăłăăŽĺä˝ăŽĺăŞăăĄăŤăăşă ă¨ăăŚč§Łéăăĺż čŚăăăăăŠăăăŤăăă¨ćăăžăă React Hooks FAQăŻăăăăŠăźăăłăšă使ç¨ăăççąăŽäžă¨ăăŚăăăŠăźăăłăšă使ç¨ăăŚăăžăăăăăăŠăźăăłăšăĺä¸ăăăăăăŤäžĺé˘äżé ĺăŽăżă使ç¨ăăĺż čŚăăăăă¨ăćĺłăăăăăŤäžă解éăăžăăă§ăăă䝣ăăăŤăă¨ăă§ăŻăĺźăłĺşăăăšăăăăăäžżĺŠăŞćšćłă¨čŚăŞăăžăăăä¸čŹăŤă
ăăăŻĺŽéăŤăŻăĺ é¨ăăŁăăˇăĽăçĄĺšăŤăăăăăŤć°ĺ使ç¨ăăăăżăźăłă§ăă
useEffect(() => {
if (props.invalidateCache) {
cache.clear()
}
}, [props.invalidateCache])
ăăŽăăăŤä˝żç¨ăăăšăă§ăŻăŞăĺ ´ĺăŻăé ć ŽăŞăăçĽăăăă ăăăăăŽăłăĄăłăăŻçĄčŚăăŚăă ăăă
@MrLeebo
ăŠăă§ăă
const [parent, setParent] = useState(0);
const [child, setChild] = useState(0);
const updateChild = React.useCallback(() => setChild(0), [parent]);
useEffect(
() => {
updateChild();
},
[updateChild]
);
ç§ăăăŞăăŽăăŽćçăç解ăăžăăă äžĺé˘äżăŻăłăźăăŤĺşăĽăăŚăŽăżćłĺŽă§ăăžăăăăă°ă§ăăĺŻč˝ć§ăăăăžăă ç§ăŽććĄăŻĺż ăăăăăăăăăĺ°ăŞăă¨ăăăć確ăŤăăăă¨ă解湺ăăăăă§ăŻăăăžăăăă
ăăăŻäťĽĺăŤgetDerivedStateFromProps
解湺ăăăăăă§ăă getDerivedStateFromPropsăĺŽčŁ
ăăăŤăŻ
@nghiepitćĺăŽć稿ă§ĺż čŚăŞăă§ăăŻăŞăšăďźCodeSandboxăŞăŠďźăçĄčŚăăăăăăłăĄăłăă
@ eps1lon useCallback
ăŤă¤ăăŚăăžăŁăăĺăčŚĺă襨示ăăăžăăä¸čŹçăŤăĺ
ăŽăăżăźăłăăăćšĺăăăŚăăă¨ăăăăżăźăłăŤăŻĺćăăžăăăăăăăăŻăçăăăŚăăăŤă¤ăăŚčŠąăăă¨ăŻăăăăăăžăăă ć確ăŤăăăăăŤăä¸čŚăŞäžĺé˘äżăŤăźăŤăŻăĺšćçăŞăă¸ăăŻăĺŤăăăă¨ăă§ăăăăăçšăŤuseEffect
ăžăăŻuseLayoutEffect
ăŤĺŻžăăŚçˇŠĺăăĺż
čŚăăăă¨ćăăžăăăăŤăźăŤăŻuseCallback
ăŻăăŽăžăžăŤăăŚăăĺż
čŚăăăăžăă useMemo
ăŞăŠ
@MrLeeboăăăă§čŞŹćăăăŽă¨ĺăĺéĄ/ăĄăłăżăŤă˘ăăŤăŽčłŞĺăŽăăă¤ăăŤuseEffect
äžĺé˘äżăŽăŤăźăŤăăăăťăŠĺłĺŻăŤăăăă¨ăŻă§ăăŞăă¨ăăăă¨ă§ăă ĺşćŹçăŞćŚĺżľĺŽč¨źăŽă˘ă¤ăă˘ăŽăăăŤĺăçľăă§ăăă俥ăăăăŞăăťăŠä¸čŞçśăŞäžăăăăžăă ç§ăŻăăŽăłăźăăă˛ăŠăăŚăăăŽčăăçšăŤćç¨ă§ăŻăŞăăă¨ăçĽăŁăŚăăžăăăăăăăăŻçŽĺăŽĺéĄăŽčŻăäžč¨źă§ăăă¨ćăăžăă @MrLeeboăŻăç§ăé常ăŤăăćăŁăŚăă質ĺă襨çžăăă¨ćăăžăă
ĺéĄăŻăäžĺé˘äżăŽé ĺăăăăăŠăźăăłăšăŽćéŠĺă¨ĺŽéăŽăłăłăăźăăłăăŽĺä˝ăŽĺăŞăăĄăŤăăşă ă¨ăăŚč§Łéăăĺż čŚăăăăăŠăăăŤăăă¨ćăăžăă React Hooks FAQăŻăăăăŠăźăăłăšă使ç¨ăăççąăŽäžă¨ăăŚăăăŠăźăăłăšă使ç¨ăăŚăăžăăăăăăŠăźăăłăšăĺä¸ăăăăăăŤäžĺé˘äżé ĺăŽăżă使ç¨ăăĺż čŚăăăăă¨ăćĺłăăăăăŤäžă解éăăžăăă§ăăă䝣ăăăŤăă¨ăă§ăŻăĺźăłĺşăăăšăăăăăäžżĺŠăŞćšćłă¨čŚăŞăăžăăăä¸čŹăŤă
https://codesandbox.io/s/5v9w81j244
ç§ăŻăĺ
ˇä˝çăŤčŚăŚăuseEffect
ä¸ăŤăăăŻuseDelayedItems
ă çžĺ¨ăäžĺé˘äżé
ĺăŤitems
ăăăăăŁăĺŤăăă¨ăăŞăłăăŁăłă°ă¨ăŠăźăçşçăăžăăăăăŽăăăăăŁăžăăŻé
ĺăĺŽĺ
¨ăŤĺé¤ăăă¨ăćăžăăăŞăĺä˝ăçşçăăžăă
useDelayedItems
ăăăŻăŽĺşćŹçăŞčăćšăŤăŻăă˘ă¤ăă ăŽé
ĺă¨ć§ćăŞăă¸ă§ăŻăďźăăŞç§ĺä˝ăŽé
ĺťśăĺćăăźă¸ăľă¤ăşďźăä¸ăăăăžăăćĺăŻăć§ćăăăăăźă¸ăľă¤ăşăŤĺżăăŚă˘ă¤ăă ăŽăľăăťăăă渥ăăăžăă config.delay
ăçľéăăă¨ăă˘ă¤ăă ăŻă˘ă¤ăă ăŽăăŤăťăăăŤăŞăăžăă ć°ăăă˘ă¤ăă ăŽăťăăă渥ăăăă¨ăăăăŻăŻăăŽăé
ĺťśăăă¸ăăŻăĺĺŽčĄăăĺż
čŚăăăăžăă ăăŽă˘ă¤ăă˘ăŻă大ăăŞăŞăšăăŽé
ĺťśăŹăłăăŞăłă°ăŽé常ăŤç˛éă§éŚŹéšżăăăăźă¸ă§ăłă§ăă
ăăăăŽăŤăźăŤăŤé˘ăăăăšăŚăŽä˝ćĽăŤćčŹăăžăăéçşăăéăŤé常ăŤĺ˝šçŤăĄăžăăă ç§ăŽäžăŽĺ質ăçăăăĺ ´ĺă§ăăăăăăŽćźçŽĺăăŠăŽăăăŤä˝żç¨ăăăăăŤă¤ăăŚăŽć´ĺŻăĺžăăăăă¨ăéĄăŁăŚăăžăă
硨éďźĺä˝ćĺłăŤé˘ăăăłăźăăľăłăăăăŻăšĺ ăŤăăă¤ăăŽć確ăŞăłăĄăłăăčż˝ĺ ăăžăăă ć ĺ ąăĺĺă§ăăăă¨ăéĄăŁăŚăăžăăăăăă§ă桡䚹ăăăă¨ăăăă°ćăăŚăă ăăă
äťăŽĺ¤ăçľăżĺăăăĺä¸ăŽĺ¤ăŻăŠăă§ăăďź
äžďźfullNameăŻfirstName
ă¨lastName
ăăć´žçăăžăă fullName
ăĺ¤ć´ăăăă¨ăďźăŚăźăśăźă[äżĺ]ăăŻăŞăăŻăăă¨ăăŞăŠďźăŤăŽăżă¨ăă§ăŻăăăăŞăŹăźăăăăăă¨ăă§ăŻăă§ć§ćăăăĺ¤ăŤăă˘ăŻăťăšăăă
fullName
ăĺ¤ć´ăăăĺžăŤăŽăżă¨ăă§ăŻăăĺŽčĄăăăăŽă§ăäžĺé˘äżăŤfirstName
ăžăăŻlastName
ăčż˝ĺ ăăă¨ĺéĄăçşçăăžăă
@aweary useEffect
ăăăăĺ¤ć´ăŽéćĽăăăăžăăă ăăŞăăŽonClick
ăăăŽăĺšćăăĺŚçăăŚăăăăă§ăă
https://codesandbox.io/s/0m4p3klpyw
äťăŽĺ¤ăçľăżĺăăăĺä¸ăŽĺ¤ăŤé˘ăăŚăŻă useMemo
ăăăăăăăŞăăćăăăŽăŤăŞăă§ăăăă ăăŞăăŽäžăŽč¨çŽăŽé
ăăć§čłŞăŻăăăăăăŞăăŽăŞăłăŻăăăćŻăčăă¨ćŁç˘şăŤ1ďź1ă§ăăăăłă°ăăăŞăăă¨ăćĺłăăžăă
ăăăăŽäžăŽăłăźăăľăłăăăăŻăšăŞăłăŻăä˝ćăăăăŽć稿ă硨éăăžăă
é常ăŤĺç´ăŞăŤăźăŤăăăăžăăçžĺ¨ăŽăżăăĺ¤ć´ăăăĺ ´ĺăŻăä¸çŞä¸ăžă§ăšăŻăăźăŤăăžăă
https://codesandbox.io/s/m4nzvryrxj
useEffect(() => {
window.scrollTo(0, 0);
}, [activeTab]);
ăăăŚç§ăŻReact Hook useEffect has an unnecessary dependency: 'activeTab'. Either exclude it or remove the dependency array
ăćăŤĺ
Ľăăžăă
ăžăăăăă¤ăăŽăłăłăăźăăłăă秝čĄăăă¨ăăŤăcomponentDidMountăŽĺä˝ăč¤čŁ˝ăăăă¨ćăăžăă
useEffect(() => {
...
}, []);
ăăŽăŤăźăŤăŻăăăŤă¤ăăŚćżăăä¸ĺšłăč¨ăŁăŚăăžăă useEffecté ĺăŤăăšăŚăŽäžĺé˘äżăčż˝ĺ ăăăă¨ăčşčşăăŚăăžăă
ćĺžăŤăuseEffectăŽĺăŤć°ăăă¤ăłăŠă¤ăłé˘ć°ă厣č¨ăăă¨ă揥ăŽăăăŤăŞăăžăă
https://codesandbox.io/s/nr7wz8qp7l
const foo = () => {...};
useEffect(() => {
foo();
}, []);
ăăŞăăĺžăďź React Hook useEffect has a missing dependency: 'foo'. Either include it or remove the dependency array
äžĺé˘äżăŞăšăăŤfooăčż˝ĺ ăăăă¨ăŤă¤ăăŚăŠăćăăăăăăžăăă ĺăŹăłăăŞăłă°ă§fooăŻć°ăăé˘ć°ă§ăăăuseEffectăŻĺ¸¸ăŤĺŽčĄăăăžăăďź
@ ksaldana1ĺŻä˝ç¨ăă¤ăăłăăăłăăŠăźĺ ăŤé 罎ăăă ăă§ăŻä¸ĺĺă§ăă ăăăŤăăăĺŽéăŽć´ć°ăăłăăăăăăĺăŤĺŻä˝ç¨ăçşçăăĺż čŚäťĽä¸ăŤé ťçšăŤĺŻä˝ç¨ăăăŞăŹăźăăăĺŻč˝ć§ăăăăžăă
ăžăă useReducer
使ç¨ăăŚăăĺ ´ĺăŻăć´ć°ăăăçść
ăă¤ăăłăăăłăăŠăźĺ
ă§ä˝żç¨ă§ăăŞăăăăćŠč˝ăăžăăă
äťăŽĺ¤ăçľăżĺăăăĺä¸ăŽĺ¤ăŤé˘ăăŚăŻă
useMemo
ăăăăăăăŞăăćăăăŽăŤăŞăă§ăăăă
ăăŽäžă§useMemo
使ç¨ăăĺ ´ĺă firstName
ăžăăŻlastName
ĺ¤ć´ăăăăăłăŤuseMemo
ăć°ăăfullName
ăĺ°ĺşăăăăăç ´ćăăžăă ăăă§ăŽĺä˝ăŻă[äżĺ]ăăżăłăăŻăŞăăŻăăăăžă§fullName
ăć´ć°ăăăŞăăă¨ă§ăă
@awearyăăŽăăăŞăăŽăŻćŠč˝ăăžăăďź https://codesandbox.io/s/lxjm02j50m
ć¨ĺĽ¨ăăăĺŽčŁ
ăä˝ă§ăăăăçĽăăăă¨ćăăžăă
ăžăăăăŞăăčż°ăšăăăă¤ăăŽăă¨ăŤă¤ăăŚăăŁă¨çĽăăăă§ăă ăăăăŤă¤ăăŚăŽčŠłç´°ăćăăŚăăă ăăžăăďź
ăăłăăŠăźă§ăŽăăŞăŹăźă¨ĺšćďź
ăăăŤăăăĺŽéăŽć´ć°ăăłăăăăăăĺăŤĺŻä˝ç¨ăçşçăăĺż čŚäťĽä¸ăŤé ťçšăŤĺŻä˝ç¨ăăăŞăŹăźăăăĺŻč˝ć§ăăăăžăă
ă¤ăăłăăăłăăŠăźă§useReducer
çść
ă使ç¨ăăďź
ć´ć°ăăăçść ăŻĺŠç¨ă§ăăžăăă
ăăăă¨ăďź
@bugzpodder税éĄçĄé˘äżăŞăŽăăăšăŻăăźăŤăťăłăźăŤăĺ
ăŤăăĺż
čŚăăăăžăuseLayoutEffect
ăŽäťŁăăăŤuseEffect
ă çžĺ¨ăć°ăăăŤăźăăŤç§ťĺăăă¨ăçŽçŤăŁăăĄăă¤ăăăăăžă
ăăăćĺłçăŞăăŽăăŠăăăăăăŞăďź
ĺ°éĺ ˇăăé˘ć°ăĺźăłĺşăă¨ăăŞăłăżăźăŻĺ°éĺ ˇăŞăă¸ă§ăŻăĺ ¨ä˝ăäžĺé˘äżă¨ăăŚčż˝ĺ ăăăă¨ăććĄăăžăă
ç縎çďź
useEffect(function() {
props.setLoading(true)
}, [props.setLoading])
// â ď¸ React Hook useEffect has a missing dependency: 'props'.
ăăŤăăźă¸ă§ăłďź Codesandbox
ăăä¸ĺşŚăăç´ăăŚăă ăă...ăăăäťĺăŻăăŁă¨ç°Ąĺă§ă;ďź
ĺ°éĺ
ˇă§ăăžăăŻĺŽéăŤăŻăŠăăăă§ăé˘ć°ă渥ăăăăăŻĺ
ă§ăăŽé˘ć°ă使ç¨ăăă¨ă exhaustive-deps
čŚĺă襨示ăăăžăă
ă ăăç§ăŻćăăăŤé˘ć°ăäžĺé˘äżé ĺăŤčż˝ĺ ăăăă¨ăă§ăăžăăăăăăŻé˘ć°ă§ăăćąşăăŚĺ¤ć´ăăăŞăăŽă§ăăăăŻä¸ĺż čŚă§ăăăďź
ăăăăăŞăăĺż čŚă¨ăăăăšăŚă§ăăăă¨ăéĄăŁăŚăăžăăăăăăăăç§ăćĺłăăăă¨ă示ăăăŽă§ăç§ăŻĺăŤ@siddharthkpăŽăľăłăăăăŻăšăăăŠăźăŻăăžăăă
THXă
ă ăăç§ăŻćăăăŤé˘ć°ăäžĺé˘äżé ĺăŤčż˝ĺ ăăăă¨ăă§ăăžăăăăăăŻé˘ć°ă§ăăćąşăăŚĺ¤ć´ăăăŞăăŽă§ăăăăŻä¸ĺż čŚă§ăăăďź
ăăăŻćŁăăăăăžăăă é˘ć°ăŻă茪ăĺăŹăłăăŞăłă°ăăă¨ăăŤĺ¸¸ăŤĺ¤ć´ăăăĺŻč˝ć§ăăăăžăă
@siddharthkp
ĺ°éĺ ˇăăé˘ć°ăĺźăłĺşăă¨ăăŞăłăżăźăŻĺ°éĺ ˇăŞăă¸ă§ăŻăĺ ¨ä˝ăäžĺé˘äżă¨ăăŚčż˝ĺ ăăăă¨ăććĄăăžăă
ăăăŻăćčĄçăŤăŻprops.foo()
ăprops
čŞä˝ăthis
ăăfoo
ĺźăłĺşăă¨ăăŚć¸Ąăăăă§ăă ăăăăŁăŚă foo
ăŻćéťçăŤprops
äžĺăăĺŻč˝ć§ăăăăžăă ăă ăăăăŽĺ ´ĺăŻăăŁă¨čŻăăĄăăťăźă¸ăĺż
čŚă§ăă ăăšăăăŠăŻăăŁăšăŻĺ¸¸ăŤç ´ĺŁăăăă¨ă§ăă
é˘ć°ăŻă茪ăĺăŹăłăăŞăłă°ăăă¨ăăŤĺ¸¸ăŤĺ¤ć´ăăăĺŻč˝ć§ăăăăžăă
ăăĄăăă§ăăăé˘ć°ă茪ăłăłăăźăăłăăăă§ăŻăŞăäťăŽĺ ´ćă§ĺŽçžŠăăăŚăăĺ ´ĺăăăăŻĺ¤ć´ăăăžăăă
ăăĄăăă§ăăăé˘ć°ă茪ăłăłăăźăăłăăăă§ăŻăŞăäťăŽĺ ´ćă§ĺŽçžŠăăăŚăăĺ ´ĺăăăăŻĺ¤ć´ăăăžăăă
ç´ćĽă¤ăłăăźăăăĺ ´ĺălintăŤăźăŤăŻă¨ăă§ăŻăăăăăŤčż˝ĺ ăăăăăŤčŚćąăăžăăă ăŹăłăăźăšăłăźăĺ ăŤăăĺ ´ĺăŽăżă ăăăăŹăłăăźăšăłăźăĺ ăŤăăĺ ´ĺălintăŤăźăŤăŻăăăăŠăăăćĽăŚăăăŽăăăăăžăăă äťćĽăŻĺçă§ăŻăăăžăăăă誰ăă茪ăłăłăăźăăłăăĺ¤ć´ăăă¨ăććĽăŤăŞăĺŻč˝ć§ăăăăžăă ăăăăŁăŚăăăăćĺŽăăăă¨ăćŁăăăăăŠăŤăă§ăă ă¨ăŤăăéçă§ăăĺ ´ĺăăăăćĺŽăăăă¨ăŻĺŽłăŻăăăžăăă
thx @gaearon
ăăăŻăćčĄçăŤăŻ
props.foo()
ăprops
čŞä˝ăthis
ăăfoo
ĺźăłĺşăă¨ăăŚć¸Ąăăăă§ăă ăăăăŁăŚăfoo
ăŻćéťçăŤprops
äžĺăăĺŻč˝ć§ăăăăžăă ăă ăăăăŽĺ ´ĺăŻăăŁă¨čŻăăĄăăťăźă¸ăĺż čŚă§ăă ăăšăăăŠăŻăăŁăšăŻĺ¸¸ăŤç ´ĺŁăăăă¨ă§ăă
ăăăŻç§ăŽčłŞĺăŤăçăăžăă ăăăă¨ăăăăăžăăďź đ
https://codesandbox.io/s/98z62jkyro
ăăŽăăăĺĺ ĽĺăŽăłăłăăăšăă§ĺ ŹéăăăŚăăAPIă使ç¨ăăŚăăšăŚăŽĺ Ľĺăçťé˛ăăĺ ĽĺăŽć¤č¨źăĺŚçăăăăăŽăŠă¤ăăŠăŞăä˝ćăăŚăăžăă useRegisteră¨ăăăŤăšăżă ăăăŻăä˝ćăăžăăă
ĺ ďź
useEffect(
() => {
register(props.name, props.rules || []);
console.log("register");
return function cleanup() {
console.log("cleanup");
unregister(props.name);
};
},
[props.name, props.rules, register, unregister]
);
props.rulesăäžĺé˘äżăŽä¸é¨ăŤăăăăăŤĺźˇĺśăăă¨ăçĄéăŽăŹăłăăŞăłă°ăŤăźăăŤăŞăŁăŚăăžăăăă§ăă Props.rulesăŻăăăŞăăźăżăźă¨ăăŚçťé˛ăăăé˘ć°ăŽé ĺă§ăă é ĺăäžĺé˘äżă¨ăăŚćäžăăĺ ´ĺăŤăŽăżăăăŽĺéĄăć¤ĺşăăžăăă ç§ăŽăłăźăăľăłăăăăŻăšă§ăŻăăłăłă˝ăźăŤăéăăŚăŤăźăăăŚăăăă¨ăăăăăžăă
props.nameăäžĺé˘äżă¨ăăŚćă¤ă ăă§ăćĺłăăă¨ăăăŤćŠč˝ăăžăă äžĺé˘äżă埡ĺśăăă¨ăäťăŽććăŠăăăŤă˘ăăŞăąăźăˇă§ăłăŽĺä˝ăĺ¤ĺăăăăŽĺ ´ĺăĺŻä˝ç¨ăŻćˇąĺťă§ăă
@bugzpodder
Reďź https ďź
useEffect(() => {
window.scrollTo(0, 0);
}, [activeTab]);
ăăăŻćŁĺ˝ăŞăąăźăšăŽăăă§ăă čŚĺă硊ĺăăŚăĺšćăŽăżăŽçĄé˘äżăŞăăăă訹ĺŻăăžăă ďźăă ăă useMemo
ăžăăŻuseCallback
ă§ăăďź
ăžăăăăă¤ăăŽăłăłăăźăăłăă秝čĄăăă¨ăăŤăcomponentDidMountăŽĺä˝ăč¤čŁ˝ăăăă¨ćăăžăă
ăăŽăŤăźăŤăŻăăăŤă¤ăăŚćżăăä¸ĺšłăč¨ăŁăŚăăžăă useEffecté ĺăŤăăšăŚăŽäžĺé˘äżăčż˝ĺ ăăăă¨ăčşčşăăŚăăžăă
çłă訳ăăăžăăăăăăŽäžăčż˝ĺ ăăŞăăŁăăăăăăăŤă¤ăăŚčŠąăĺăćŠäźă夹ăăžăăă ăăŽăăăOPć稿ă§ăŻĺ ˇä˝çăŞUIăŽäžăăžăă ăăŞăăŻćĺăŽăă¤ăłăăŽăăăŤăăŁăăăăăăŻăăŞăăŁăă ĺ ˇä˝çăŞäžăćăăŚăăă ăăă°ĺš¸ăă§ăă 芳細ăŻćŹĺ˝ăŤăăăŤäžĺăăžăă
ćĺžăŤăuseEffectăŽĺăŤć°ăăă¤ăłăŠă¤ăłé˘ć°ă厣č¨ăăă¨ă揥ăŽăăăŤăŞăăžăďź https ďź//codesandbox.io/s/nr7wz8qp7l
ăăŽĺ ´ĺăŽç°ĄĺăŞäżŽćŁăŻă doSomething
ăă¨ăă§ăŻăăŤç§ťĺăăăă¨ă§ăă ăăŽĺžăăăă厣č¨ăăĺż
čŚăŻăăăžăăă ăžăăŻă doSomething
ăăăuseCallback
ăŤăăăă¨ăă§ăăžăă 厣č¨ăăădepsăŽăżă使ç¨ăăé˘ć°ăççĽă§ăăăăăŤăăŤăźăŤă硊ĺăăăă¨ăŻă§ăăžăă ăă ăăĺĽăŽé˘ć°ăĺźăłĺşăé˘ć°ăăăăăăăăŽé˘ć°ăŽ1ă¤ăŤĺ°éĺ
ˇăžăăŻçść
ăčż˝ĺ ăăă¨ă桡䚹ăăĺŻč˝ć§ăăăăžăă çŞçśăć¨ç§ťçăŤä˝żç¨ăăăăšăŚăŽă¨ăă§ăŻăé¨éăć´ć°ăăĺż
čŚăăăăžăă 桡䚹ăăĺŻč˝ć§ăăăăžăă
ăăăć°ăăăŤăźăŤăŽćŠč˝ăŞăŻă¨ăšăăŞăŽăăăăă¨ăexhaustive-deps
ăŤă¤ăăŚćšĺă§ăăăăŽăŞăŽăăăăăžăăâŚ
import React from 'react'
import emitter from './thing'
export const Foo = () => {
const onChange = () => {
console.log('Thing changed')
}
React.useEffect(() => {
emitter.on('change', onChange)
return () => emitter.off('change', onChange)
}, [onChange])
return <div>Whatever</div>
}
onChange
é˘ć°ăŻăŹăłăăŞăłă°ăă¨ăŤä˝ćăăăăăă useEffect
ăăăŻ[onChange]
ĺźć°ăŻĺéˇă§ăăăĺé¤ăăăă¨ăă§ăăžăă
React.useEffect(() => {
emitter.on('change', onChange)
return () => emitter.off('change', onChange)
- }, [onChange])
+ })
ăŞăłăżăźăŻăăăć¤ĺşăăé ĺĺźć°ăĺé¤ăăăăăŤă˘ăăă¤ăšăăăă¨ăă§ăăžăă
é ĺă˘ă¤ăă ăŽăŞăšăăçśćăăŚăăçśćłăăăăžăăăăăăăăŽ1ă¤äťĽä¸ăä˝ćăăăŚăăŚăă¨ăŤăăăŹăłăăŞăłă°ăă¨ăŤăăăŻăçĄĺšăŤăŞăŁăŚăăăă¨ăŤć°ăĽăăžăăă
[email protected]
ăăŞăŞăźăšăăă°ăăă§ăăăŽăŤăźăŤăŽăăă¤ăăŽäżŽćŁă¨ăăčŻăăĄăăťăźă¸ăĺŤăžăăŚăăžăă çťćçăŞăă¨ăŻä˝ăăăăžăăăăăăă¤ăăŽăąăźăšă解湺ăăĺż
čŚăăăăžăă ćĽéąăŻćŽăăčŚăŚăăăžăă
ăžăăăĺŽĺ ¨ăŞăé˘ć°depsăççĽăăăăăŽćĺăŽĺŻč˝ăŞăšăăăăhttps://github.com/facebook/react/pull/14996ăŤć稿ăăžăă
@gaearonç´ ć´ăăăă˘ă¤ăă˘ă ăăăŻăăăăŻă使ç¨ăăă¨ăăŤăăăčŻăăšăżă¤ăŤăćă¤ăăăŤééăăŞă彚çŤăĄăžăđ
@gaearonă˘ăŻăˇă§ăłăĺ°éĺ ˇăăćĽăĺ ´ĺăăăăŻăžă ćŠč˝ăăžăăă ăăŽäžăčăăŚăżăžăăăă
setScrollTop
ăŻreduxă˘ăŻăˇă§ăłă§ăă
ăăŽSlider
ăłăłăăźăăłăăŽäžă§ăŻă Slider
useEffect
ă使ç¨ăăŚăDOMă使ç¨ĺŻč˝ăŤăŞăăžă§ĺž
ćŠăănoUiSliderăłăłăăźăăłăăăăŚăłăă§ăăăăăŤăăŚăăžăă ăăăăŁăŚă [sliderElement]
ă渥ăăŚăă¨ăă§ăŻăăŽĺŽčĄćăŤDOMă§ĺç
§ă使ç¨ă§ăăăăăŤăăžăă ăłăłăăźăăłăăăľăźăăźă§ăŹăłăăŞăłă°ăăăăăăŹăłăăŞăłă°ĺăŤDOMă使ç¨ă§ăăăăăŤăŞăăžăă useEffect
使ç¨ăăäťăŽĺ°éĺ
ˇďźă¤ăžăăćĺ°ăć大ăonUpdateăŞăŠďźăŻĺŽć°ă§ăăăăăăăăăă¨ăă§ăŻăăŤć¸Ąăĺż
čŚăŻăăăžăăă
codesandboxăŤčŚăăăĺšćăŻćŹĄăŽă¨ăăă§ăă
const { min, max, step } = props;
const sliderElement = useRef();
useEffect(() => {
if (!sliderElement.current) {
return;
}
const slider = sliderElement.current;
noUiSlider.create(slider, {
connect: true,
start: [min, max],
step,
range: {
min: [min],
max: [max],
},
});
if (props.onUpdate) {
slider.noUiSlider.on('update', props.onUpdate);
}
if (props.onChange) {
slider.noUiSlider.on('change', props.onChange);
}
}, [sliderElement]);
@ WebDeg-ăăŠă¤ă˘ăłĺŽĺ ¨ăŞCodeSandboxăă˘ăŞăă§ăŻăćäźăă§ăăžăăă ăăăă ä¸ăŽć稿ăĺç §ăăŚăă ăăă
ä¸čŹçăŞăćŠč˝ăŻćąşăăŚĺ¤ăăăŞăăă¨ăă誤解ăŤă¤ăăŚĺ°ăć稿ăăžăăă
https://overreacted.io/how-are-function-components-different-from-classes/
ăžăŁăăĺăăăăăŻă§ăŻăăăžăăăăăăŽăŤăźăŤăŤé˘éŁăăŚăăžăă
ăăăŤăĄăŻ@gaearon ăăăăŻăăŞăăç§ăŤăăăŤć稿ăăăăăŤé źăă äžă§ăďźăă¤ăźăżăźăăďź:)
ĺşćŹçăŤăăŠă¤ăăŠăŞăŽreact-trapăăăăŻăŤĺ¤ćăăăă¨ăăŚăăžăă
ăăăŻăčŚç´ ăŽĺ¤ĺ´/ĺ
ĺ´ăŽă¤ăăłăăŽăăŠăăăŤăăăžăăă
ç§ăŽĺéĄăŻă useEffect
ăçść
ĺ¤ďź trapped
ďźăŤäžĺăăŚăăŞăĺ ´ĺăĺ¤ăăŞăŁăŚăăăă¨ăăăă¨ăăăă¨ă§ăă
ĺŽćźăăăăăŤăăă¤ăăŽăłăĄăłăă¨ăă°ăć¸ăăžăăă useTrap.js
ăăĄă¤ăŤăčŚăŚăă ăăăăłăĄăłăă¨ăă°ăŻă useEffect
preventDefaultHelper
é˘ć°ă¨
ç§ăŽçĽăéăăĺ¤ăuseEffect
ĺ
ăŤăŞăĺ ´ĺăăăŽĺ¤ăŻăăŽäžĺé˘äżăŽä¸é¨ă§ăăŁăŚăŻăŞăăžăăďźééăŁăŚăăĺ ´ĺăŻč¨ćŁăăŚăă ăăďźă
e.preventDefault
ďźăăăă§ć確ăŤăŞăăăŚăźăšăąăźăšăç解ă§ăăăă¨ăéĄăŁăŚăăžăăăăăŤć ĺ ąăćäžăăĺż čŚăăăĺ ´ĺăŻăçĽăăăă ăăă ăăăă¨ăďź
ăăăŤăĄăŻ@ gaearon ăTwitteră§ććĄăăăăăăŤăăăăŤăŤăšăżă ăăăŻăčż˝ĺ ăăžăďź äžĺé˘äżăăšăăăăăŞăćŁăă形ăčŚă¤ăăăŽăŤčŚĺ´ăăŚăăžăă
äžă¨ăăŚăŻćăŽčžźăă ăăŽă§ăăăăăăăăă誏ćă§ăăă°ă¨ćăăžăă
ăăăçžĺ¨ăŽçść ă§ăďź react-async-utils / src / hooks / useAsyncData.ts
ćŠč˝ăŽćŚčŚ
ăŚăźăśăźăéĺćĺźăłĺşăăĺŚçăăçľćăŽăăźăżă¨ăăăťăšăŤć˛żăŁăçść
ăĺŚçăăăŽăćŻć´ăăžăă
triggerAsyncData
ăŻă Promise
ăčżăgetData
é˘ć°ăŤĺžăŁăŚă asyncData
çść
ăéĺćçăŤć´ć°ăăžăă triggerAsyncData
ăŻăă¨ăă§ăŻăă¨ăăŚăăžăăŻăăăŻăŚăźăśăźăăćĺă§ăĺźăłĺşăăă¨ăă§ăăžăă
課éĄ
triggerAsyncData
ăĺźăłĺşăă¨ăă§ăŻăăŽäžĺé˘äżăŻăćŹčłŞçăŞăăŽă§ăă triggerAsyncData
ăŻă¨ăă§ăŻăăŽäžĺé˘äżă§ăăăăăšăŚăŽăŹăłăăŞăłă°ă§ä˝ćăăăžăă ăăăžă§ăŽčăćšďźuseMemo
/ useCallback
ă¨triggerAsyncData
=> useMemo
/ useCallback
ăŻăăăăŠăźăăłăšăŽćéŠĺăŤăŽăżä˝żç¨ăăĺż
čŚăăăăžăăç§ăŽçĽăéăătriggerAsyncData
ăäžĺé˘äżă¨ăăŚä˝żç¨ăă䝣ăăăŤă triggerAsyncData
äžĺé˘äżăäžĺé˘äżă¨ăăŚä˝żç¨ăăžă=>ăăăžă§ăŤčŚă¤ăăćčŻăŽăŞăăˇă§ăłă ăăăăăăăŻăexhaustive-depsăăŤăźăŤăŤéĺăăžăăuseMemo
/ useCallback
ă使ç¨ăăŚăéŠĺăŞĺ¤ăćäžăăžă=>é常ăŤé ťçšăŤćäžăăăŞăăŽă§ăŻăŞăăă¨ćăăžăă ăăăŚă彟ăăăăăăăŞăă°ăăăăŻăăŞăĺéˇă§ăăasyncData
ďźă ăăăŤăăăăexhaustive-depsăăŤăźăŤăĺăłç ´ăăăžăăćăŁăăăéˇă誏ćâŚă§ăăăăăŻăăăĄăă¨ä˝żăăŽăŤčŚĺ´ăăăă¨ăĺć ăăŚăăă¨ćăăžăă ăăăăŽĺéĄăć確ăŤăăăăăŤäťăŤă§ăăăă¨ăăăă°ćăăŚăă ăăă
ăăă§é ĺźľăŁăŚăăăŚăăăă¨ăďź
ăă@gaearonăăŞăăŽăăšăŚăŽăăźăăŻăźăŻăŤćčŹăăžăă
ćĺ°éăŽéĺćăăźăżăă§ăăăŽäžCodeSandboxăŽäžă
ăŚăźăśăźăŻ5ă¤ăŽLoremăŽă¤ăăľă ăŽăżă¤ăăŤćĺĺăăăă§ăăčŚăăă¨ăäşćłăăăJSON API ă
çŽçăŽAPIă使ç¨ăăŚăăźăżăăă§ăăăăăăăŽăŤăšăżă ăăăŻăä˝ćăăžăăă
const { data, isLoading, isError } = useDataApi('https://jsonplaceholder.typicode.com/posts')
ăŤăšăżă useDataApi
ăăăŻăŽĺ
é¨ďź
...
const fetchData = async () => {
let response;
setIsError(false);
setIsLoading(true);
try {
response = await fetch(url).then(response => response.json());
setData(response);
} catch (error) {
setIsError(true);
}
setIsLoading(false);
};
useEffect(
() => {
fetchData();
},
[url]
);
...
ăăŽăłăźăăŽĺéĄ
useEffect(
() => {
fetchData();
},
[url]
);
ăăă§ă react-hooks/exhaustive-deps
ăŻăäžĺé˘äżé
ĺăŤfetchData
ăčż˝ĺ ăă url
ăĺé¤ăăĺż
čŚăăăă¨ăăčŚĺăçşăăžăă
ăăŽăăăŻăăŤĺ¤ć´ăăă¨
useEffect(
() => {
fetchData();
},
[fetchData]
);
ăăŽĺžăăŞăŻă¨ăšăăçśçśçăŤçşçăăăĺć˘ăăăă¨ăŻăăăžăăăăăăŻăăĄăă大ăăŞĺéĄă§ăă ăłăźăăŤăă°ăăăăŽăââă react-hooks/exhaustive-deps
ă誤ć¤çĽăĺźă辡ăăăŚăăăŽăăăăăžăăă
ĺŠăăŚăăă ăăă°ĺš¸ăă§ăă ćŹĺ˝ăŤăăăă¨ăă
PS useEffectăăăźăżăă§ăăăŤăžăăăă react docsăŻăăăźăżuseEffect
ăăăźăżăă§ăăăŤćéŠă§ăăă¨ăă確俥ăä¸ăăŚăăăData fetching, setting up a subscription, and manually changing the DOM in React components are all examples of side effects
ă丝埾ăăŚăăžăă ă ăăäťç§ăŻĺ°ă桡䚹ăăŚăăžăđ
@ jan-stehlikăŻfetchDataăuseCallbackă§ăŠăăăăĺż čŚăăăăžăă ăăă§ĺż čŚăŞĺ¤ć´ăĺ ăăŚcodesandboxăăăŠăźăŻăăžăăhttps://codesandbox.io/s/pjmjxprp0m
ă¨ăŚăĺŠăăăžăăă
ç§ăŽçĽăéăăĺ¤ăuseEffectĺ ăŤăŞăĺ ´ĺăăăŽĺ¤ăŻăăŽäžĺé˘äżăŽä¸é¨ă§ăăŁăŚăŻăŞăăžăăďźééăŁăŚăăĺ ´ĺăŻäżŽćŁăăŚăă ăăďźă
ç§ăŻăăŞăăăăă§ééăŁăŚăăă¨ćăăžăă ă¨ăăăăĺ°ă桡䚹ăăŚăăžăă ăăŞăăŻă使ç¨ăăŚăăhandleEvent
ăăŞăăŽĺšćăŽĺ
ĺ´ă ăăăăăăŞăăŻăăă厣č¨ăăžăăă ăăŽăăăčŞăżĺăŁăĺ¤ăŻĺ¤ăăŞăŁăŚăăžăă
é˘ç˝ăă
ă¨ăă§ăŻăĺ ă§handleEventă使ç¨ăăŚăăžăă ăăăăăăŞăăŻăăă厣č¨ăăžăăă ăăŽăăăčŞăżĺăŁăĺ¤ăŻĺ¤ăăŞăŁăŚăăžăă
ăŠăăăćĺłă§ăăďź_ "ăăăăăăŞăăŻăăă厣č¨ăăžăă" _ďź
ĺšćăŽä¸ă§ĺŽŁč¨ăăăžăďźäťăŽăăšăŚăŽăăłăăŠăźă¨ĺăă§ăďźă
ăžăăŻăăăłăăŠăźăçść ĺ¤ă使ç¨ăăŚăăŚăă¨ăă§ăŻăăăăłăăŠăźăă˘ăżăăăăŚăăăăăă¨ăă§ăŻăăăăŽçść ĺ¤ăŤäžĺăăŚăăăă¨ăćĺłăăžăăďź
ăžăăŻăăăłăăŠăźăçść ĺ¤ă使ç¨ăăŚăăŚăă¨ăă§ăŻăăăăłăăŠăźăă˘ăżăăăăŚăăăăăă¨ăă§ăŻăăăăŽçść ĺ¤ăŤäžĺăăŚăăăă¨ăćĺłăăžăăďź
ăŻăăăăŞăăćŠč˝ă使ç¨ăăĺ ´ĺăăăŞăăŻăŠăĄăăDEPSă§ăăă厣č¨ăăĺż
čŚăăăăžăďźăăŽĺ ´ĺă§ăăăăŠăăuseCallback
ăăăĺä˝ćăéżăăăăăŤďźăăžăăŻăăšăŚăăŽé˘ć°ă使ç¨ăăžăă
ăăăăžăăăăăăŻç§ăŤă¨ăŁăŚăŽăăĽăźăšă§ăďź ăăŽĺ
Ľĺăăăăă¨ă@gaearon :)
ç§ďźăăăŚäťăŽäşşďźďźăŤă¨ăŁăŚăăăé常ăŤć確ă§ăăăă¨ăćăă§ăăžă...
ă¨ăă§ăŻăăé˘ć°ăĺźăłĺşăăăă渥ăăăăä˝ăăĺŽčĄăăăăăĺ ´ĺăŻă揥ăŽăăăăăŽdepsé
ĺăŤć¸Ąăĺż
čŚăăăăžăă
é˘ć°čŞä˝ORăăŽé˘ć°ă使ç¨ăăĺ¤ć°ă
é˘ć°ăé˘ć°ăłăłăăźăăłă/ăŤăšăżă ăăăŻĺ
ă§ĺŽŁč¨ăăăŚăăĺ ´ĺăŻăăłăłăăźăăłăăžăăŻăŤăšăżă ăăăŻăĺŽčĄăăăăăłăŤĺä˝ćăăăŞăăăăŤăé˘ć°ăuseCallback
ăŠăăăăăă¨ăăĺ§ăăăžăă
ç§ăŻăăăăăăĽăĄăłăă§čŚăŞăăŁăă¨č¨ăăŞăăă°ăŞăăžăăă
_Note_ăťăŻăˇă§ăłăŤčż˝ĺ ăăŚă大ä¸ĺ¤Ťă ă¨ćăăžăăďź
ăăźă
ĺ ĽĺăŽé ĺăŻăĺźć°ă¨ăăŚă¨ăă§ăŻăé˘ć°ăŤć¸Ąăăăžăăă ăă ăăćŚĺżľçăŤăŻăăă襨ăăăžăăă¨ăă§ăŻăé˘ć°ĺ ă§ĺç §ăăăăăšăŚăŽĺ¤ăŻăĺ Ľĺé ĺăŤă襨示ăăăĺż čŚăăăăžăă ĺ°ćĽçăŤăŻăĺĺăŤéŤĺşŚăŞăłăłăă¤ăŠăăăŽé ĺăčŞĺçăŤä˝ćăăĺŻč˝ć§ăăăăžăă
硨é
ăă1ă¤ăç§ăŽäžă§ăŻă handleEvent
ďźăžăăŻăăŽççąă§äťăŽăăłăăŠăźďźăăŠăăăăă¨ăăŽuseCallback
ăŽdepsăŻä˝ă§ăăă ăăăŻevent
ăăčŞä˝ă§ăăďź
ç§ăŻăăăăăăĽăĄăłăă§čŚăŞăăŁăă¨č¨ăăŞăăă°ăŞăăžăăă
ăăăĽăĄăłăăŤăŻăăă¨ăă§ăŻăé˘ć°ĺ ă§ĺç §ăăăăăšăŚăŽĺ¤ăŻăĺ Ľĺé ĺăŤă襨示ăăăĺż čŚăăăăžăăă¨č¨čźăăăŚăăžăă é˘ć°ăĺ¤ă§ăă ăăăăăéŠĺăŤćć¸ĺăăĺż čŚăăăăă¨ăŤĺćăăžăâăăăăăŽăšăŹăăăŽăăšăŚă§ă:-)ăăĺ°ç¨ăŽć°ăăćć¸ĺăăźă¸ăŽăŚăźăšăąăźăšăĺéăăŚăăžăă
ăă1ă¤ăç§ăŽäžă§ăŻăhandleEventďźăžăăŻăăŽççąă§äťăŽăăłăăŠăźďźăăŠăăăăă¨ăăŽuseCallbackăŽdepsăŻä˝ă§ăăă ăăăŻăăčŞä˝ăă¤ăăłăă§ăăďź
ăăĺăăăŞăă ăăăŻăăăŽĺ¤é¨ăŽé˘ć°ăŤăăŁăŚĺç
§ăăăäťťćăŽĺ¤ă§ăă useEffect
ă
é˘ć°ăäžĺé˘äżă¨ăăŚăăăăčăćăăŞăăŁăă¨ćăăžăă ç§ăŽăĄăłăżăŤă˘ăăŤăŻééăŁăŚăăžăăăăłăłăăźăăłă/ăăăŻă¸ăŽĺ°éĺ ˇăžăăŻĺźć°ă¨ăăŚćäžăăăĺ ´ĺăŤăŽăżăé˘ć°ăäžĺé˘äżă¨ăăŚć¸ĄăăăăŤčăăŚăăžăăă ăăăć確ăŤăăŚăăăŚăăăă¨ăă
useCallback
ăç§ăŻćŹĄăŽăăăŤä˝żç¨ăăžăăă
const memoHandleEvent = useCallback(
handleEvent
);
ăăăŚăăĄăă渥ămemoHandleEvent
ăăăăăŤăäžĺé˘äżă¨ăăŚuseEffect
ăŚă§ăŤăŤă¨ăăŚaddEventListener
INSEADćŹçŠăŽhandleEvent
ćŠč˝ă ăăžăăăăăă§ăăăăăăéŠĺă§ć
Łç¨çăŞćšćłă§ăăăă¨ăéĄăŁăŚăăžăă
2çŞçŽăŽĺźć°ăăŞăuseCallback
ăŻä˝ăăăŞăăă¨ăŤćł¨ćăăŚăă ăăă
çš°ăčżăăžăăăĺŽĺ ¨ăŞăľăłăăăăŻăšăĺż čŚăŤăŞăăžăă ăăŽăăăŞä¸ĺŽĺ ¨ăŞčŞŹćă§ăŻă俎ćŁăćŁăăăăŠăăăăăăžăăă
2çŞçŽăŽĺźć°ăŽăŞăuseCallbackăŻä˝ăăăŞăăă¨ăŤćł¨ćăăŚăă ăăă
ă˘ăźă°ďź ďźăăăăŁé˘ďźçŹ
çš°ăčżăăžăăăĺŽĺ ¨ăŞăľăłăăăăŻăšăĺż čŚăŤăŞăăžăă ăăŽăăăŞä¸ĺŽĺ ¨ăŞčŞŹćă§ăŻă俎ćŁăćŁăăăăŠăăăăăăžăăă
ăăăăăăŻä¸ăăăŽĺăăŞăłăŻă§ăă ç§ăŻăĄăăăŠăăăć´ć°ăăžăă:)
CodeSandboxăŞăłăŻăć´ć°ăăŞăă§ăă ăăďźPIăŻĺ ă ăŽăăăŤăăăăĺż čŚă¨ăăžăâăăă§ăŞăăă°ăăăăăŽlintăŤăźăŤăăăšăă§ăăžăăă 2ă¤ăŽç°ăŞăă˝ăŞăĽăźăˇă§ăłăăăĺ ´ĺă2ă¤ăŽĺĽă ăŽăľăłăăăăŻăšăä˝ćăăŚăăă ăăžăăďź ă ăăç§ăŻăăăăăăă§ăăŻăăăă¨ăă§ăăžăă
ăăŁă¨ăăăďź ďźPIăç§ăŽă˘ăŤăŚăłăăŽăľăłăăăăŻăšăŽć°ăčś ăăžăăă ăăă¤ăĺé¤ăăăŚăă ăăăĺĽăŽăăŽăä˝ćăăžăďźăăăŚĺ ăŽĺ¤ć´ăĺ ăŤćťăăžăďźă
@gaearonăăăŻuseCallback
ă使ç¨ăăă˝ăŞăĽăźăˇă§ăłă¸ăŽ2çŞçŽăŽăŞăłăŻă§ă
大ä¸ĺ¤Ťă ă¨ćăăˇăăŞăŞăăăăžăăăăŞăłăżăźăŻćĺĽăč¨ăăžăă ç§ăŽăľăłăăŤďź
ăľăłăăŤă襨çžăăăă¨ăăŚăăăŽăŻăăŚăźăśăźăăăżăłăăŻăŞăăŻăăă¨ă䝼ĺăŤćäžăăăIDă¨é˘ć°ăŤĺşăĽăăŚć°ăăăăźăżăčŚćąăăăăăŤčŚćąăăăžăă IDăĺ¤ć´ăăăĺ ´ĺăć°ăăăăźăżăčŚćąăăăšăă§ăŻăăăžăăă ăŞăăźăăŽć°ăăăŞăŻă¨ăšăăŽăżăć°ăăăăźăżăŞăŻă¨ăšăăăăŞăŹăźăăĺż čŚăăăăžăă
ăăă§ăŽäžăŻĺ°ăä¸čŞçśă§ăă ç§ăŽĺŽéăŽă˘ăăŞăąăźăˇă§ăłă§ăŻăReactăŻăŻăăăŤĺ¤§ăăŞWebă˘ăăŞăąăźăˇă§ăłăŽăăä¸é¨ă§ăăDIVăŤĺĺ¨ăăžăă 渥ăăăé˘ć°ăŻăReduxă¨mapDispatchToPropsăäťăăŚčĄăăăžăăăăă§ăă˘ăŻăˇă§ăłăŽä˝ćăŻIDăĺĺžăăăăźăżăăă§ăăăăŚăšăă˘ăć´ć°ăăăăăŽajaxăŞăŻă¨ăšăăčĄăăžăă refreshRequestăăăăăŻReact.createElementăäťăăŚć¸Ąăăăžăă ç§ăŽĺ ăŽĺŽčŁ ă§ăŻăăŻăŠăšăłăłăăźăăłăăŤćŹĄăŽăăăŞăłăźăăăăăžăăă
componentDidUpdate (prevProps) {
const { getData, someId, refreshRequest} = this.props;
if (prevProps.refreshRequest!== this.props.refreshRequest) {
getData(someId);
}
}
ă¨ăă§ăŻăăăăŻă使ç¨ăăŚĺăĺä˝ăĺŽčŁ ăăăă¨ăăŚăăžăă ăăăăăľăłăăŤăŤć¸ăăăŚăăăăăŤăăŞăłăżăźăŻćŹĄăŽăăăŤä¸ĺšłăč¨ăăžăă
čŚĺReactHook useEffectăŤăŻăäžĺé˘äżăăăăžăăďź 'getData'ăăăł 'someId'ă ăăăăĺŤăăăăäžĺé˘äżé ĺăĺé¤ăăŚăă ăă
ăŞăłăżăźăĺż čŚă¨ăăăăšăŚăŽăăŽăčż˝ĺ ăăă¨ăăŚăźăśăźăăľăłăăŤăŽăăăăăŽăăżăłăăŻăŞăăŻăăă¨ăuseEffectăăăŞăŹăźăăăžăă ăă ăă[ć°ăăăăźăżăŽčŚćą]ăăżăłăćźăăăă¨ăăŤăŽăżăăŞăŹăźăăăăăăŤăăžăă
ăăžăăăă°ăăăăŻçăŤăăŞăŁăŚăăžăă ä¸ćăŞçšăăăĺ ´ĺăŻăăăăŤć確ăŤăăăŚăăă ăăžăă ăăăă¨ăăăăăžăăďź
ăă˘é˘ć°ăŽäžĺé˘äżăć¤ĺşăăăăăŽĺŽé¨çăŞăľăăźăăăă[email protected]
ăĺ
Źââéăăžăăďź useCallback
ăŞăă§ăŻăăžă彚ăŤçŤăăŞăĺžĺăăăăžăďźă ăăăgifă§ăďź
ăăŞăăŽăăă¸ă§ăŻăă§ăăă芌ăăŚăżăŚăăăăăŠăŽăăăŤćăăăăăăčŚăŚăżăŚăă ăăďź ďźhttps://github.com/facebook/react/pull/15026ă§ăăŽçšĺŽăŽăăăźăŤăłăĄăłăăăŚăă ăăăďź
ććĽăăăŽăšăŹăăăŽäžă§čŠŚăăŚăżăžăă
ăžă 芌ăăŚăăžăăăă塝ăä¸ăăŤĺŻžĺżăăŚăăăŽă§ăŻăŞăă§ăăăăă ăăăŻç§ăăăŽĺ ´ă§ćăă¤ăăăćĺ°éăŽäžăăŤăăăŞăăăăä˝ăŽĺ˝šăŤăçŤăĄăžăăăă return
ăšăăźăăĄăłăăčŚăăăăăăăăŤăăă¤ăšă厣č¨ăé ťçšăŤä˝żç¨ăăŚăăžăă
function Component() {
useEffect(() => {
handleChange
}, [handleChange])
return null
function handleChange() {}
}
ăŞăłăżăźăŤé˘ăăéăăăŤăźăŤăŤuseEffect
ăăăŤĺä˝ăăăăăŤĺĽăŽé˘ć°ăć§ćăăăŞăăˇă§ăłăăăă¨äžżĺŠă§ăă ăă¨ăă°ăăăăčż˝ĺ ăăŚăAJAXĺźăłĺşăăčĄăă¨ăă§ăŻăăŤéĺćé˘ć°ăç°ĄĺăŤä˝żç¨ă§ăăăăăŤăăžăăăăă ăăăăŽăăăŤăăă¨ă exhaustive-deps
ăŞăłăăŁăłă°ăŽĺŠçšăăăšăŚĺ¤ąăăăžăă
const useAsyncEffect = (fn, ...args) => {
/* eslint-disable react-hooks/exhaustive-deps */
useEffect(() => {
fn();
}, ...args);
};
硨éďźć°ăŤăăŞăă§ăă ăăăăăăŻăŤăźăŤăŽadditionalHooks
ăŞăăˇă§ăłă使ç¨ăăŚăă§ăŤĺŻč˝ă§ăăăă¨ăŤć°ăĽăăžăăă
ăăăŤăĄăŻăăżăăŞă
https://codesandbox.io/s/znnmwxol7lăŽäžăăă
䝼ä¸ăŻç§ă揲ăăăăŽă§ăďź
function App() {
const [currentTime, setCurrentTime] = React.useState(moment());
const currentMonth = React.useMemo(
() => {
console.log("RUN");
return currentTime.format("MMMM");
},
[currentTime.format("MMMM")] // <= this proplem [currentTime]
);
return (
<div className="App">
<h1>Current month: {currentMonth}</h1>
<div>
<button
onClick={() => setCurrentTime(currentTime.clone().add(1, "days"))}
>
+ 1 day
</button>
</div>
<div>{currentTime.toString()}</div>
</div>
);
}
ăăăăăăăŻç§ăĺžăăăŽă§ăďź
const currentMonth = React.useMemo(
() => {
console.log("RUN");
return currentTime.format("MMMM");
},
[currentTime] // <= this proplem
);
currentTime
ĺ¤ć´ăăăă¨ă currentMonth
ä¸čŚăŤĺč¨çŽăăăžă
ăžăăŻăŠăăăăăăç§ăŻăăă䝼ä¸ă§čĄăăă¨ăă§ăăžăďź
const currentMonth = React.useMemo(
() => {
return currentTime.format("MMMM");
},
[myEqualityCheck(currentTime)]
);
ăăăăă§ăŤĺçăăăŚăăĺ ´ĺăŻçłă訳ăăăžăăăăä¸ăŽăšăŹăăă§ăăăčŚăăă¨ăă§ăăžăăă§ăăďź
ăăŚăłăă§ăŽăżuseEffectăăăŻăĺŽčĄăăćšćłăŻă2çŞçŽăŽăăŠăĄăźăżăźă¨ăăŚçŠşăŽĺ
Ľĺé
ĺăĺŽçžŠăăăă¨ă§ăă ăă ăăăăăčĄăă¨ăăăăăŽĺ
Ľĺĺźć°ăĺŤăăăă¨ăŤă¤ăăŚăŽĺžšĺşçăŞčŚć
ăăăăć´ć°ćăŤăĺŽčĄăăăăăăŤĺšćăĺ¤ć´ăăăžăă
ĺŽĺ
¨ăŞdepsăćĺšăŤăŞăŁăŚăăăăŚăłăă§ăŽăżuseEffectăĺŽčĄăăăăăŽă˘ăăăźăăŻä˝ă§ăăďź
@einarqăăŚăłăä¸ăŽuseEffect
ăăŚăăăăšăŚăŽĺ¤ăćąşăăŚĺ¤ć´ăăăŞăăăăŤăăĺż
čŚăăăă¨ćăăžăă ăăăŻă useMemo
ăăăŞäťăŽăăăŻă使ç¨ăăŚĺŽçžă§ăăžăă ăăŽĺžăăăŽESlintăŤăźăŤăăăšăŚăŽĺç
§ăďźčŞĺ俎ćŁă使ç¨ăăŚďźé
ĺăŤčż˝ĺ ăăăăŠăăăŤé˘äżăŞăăăłăźăăŻ1ĺă ăĺŽčĄăăăžăă
@einarqăšăŹăăăŽäťăŽĺ ´ćă§čż°ăšăăăŚăăăăăŤăCodeSandboxăŞăă§ăŻăćäźăă§ăăžăăă çăăŻćŹĺ˝ăŤăăŞăăŽăłăźăăŤäžĺăăăăă§ăă
@nghiepităăŞăăŽäžăŻç§ăŤăŻćŹĺ˝ăŤćĺłăăăăžăăă ĺ
ĽĺăcurrentTime.format("MMMM")
ĺ ´ĺăăă§ăŤč¨çŽăăăŚăăăăă useMemo
ăŻä˝ăćéŠĺăăžăăă ă¤ăžăăä¸ĺż
čŚăŤ2ĺč¨çŽăăŚăăă ăă§ăă
additionalHooks
ăŞăăˇă§ăłăŽăłăźăŤăăăŻă§ăăĺźć°ă¤ăłăăăŻăšăćĺŽăăăă¨ăŻĺŻč˝ă§ăăďź ăłăźăă§ăŻăăăăćĺăŽhttps://github.com/facebook/react/blob/9b7e1d1389e080d19e71680bbbe979ec58fa7389/packages/eslint-plugin-react-hooks/src/ExhaustiveDeps.js#L1051-ă§ăăă¨ćłĺŽăăŚăăăă¨ăăăă
çžĺ¨ăŻă§ăăžăăă ç§ăăĄăŽä¸čŹçăŞăŹă¤ăăłăšăŻăăŤăšăżă ăăăŻăŻdeps
ĺźć°ăćăăŞăăă¨ă弽ăăšăă§ăăă¨ăăăă¨ă§ăăăŞăăŞăădepsăăŠăŽăăăŤć§ćăăăŚăăăăčăăăŽăé常ăŤéŁăăăŞăăăă§ăă é˘ć°ă使ç¨ăăĺ ´ĺăŻă䝣ăăăŤăŚăźăśăźăŤuseCallback
čŚćąăăăă¨ăă§ăăžăă
@CarlosGines OPăŽć稿ă§čŚćąăăăŚăăăăăŤăCodeSandboxăä˝ćăăŚăăă ăăžăăăă ç§ăŻăăăççąă§ĺ°ăăŚăăžăâăăă§ăŞăăă°ăĺ¤ć´ă確čŞăăăŽăŻéŁăăă§ăă çšăŤTypeScriptă§ć¸ăăăŚăăĺ ´ĺă
[email protected]
ăĺ
ŹââéăăžăăăăăăäžżĺŠăŞăĄăăťăźă¸ă¨ăăăšăăźăăŞăăĽăźăŞăšăăŁăăŻăĺŤăžăăŚăăăă¨ăéĄăŁăŚăăžăă ĺŽĺŽăăĺăŤăăăă¸ă§ăŻăă芌ăăŚăżăŚăă ăăă
ăăŽăšăŹăăăŽăťă¨ăăŠăŽäžă§ăĺéĄăŽäżŽćŁăŤĺ˝šçŤă¤ĺççăŞă˘ăăă¤ăšăĺžăăăăă¨ăćĺž ăăŚăăžăă
ăăăŻ[email protected]
ăžăăďź
ăŻăă
ĺŽéăŤăŻăăăă¤ăăŽĺ°ăăŞĺ¤ć´ăĺ ăăŚ[email protected]
ăĺ
Źââéăăžăăă
@gaearonä¸ăä¸ăăłăźăăľăłăăăăŻăšĺ
ă§eslint
ăćŠč˝ăăăăă¨ăă§ăăžăăăďź
@einarqĺ¤ĺăăŽăăăŞăăŽăŻăăă§ăăžăăăă§ăăăăďź
const useDidMount = fn => {
const callbackFn = useCallback(fn)
useEffect(() => {
callbackFn()
}, [callbackFn])
}
ďźç§ăŽăšăăăăăŤĺşăĽăăŚďźĺç´ăŞCRAă˘ăăŞă§ăăŠă°ă¤ăłăĺä˝ăăăăă¨ăă§ăăŞăă¨č¨ăăŽăŻĺŽéăŤăŻćĽăăăăăă¨ă§ăă
ăăăcodesandboxăăăŽăăŠăźăŻăăăăŞăă¸ăăŞă§ăă
ç§ăŻăăăĽăĄăłăă§ăăŽăĄă˘ăčŚăžăăďź
注ďźCreate React Appă使ç¨ăăŚăăĺ ´ĺăŻăç´ćĽčż˝ĺ ăăăŽă§ăŻăŞăăăăŽăŤăźăŤăĺŤăreact-scriptsăŽĺŻžĺżăăăŞăŞăźăšăăĺž ăĄăă ăăă
ăăăăçžćçšă§ăŻCRAă§ăăšăăăćšćłăŻăăăžăăăďź đ
ăăăESLintć§ćăŤčż˝ĺ ăăăžă§ăăăăĺăĺşăăŚESLintć§ćăŤčż˝ĺ ăăĺż čŚăăăăžăă ăăŠăłăă§ă¤ă¸ă§ăŻăăăăă¨ăŻă§ăăžăăăăăźă¸ăăăă¨ăŻă§ăăžăăă :-)
ăăă
ăžă珏ä¸ăŤďźăłăăĽăăăŁă¨çˇĺŻăŤĺĺăăŚăăăŚăăăă¨ăăăăăŚăăŞăăä¸čŹçăŤăăŁăŚăăç´ ć´ăăăäťäşăŤćčŹăăžăďź
Fetch
APIăä¸ĺżăŤć§çŻăăăŤăšăżă ăăăŻăŤĺéĄăăăăžăă ăăŽĺéĄă示ăăăăŤCodesandboxăä˝ćăăžăăă
https://codesandbox.io/s/kn0km7mzv
注ďźăăŽĺéĄďźäťĽä¸ăĺç
§ďźăŻçĄéăŤăźăăŤăŞăăĺéĄăŽăă˘ăłăšăăŹăźăˇă§ăłăŤä˝żç¨ăăŚăăDDoS jsonplaceholder.typicode.com
ăŻăăăăăăžăăă ăăŽăăăăŤăŚăłăżăźă使ç¨ăăĺç´ăŞăŞăŻă¨ăšăăŞăăăżăźăĺŤăăžăăă ăăăŻĺéĄăĺŽč¨źăăăăăŤĺż
é ă§ăŻăăăžăăăăăăŽç´ ć´ăăăăăă¸ă§ăŻăăŤçĄĺśéăŽéăŽăŞăŻă¨ăšăăé俥ăăăŽăŻééăŁăŚăăă¨ćăăžăăă
ă˘ă¤ăă˘ăŻăAPIăŞăŻă¨ăšăăŽ3ă¤ăŽĺŻč˝ăŞçść
ďźčŞăżčžźăżăćĺăă¨ăŠăźďźăŽĺŚçăç°ĄĺăŤăăăă¨ă§ăă ăăăăŁăŚă3ă¤ăŽăăăăăŁisLoading
ă response
ăăăăłerror. It makes sure that either
ĺżçor
ă¨ăŠăźis set and updates
ăčżăăŤăšăżă ăăăŻuseFetch()
ăä˝ćăăžăăă is set and updates
isLoading . As the name implies, it uses the
Fetch`APIă
ăăŽăăăŤă3ă¤ăŽuseState
ăăăŻă使ç¨ăăžăă
const [isLoading, setIsLoading] = useState(false);
const [response, setResponse] = useState(null);
const [error, setError] = useState(null);
ăăăłuseEffect
ăăăŻďź
useEffect(
() => {
fetch(url, fetchConfig)
.then(/* Handle fetch response... See Codesandbox for the actual implementation */)
},
[url]
);
ăăăŻéˇăăŽäžĺé˘äżăŽé
ĺă¨ăăŚă¨ăăŚç˝°éăĺăuseEffect
ĺŻä¸ĺŤăžăăŚăă[url]
ă fetchConfig
ďź= [url, fetchConfig]
ďźăčż˝ĺ ăăă¨ăçĄéăŤăźăăŤăŞăăžăă çšĺŽăŽăŚăźăšăąăźăšă§ăŻă url
ăĺ¤ć´ăăăĺ ´ĺăŤăŽăżă¨ăă§ăŻăăĺĺŽčĄăăă ăă§ĺĺă§ăăăăŞăłăżăźă§ăŻ[url]
ăŽăżă使ç¨ă§ăăžăăďź v1.4.0
ăăšăć¸ăżv1.5.0-beta.1
ďźă
ăŤăšăżă ăăăŻăŽćĺžăŤă3ă¤ăŽçść ĺ¤ć°ăăŞăă¸ă§ăŻăă¨ăăŚčżăăăžăă
return {
error,
isLoading,
response
};
ăŞăłăăŁăłă°ăŽććĄăçăŤăăŞăŁăŚăăăŽă§ăăăăăăŽĺéĄăŤé˘ăăăŹă¤ăăłăšăćąăăăŽăŤéŠĺăŞĺ ´ćă§ăăăăŠăăăŻăăăăžăăă ăăă§ăŞăĺ ´ĺăŻçłă訳ăăăžăăă
fetchConfig
ăĺ¤ć´ăăăĺ ´ĺ
ăăăŁăă ĺ
éąăŽäżŽćŁă¨ćšĺăĺ ăăŚ[email protected]
ăăŞăŞăźăšăăžăăă
ăăŽăšăŹăăăŻăĺéĄăŽĺĺ ă¨ăŞăăăžăăžăŞăăżăźăłăčŚă¤ăăăŽăŤé常ăŤĺ˝šçŤăĄăžăăă
ćŹĺ˝ăŤăăăă¨ăăăăăžăăă ďźçšăŤăľăłăăăăŻăšăćäžăăäşşă:-)
ăąăźăšăĺ¤ăăŽă§ăĺäşşçăŤăŻčŠłăăăçăăăžăăă
䝣ăăăŤăäťĺžć°ćĽă§ä¸čŹçăŞăŹăˇăă¨č˝ă¨ă犴ăä˝ćăăăăăĽăĄăłăăăăăăăŤăŞăłăŻăăžăă ăăŽăšăŹăăăŽăăšăŚăŽä¸čŹçăŞăăżăźăłăăŤăăźăăăŚăăăă¨ă確čŞăăžăďźăžăăŻăăžăăŞăăżăźăłăŤă¤ăăŚăŻĺĽăŽĺéĄă§ăăŠăăźă˘ăăăăăăăŤäžé źăăžăďźă
äžăĺ ŹéăăăăăăăăŤăłăĄăłăăăCodeSandboxăĺŤăăăšăŚăŽăłăĄăłăă硨éăăŚăéŠĺăŞäżŽćŁă示ăé˘éŁăăĺç/äžă¸ăŽăŞăłăŻăčż˝ĺ ăăžăă ăăăăăŞăă¨ĺ°ćĽăŽčŞč ăŽĺŠăăŤăŞăăă¨ăéĄăŁăŚăăžăă
äšžćŻďź
â¤ď¸
@timkrautăŻădepsăŤfetchConfig
ăčż˝ĺ ă§ăăăŻăă§ăăăžăăăłăłăăźăăłăăŻăĺç
§ăćŽăăăăŤăĄă˘ă§ăŠăăăăĺż
čŚăăăăžăă
äžďź https ďź
ăăăŤé˘ăăç§ăŽĺéĄăŻăăłăłăăźăăłăăăăăŻăŽĺŽčŁ ăŽčŠłç´°ăčŞčăăĺż čŚăăăăă¨ă§ă...
ăăŽăšăŹăăăăžă äžăŽč°čŤăŤéăăăŚăăăăŠăăăŻăăăăžăăăăăăšăăăŠăŻăăŁăšăŤé ăćŠăžăăŚăăžăă ç§ăŽčłŞĺăŻăuseEffectăăăŻăäžĺé˘äżé ĺă§čľˇĺăăăżă¤ăăłă°ăĺśĺžĄăăăăŽćçšă§ăŽĺ¤ă使ç¨ăăăŽă§ăŻăŞăălintăŤăźăŤăĺéżăăăăăŤĺĽăŽrefă厣č¨ăăĺż čŚăăăăă¨ă§ăă
https://codesandbox.io/s/40v54jnkyw
ăăŽäžă§ăŻăĺ Ľĺĺ¤ăĺŽćçăŤčŞĺäżĺăăăă¨ăăŚăăžăă
5ç§ăă¨ăŤăăłăźăăŻçžĺ¨ăŽĺ¤ăčŞĺäżĺăăăă¨ăăŚăăžăďźäťăŽă¨ăăçťé˘ăŤĺşĺăăă ăă§ăďźă ăŞăłăżăźă§ăŻăăăšăŚăŽĺ Ľĺĺ¤ăäžĺé˘äżé ĺăŤĺŤăăĺż čŚăăăăžăăăăăŤăăăă¨ăă§ăŻăăçşçăăé ťĺşŚăĺ¤ăăăžăă
useEffect(
() => {
if (autoSaveTick % 5 === 0) {
setAutosaveValue(
`${input1Value.value}, ${input2Value.value}, ${input3Value.value}`
);
}
},
[autoSaveTick]
);
ç§ăčŚă䝣ćżćĄăŻăäžă§ĺŽçžŠăăăuseTick
useInterval
ăăăŻă¨
ĺăŽĺ¤ć°ĺ¤ć´ďźĺ¤ć°AďźćăŤäťăŽĺ¤ć°ĺ¤ďźĺ¤ć°Bă¨ĺ¤ć°Cďźă使ç¨ăă1ă¤ăŽĺ¤ć°ăĺ¤ć´ăăăă¨ăăŤĺŽčĄăăăĺšćďźĺ¤ć°Aďźăä˝ćăăăăăŽăăšăăăŠăŻăăŁăšăć˘ăăŚăăžăă
fetchConfig
ăĺ¤ć´ăăăĺ ´ĺ
äžĺé˘äżăŽé ĺăŤčż˝ĺ ăăŚăĺéĄăăăžăăă ç§ăăĄăŽçšĺŽăŽăă¸ăăšăąăźăšă§ăŻăăăăŻćąşăăŚčľˇăăĺžăžăăăăă¨ăŤăăăăăčż˝ĺ ăăăă¨ăŻčŻăčăă ă¨ćăăžăă
ăăăŤé˘ăăç§ăŽĺéĄăŻăăłăłăăźăăłăăăăăŻăŽĺŽčŁ ăŽčŠłç´°ăčŞčăăĺż čŚăăăăă¨ă§ă...
ăăăăžăăŤç§ăăĄăćąăăŚăăĺéĄă§ăďź/ăăŽĺŽčŁ
ă§ăŻăćŹä˝ăŽč¨ĺŽăç°ĄĺăŤăăăăăŤčż˝ĺ ăŽăăăăăŁă使ç¨ăăŚăăăăăăăŽăăăŻă使ç¨ăăăăłăŤ2ă¤ăŽuseMemo()
ĺźăłĺşăă使ç¨ăăĺż
čŚăăăăžăă ăăŽĺśéăĺ
ćăăćšćłăŻăžă ăăăăžăăă ăăŞăăă˘ă¤ăă˘ăćăŁăŚăăăŞăăç§ăŤçĽăăăŚăă ăăďź
犺ăŽé ĺă渥ăă¨ăăŤăŤăźăŤăćĺĽăč¨ăăăŤăäžĺé˘äżă1ĺă ăăăuseEffectăĺŽčĄăăăŤăŻăŠăăăă°ăăă§ăăďź
ăă¨ăă°ă揥ăŽăăăŤăŞăăžăă
useEffect(() => {
init({ dsn, environment})
}, [])
ăăăŤé˘ăăç§ăŽĺéĄăŻăăłăłăăźăăłăăăăăŻăŽĺŽčŁ ăŽčŠłç´°ăčŞčăăĺż čŚăăăăă¨ă§ă...
ăăăăĺŽčŁ ăŽčŠłç´°ă§ăăă¨ăŻč¨ăăžăăă ăăăŻăăŞăăŽAPIă§ăă ăŞăă¸ă§ăŻăă渥ăăăĺ ´ĺăăă¤ă§ăĺ¤ć´ă§ăăă¨ćłĺŽăăŚăăžăă
ĺŽéăŤăŻĺ¸¸ăŤéçă§ăăĺ ´ĺăŻăăăăŻăăĄăŻăăŞă¸ăŽĺźć°ăŤăăăă¨ăă§ăăžăă createFetch(config)
ăčżăuseFetch()
ă ăăŞăăŻăăăăŹăăŤă§ĺˇĽĺ ´ăĺźăłăžăă
ĺ°ăĺ¤ă ă¨ćăăžăă çžĺ¨ĺăçľăă§ăăuseSubscription
ăĺć§ăŽĺéĄăăăăžăă ăăăăăăăŻä¸čŹçăŞĺéĄă§ăăăăăăăăŻuseMemo
ĺŽéăŤăŻćŁĺ˝ăŞçăă§ăăăäşşă
ăŻăăăăŽĺ ´ĺăŤăăăčĄăăă¨ăŤć
Łăăăšăă§ăăăă¨ăćĺłăăăăăăăžăăă
ĺŽéăŤăŻăăăăŤă¤ăăŚăŻĺ°ćĽăăăŤć¤č¨ăăäşĺŽă§ăă ăă ăăĺçăŞĺŻč˝ć§ăŽăăăŞăă¸ă§ăŻăăéçăŞăŞăă¸ă§ăŻăă¨ăăŚćąăăšăă§ăŻăăăžăăăăăăăă¨ăăŚăźăśăźăŻăŞăă¸ă§ăŻăăĺ¤ć´ă§ăăŞăăŞăăžăă
@asylejmaniä¸é¨ăŽć稿ă§čŚćąăăăŚăăăăăŤăăŚăźăšăąăźăšăŤé˘ăă芳細ăŻćäžăăăŚăăžăăă ăŞă誰ăăăăŞăăŽčłŞĺăŤçăăăă¨ăă§ăăă¨ćĺž ăăăŽă§ăăďź
ăŤăźăŤăŽăă¤ăłăăŻă environment
ă¨dsn
ăŻćéăŽçľéă¨ă¨ăăŤĺ¤ĺăăĺŻč˝ć§ăăăăăłăłăăźăăłăăăăăĺŚçăăĺż
čŚăăăăă¨ăéçĽăăăă¨ă§ăă ăăăăŁăŚăăłăłăăźăăłăăŤăă°ăăăďźăăăăŽĺ¤ăŽĺ¤ć´ăĺŚçăăŞăăăďźăăĺéĄăŤăŞăăŞăçŹčŞăŽăąăźăšăăăăžăďźăăŽĺ ´ĺălintăŤăźăŤăčż˝ĺ ăăŚççąă誏ćăăăłăĄăłăăçĄčŚăăĺż
čŚăăăăžăďźă
ăŠăĄăăŽĺ ´ĺăăăăŞăăä˝ăćąăăŚăăăŽăăŻć確ă§ăŻăăăžăăă ăŤăźăŤăŻçŠäşăĺ¤ăăĺŻč˝ć§ăăăă¨ä¸ĺšłăč¨ăăžăăăăăŚăăŞăăŻăăŽĺ¤ĺăĺŚçăăžăăă ĺŽĺ ¨ăŞäžăăŞăăă°ăăăŞăă ăăăăăćąăĺż čŚăăŞăă¨ćăççąăŤçăăăă¨ăă§ăăžăă
@gaearonć確ăŤăŞăŁăŚăăŞăăă¨ăă芍ăłăăžăďźé ăŽä¸ă§ĺ¸¸ăŤć確ăŤčăăăžăďź:)ç§ăŽčłŞĺăŻăuseEffectă使ç¨ăăŚcomponentDidMountăăŠăŽăăăŤĺŽçžăăăă¨ăăăăăŞăăŽă§ăă
犺ăŽé ĺăăăĺ°čąĄăŤćŽăŁăŚăăžăăăăăŤăźăŤă§ăŻĺ¸¸ăŤäžĺé˘äżăé ĺăŤĺŤăăăăăŤć示ăăăŚăăžăă
@asylejmani componentDidMount
ăăăŞăŻăŠăšăŠă¤ăăľă¤ăŻăŤăĄă˝ăăăŽć大ăŽč˝ă¨ă犴ăŻăăăăĺé˘ăăăăĄă˝ăăă¨čăăĺžĺăăăăă¨ă ă¨ćăăžăăăĺŽéăŤăŻăăăźăŽä¸é¨ă§ăă
componentDidMount
ä˝ăăĺç
§ăăĺ ´ĺăŻăăăăăcomponentDidUpdate
ă§ăĺŚçăăĺż
čŚăăăăžăăăăăăŞăă¨ăăłăłăăźăăłăăŤăă°ăçşçăăĺŻč˝ć§ăăăăžăă
ăăăŻăŤăźăŤă俎ćŁăăăă¨ăăŚăăăă¨ă§ăăăćéăŽçľéă¨ă¨ăăŤĺ¤ăĺŚçăăĺż
čŚăăăăžăă
çŞĺˇ1ăŻăăă¸ăăŻăcomponentDidMount
/ useEffect
ćŹä˝ăŤé
罎ăăĺ ´ćă§ăă
2çŞçŽăŻăăă¸ăăŻăcomponentDidUpdate
/ useEffect
depsăŤé
罎ăăĺ ´ćă§ăă
ăŤăźăŤăŻăăŞăăăăăźăŽ2çŞçŽăŽé¨ĺăăăŁăŚăăŞăă¨ä¸ĺšłăč¨ăŁăŚăăžă
@gaearonć確ăŤăŞăŁăŚăăŞăăă¨ăă芍ăłăăžăďźé ăŽä¸ă§ĺ¸¸ăŤć確ăŤčăăăžăďź:)ç§ăŽčłŞĺăŻăuseEffectă使ç¨ăăŚcomponentDidMountăăŠăŽăăăŤĺŽçžăăăă¨ăăăăăŞăăŽă§ăă
犺ăŽé ĺăăăĺ°čąĄăŤćŽăŁăŚăăžăăăăăŤăźăŤă§ăŻĺ¸¸ăŤäžĺé˘äżăé ĺăŤĺŤăăăăăŤć示ăăăŚăăžăă
ç§ă¨@asylejmaniăŻăăă§ĺăăăźă¸ăŤăăă¨ćăăžăăă @ gaearonăč¨ăŁăŚăăăă¨ăŻăĺŽéăŤäžĺé˘äżăăăĺ ´ĺăŤăŽăżăăŚăłăă§ă¨ăă§ăŻăăĺŽčĄăăăŽăŻăăăăééăŁăŚăăă¨ăăăă¨ă ă¨ćăăžăă
ăăăŻĺ
ŹćŁăŞĺŁ°ćă§ăăďź çŠşăŽé
ĺăćäžăăăă¨ăŻăăčŞĺăä˝ăăăŚăăăŽăăăăŁăŚăăăă¨č¨ăŁăŚăăăăăŞăăŽă ă¨ćăăžăăăăŤăźăŤăăăŽăžăžăŤăăŚăăăăççąăŻăăăăžăă
ăľăłăăăăŻăšăăžă ćäžăăŚăăŞăăă¨ăă芍ăłăăžăă ĺ
ćĽăCreate React AppăŽäžăăĺ§ăăžăăăăăľăłăăăăŻăšă§eslintăĺŽčĄăăćšćłăăăăăžăăă§ăăăăăŽĺžăćĺăŤäżĺăăăŤăăŠăŚăśăźăăŞăăźăăăă¨ăľăłăăăăŻăšă夹ăăăžăăďźCodeSandboxăŽä¸ćäżĺăäżĺăăăŚăăă¨äťŽĺŽăăžăăă
ăăăăç§ăŻĺŻăŞăăă°ăŞăăŞăăŁăăăăăŚăă䝼ćĽćéăăŞăăŁăă
ăăăăŤăăăç§ăŻăăŞăăč¨ăŁăŚăăăă¨ăç解ăăžăăé常ăŽăˇăăŞăŞă§ăŻăăăăăŽäžĺé˘äżăĺŤăăăŽăăăăăćĺă§ăăăăăŚăłăăŽăżă§ĺŽčĄăăăŽăŤĺĺă§ăăă¨ăŻćłĺŽăăŚăăžăăă
ăăŽăăăŽćĺšăŞăŚăźăšăąăźăšăăăăăăăăžăăă誏ćăăăăčŻăäžăčăĺşăăŽăŻĺ°ăéŁăăăŽă§ăĺż čŚăŤĺżăăŚă¤ăłăŠă¤ăłă§ăŤăźăŤăçĄĺšăŤăăŚăăăžăă
@asylejmaniăŻă httpsďź //github.com/facebook/react/issues/14920#issuecomment -466378650ăŤäźźăăŚăźăšăąăźăšă§ăăďź ăăŽĺ ´ĺăăŤăźăŤăăˇăăŞăŞăç解ăăăă¨ăŻä¸ĺŻč˝ă ă¨ćăăŽă§ăăăŽăżă¤ăăŽăłăźăă§ăŻćĺă§çĄĺšăŤăăĺż čŚăăăăžăă äťăŽăăšăŚăŽĺ ´ĺăăŤăźăŤăŻćŁĺ¸¸ăŤćŠč˝ăăžăă
ăăăçăŤăăŞăŁăŚăăăăŠăăăŻăăăăžăăăăç§ăŤă¨ăŁăŚé常ăŤä¸čŹçăŞăˇăăŞăŞăŽ1ă¤ăŻă揥ăŽăăăŞăăŽă§ăă
useEffect(() => {
if(!dataIsLoaded) { // flag from redux
loadMyData(); // redux action creator
}
}, []);
ăăăăŽäžĺé˘äżăŻä¸Ąćšă¨ăreduxăăćĽăŚăăžăă ăăźăżďźăăŽĺ ´ĺďźăŻ1ĺă ăăăźăăăĺż čŚăăăăă˘ăŻăˇă§ăłăŽä˝ćč ăŻĺ¸¸ăŤĺăă§ăă
ăăăŻreduxăŤĺşćă§ăăăăăŞăăŽeslintăŤăźăŤăŻăăăçĽăăă¨ăă§ăăŞăăŽă§ăăŞăčŚĺăăĺż čŚăăăăŽăââăăăăžăă 犺ăŽé ĺăćäžăăă ăă§ăŤăźăŤăçĄĺšăŤăăšăăăŠăăăžă çĺăŤćăŁăŚăăžăăďź ăăšăŚă§ăŻăŞăä¸é¨ăćäžăăĺ ´ĺăăžăăŻăžăŁăăćäžăăŞăăŁăĺ ´ĺăŤăăŤăźăŤădepsăŽćŹ č˝ăŤă¤ăăŚćăăŚăăăăŽă弽ăă§ăă 犺ăŽé ĺăŻç§ă¨ăŻéăćĺłăćăŁăŚăăžăă ăăăăăăăŻç§ă ăăăăăăžăă:)
é ĺźľăŁăŚăăăŚăăăă¨ăďź ăăăŚăéçşč ă¨ăăŚăŽç§ăăĄăŽçć´ťăăăčŻăăăăăăŤ:)
ç§ăŽăŚăźăšăąăźăšăŻăŻăăăŤĺç´ă§ăăăĄăăăăšăŚăŽäžĺé˘äżăčż˝ĺ ă§ăăăăă§ăĺăăăăŤćŠč˝ăăžăăăăăă¤ăăŽäžĺé˘äżăăăăäťăŽäžĺé˘äżăăŞăĺ ´ĺăăŤăźăŤăŻăčŚĺăăăă¨ăăĺ°čąĄăĺăăžăăă
@einarqăŽăŚăźăšăąăźăšăŻăç§ăć°ĺ使ç¨ăăăăŽă§ăăăă¨ăă°ăăcomponentDidMountăă§ăŻăăăźăżăăŞăĺ ´ĺďźreduxăŞăŠăăďźăŤăăźăżăăăźăăăžăă
ăžăăăăăăŽĺ ´ĺăă¤ăłăŠă¤ăłă§ăŤăźăŤăçĄĺšăŤăăăă¨ăćĺăŽé¸ćă§ăăăă¨ăŤĺćăăžăă ăăŽĺ ´ĺăăăŞăăŻčŞĺăä˝ăăăŚăăăŽăăćŁç˘şăŤçĽăŁăŚăăžăă
ç§ăŽĺ ¨ä˝çăŞćˇˇäšąăŻ[]寞[ăăă¤ă]ă ăŁăă¨ćăăžăăăăăŚăăĄăăç´ ć´ăăăäťäşăăăŚăăăăžă:)
ç§ă¨@asylejmaniăŻăăă§ĺăăăźă¸ăŤăăă¨ćăăžăăă @ gaearonăč¨ăŁăŚăăăă¨ăŻăĺŽéăŤäžĺé˘äżăăăĺ ´ĺăŤăŽăżăăŚăłăă§ă¨ăă§ăŻăăĺŽčĄăăăŽăŻăăăăééăŁăŚăăă¨ăăăă¨ă ă¨ćăăžăă ăăăŻĺ ŹćŁăŞĺŁ°ćă§ăăďź
ăŻăă ăłăłăăźăăłăăĺ°éĺ
ˇăŽć´ć°ăĺŚçăăŞăĺ ´ĺăé常ăŻăă°ăăăăžăă useEffect
ăŽăăśă¤ăłăŻăăăăŤçŤăĄĺăăăă¨ăä˝ĺăŞăăăăžăă ăăĄăăĺéżăăăă¨ăă§ăăžăăăăăăŠăŤăă§ăŻăăăăăŽăąăźăšăĺŚçăăăăăŤĺžŽčŞżć´ăăžăă ăăŽăłăĄăłăăŻăăăăă誏ćăăŚăăžăďź https ďź//github.com/facebook/react/issues/14920#issuecomment-470913287ă
ăăăăŽäžĺé˘äżăŻä¸Ąćšă¨ăreduxăăćĽăŚăăžăă ăăźăżďźăăŽĺ ´ĺďźăŻ1ĺă ăăăźăăăĺż čŚăăăăă˘ăŻăˇă§ăłăŽä˝ćč ăŻĺ¸¸ăŤĺăă§ăă
ăăăĺăă§ăăă°ăäžĺé˘äżăŤăăăĺŤăăŚă厳ăŻăăăžăăă 埡調ăăăăŽă§ăăăäžĺé˘äżăćąşăăŚĺ¤ăăăŞăăă¨ă確ĺŽă§ăăă°ăăăăăăŞăšăăăŚă厳ăŻăăăžăăă ăă ăăĺžă§ĺ¤ć´ăçşçăăĺ ´ĺďźăă¨ăă°ă茪ăłăłăăźăăłăăçść ăŤĺżăăŚç°ăŞăćŠč˝ă渥ăĺ ´ĺďźăăłăłăăźăăłăăŻăăăćŁăăĺŚçăăžăă
犺ăŽé ĺăćäžăăă ăă§ăŤăźăŤăçĄĺšăŤăăšăăăŠăăăžă çĺăŤćăŁăŚăăžăăďź
ăăăă犺ăŽé ĺăćäžăăŚăăăä¸é¨ăŽĺ°éĺ ˇăçść ăĺ¤ăăŞăŁăŚăăççąăçĺăŤćăăă¨ăŻăćĺéăćăä¸čŹçăŞééăă§ăă
>>
ăăăăăŽćĺłăăăăžăăăăăă¨ă
2019ĺš´3ć8ćĽăŤăŻăĺĺ15ć27ĺă§ăăăłăťă˘ăăŠă˘ăçŁçŁăŽ[email protected]ăŻć¸ăăžăăďź
ç§ă¨@asylejmaniăŻăăă§ĺăăăźă¸ăŤăăă¨ćăăžăăă @ gaearonăč¨ăŁăŚăăăă¨ăŻăĺŽéăŤäžĺé˘äżăăăĺ ´ĺăŤăŽăżăăŚăłăă§ă¨ăă§ăŻăăĺŽčĄăăăŽăŻăăăăééăŁăŚăăă¨ăăăă¨ă ă¨ćăăžăă ăăăŻĺ ŹćŁăŞĺŁ°ćă§ăăďź
ăŻăă ăłăłăăźăăłăăĺ°éĺ ˇăŽć´ć°ăĺŚçăăŞăĺ ´ĺăé常ăŻăă°ăăăăžăă useEffectăŽč¨č¨ăŻăăăăŤçŤăĄĺăăăă¨ă埡ĺśăăžăă ăăĄăăĺéżăăăă¨ăă§ăăžăăăăăăŠăŤăă§ăŻăăăăăŽăąăźăšăĺŚçăăăăăŤĺžŽčŞżć´ăăžăă ăăŽăłăĄăłăăŻăăăăă誏ćăăŚăăžăďźďź14920ďźăłăĄăłăďźă
ăăăăŽäžĺé˘äżăŻä¸Ąćšă¨ăreduxăăćĽăŚăăžăă ăăźăżďźăăŽĺ ´ĺďźăŻ1ĺă ăăăźăăăĺż čŚăăăăă˘ăŻăˇă§ăłăŽä˝ćč ăŻĺ¸¸ăŤĺăă§ăă
ăăăĺăă§ăăă°ăäžĺé˘äżăŤăăăĺŤăăŚă厳ăŻăăăžăăă 埡調ăăăăŽă§ăăăäžĺé˘äżăćąşăăŚĺ¤ăăăŞăăă¨ă確ĺŽă§ăăă°ăăăăăăŞăšăăăŚă厳ăŻăăăžăăă ăă ăăĺžă§ĺ¤ć´ăçşçăăĺ ´ĺďźăă¨ăă°ă茪ăłăłăăźăăłăăçść ăŤĺżăăŚç°ăŞăćŠč˝ă渥ăĺ ´ĺďźăăłăłăăźăăłăăŻăăăćŁăăĺŚçăăžăă
犺ăŽé ĺăćäžăăă ăă§ăŤăźăŤăçĄĺšăŤăăšăăăŠăăăžă çĺăŤćăŁăŚăăžăăďź
ăăăă犺ăŽé ĺăćäžăăŚăăăä¸é¨ăŽĺ°éĺ ˇăçść ăĺ¤ăăŞăŁăŚăăççąăçĺăŤćăăă¨ăŻăćĺéăćăä¸čŹçăŞééăă§ăă
â
ăăŞăăč¨ĺăăăăŽă§ăăŞăăŻăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăăăGitHubă§čĄ¨ç¤şăăăăăšăŹăăăăăĽăźăăăŚăă ăăă
@aweary
ăăăŤăăăĺŽéăŽć´ć°ăăłăăăăăăĺăŤĺŻä˝ç¨ăçşçăăĺż čŚäťĽä¸ăŤé ťçšăŤĺŻä˝ç¨ăăăŞăŹăźăăăĺŻč˝ć§ăăăăžăă
ăăăä˝ăćĺłăăăŽăăăăăžăăă äžăćăăŚăăă ăăžăăďź
äťćĽăŻ@threepointoneă§ăăăăăăšăăžăăă čŚç´ăŻćŹĄăŽă¨ăăă§ăă
useEffect
äžĺé˘äżćŁĺ˝ăŞăˇăăŞăŞăăăăăăăăŽăŤăźăŤăŻă useEffect
ăĺ¤é¨ăăŽdepăčż˝ĺ ăăăă¨ă匨ăăăăŽă§ăŻăăăžăăă
LinterăŻăçžĺ¨ĺŽĺ
¨ă§ăăĺ ´ĺăŤăŻčŚĺăăžăăăăăă䝼ĺ¤ăŽĺ ´ĺăŻăăšăŚăăăčŻăććĄăćäžăăžăďźé˘ć°ăă¨ăă§ăŻăĺ
ăŤç§ťĺăăăă useCallback
ăŠăăăăăăăăŞăŠďźă
ăăă§lintéĺăŻçşçăăŞăăŞăăžăăăăĺ°éĺ ˇăŤĺżăăŚçść ăăŞăťăăăăć Łç¨çăŞćšćłăŻç°ăŞăăžăă ăăŽă˝ăŞăĽăźăˇă§ăłă§ăŻăăŹăłăăŞăłă°ăŤä¸č˛Ťć§ăăŞăăăăćăžăăăăŠăăăŻăăăăžăăă
ăăăŻăŻăĺŻč˝ăŞéăćŁç˘şăŤĺăăŁăŚăăŞăăĺ°ăăă¤ĺăăăžăă ăăŞăăŻďźăăă¤ăăŽăąăźăšă§ăŻăăăŞăăççĽă§ăăžăďźDEPSăćĺŽăăĺ ´ĺăç§ăăĄăŻĺźˇăăăăŞăăĺ¤ć´ăăăŞăă¨ćăăă¨ăăăăŽăĺŤăăăă¨ăăĺ§ăăăžăă ăŻăăăăŽuseDebounce
äžă§ăŻăé
ĺťśăĺ¤ăăĺŻč˝ć§ăŻ
çšĺŽăŽĺ¤ăéçă§ăăă¨çľśĺŻžăŤä¸ťĺźľăăĺ ´ĺăŻăăăă埡ĺśăăăă¨ăă§ăăžăă
ćăĺŽĺ
¨ăŞćšćłăŻăAPIă§ć示çăŤčĄăăă¨ă§ăă
const useFetch = createFetch({ /* config object */});
const useDebounce = createDebounce(500);
const FormInput = createInput({ rules: [emailValidator, phoneValidator] });
揥ăŤăăŹăłăăŞăłă°ĺ
ăŤé
罎ăăŞăéăăćăăăŤĺ¤ć´ăăăă¨ăŻă§ăăžăăă ďźăăăŻăăăŻăŽć
Łç¨çăŞä˝żç¨ćłă§ăŻăăăžăăăďźăăăă <Slider min={50} />
ăŻćąşăăŚĺ¤ć´ă§ăăŞăă¨č¨ăăă¨ăŻăĺŽéăŤăŻćĺšă§ăŻăăăžăăă誰ăăç°ĄĺăŤ<Slider min={state ? 50 : 100} />
ăŤĺ¤ć´ăăĺŻč˝ć§ăăăăžăă ĺŽéă誰ăăăăăčĄăăă¨ăă§ăăžăďź
let slider
if (isCelsius) {
slider = <Slider min={0} max={100} />
} else {
slider = <Slider min={32} max={212} />
}
誰ăăisCelsius
çść
ăĺăćżăăĺ ´ĺă min
ăĺ¤ć´ăăăŞăă¨ćłĺŽăăŚăăăłăłăăźăăłăăŻć´ć°ăŤĺ¤ąćăăžăă ăăŽĺ ´ĺă Slider
ăĺăăăŽăŤăŞăăăŠăăăŻćăăă§ăŻăăăžăăďźăă ăăăăŞăźĺ
ă§ĺăä˝ç˝ŽăŤăăăăă§ăďźă ăăăăŁăŚăăăăŻăłăźăăŤĺ¤ć´ăĺ ăăă¨ăăçšă§ä¸ťčŚăŞčśłăăăă§ăă ReactăŽä¸ťăŞăă¤ăłăăŻăć´ć°ăĺćçść
ă¨ĺăăăăŤăŹăłăăŞăłă°ăăăăă¨ă§ăďźé常ăăŠăĄăăăŠăĄăă§ăăăăŻăăăăžăăďźă ĺ°éĺ
ˇăŽĺ¤BăăŹăłăăŞăłă°ăăăăĺ°éĺ
ˇăŽĺ¤AăăBăŤç§ťĺăăăăŤăăăăăăĺ¤čŚłă¨ĺä˝ăŻĺăă§ăăĺż
čŚăăăăžăă
ăăăŻăĺ§ăă§ăăžăăăăĺ ´ĺăŤăăŁăŚăŻă埡ĺśăĄăŤăăşă ăŻăĺ¤ăĺ¤ć´ăăăă¨ăăŤčŚĺăăăăăŻă§ăăĺŻč˝ć§ăăăăžăďźăă ăăćĺăŽăĄăŤăăşă ăćäžăăžăďźă ĺ°ăŞăă¨ăăăŽĺ ´ĺăŻăć°äťăăăĺŻč˝ć§ăéŤăăŞăăžăă
function useMyHook(a) {
const initialA = usePossiblyStaleValue(a);
// ...
}
function usePossiblyStaleValue(value) {
const ref = useRef(value);
if (process.env.NODE_ENV !== 'production') {
if (ref.current !== value) { // Or your custom comparison logic
console.error(
'Unlike normally in React, it is not supported ' +
'to pass dynamic values to useMyHook(). Sorry!'
);
}
}
return ref.current;
}
ć´ć°ăĺŚçă§ăăŞăă¨ăăćŁĺ˝ăŞăąăźăšăăăăăăăkey
ăăŞăťăăăăăŠăăăźăłăłăăźăăłăăä˝ćăăŚăć°ăăĺ°éĺ
ˇă§ăŻăŞăźăłăŞĺăăŚăłăă埡ĺśăăăă¨ăă§ăăžăă ăăăŻăăšăŠă¤ăăźăăă§ăăŻăăăŻăšăŞăŠăŽăŞăźăăłăłăăźăăłăăŤăăăăéŠăăŚăăžăă
ăžă珏ä¸ăŤăăăăä¸ĺŽă§ăăăăŹăăŤăŽăšăłăźăăŤĺźăä¸ăăăăŚăăĺ ´ĺăăŞăłăżăźăŻćĺĽăč¨ăăžăăă ăăăăăăăŻĺ°éĺ ˇăćčăăćĽăăăŽăŤăŻĺ˝šçŤăĄăžăăă
ăăăçăŤä¸ĺŽă§ăăă°ăDEPSă§ăăăćĺŽăăă¨ăĺˇă¤ăăăă¨ăŻăăăžăăă ăŤăšăżă ăăăŻĺ
ăŽsetState
é˘ć°ăăłăłăăźăăłăăŤčżăăăă¨ăă§ăŻăăăĺźăłĺşăĺ ´ĺăŞăŠă§ăă lintăŤăźăŤăŻăăăŽăăăŞéćĽĺç
§ăç解ăăăŽăŤĺĺăŞăťăŠčł˘ăăŻăăăžăăă ăăăä¸ćšă§ă誰ă§ăĺžă§ćťăĺăŤăăŽăłăźăŤăăăŻăăŠăăăăăăăăăăŽä¸ăŽĺĽăŽĺ°éĺ
ˇăçść
ăĺç
§ăăăă¨ăă§ăăžăă ăăăăă¨ăăăăŻä¸ĺŽă§ăŻăŞăăŞăăžăďź ăăăŚăăăăăŽĺ¤ć´ăĺŚçă§ăăŞăă¨ăĺäťăŞĺ¤ăĺ°éĺ
ˇ/çść
ăŽăă°ăçşçăăžăă ăăăăŁăŚăăăăćĺŽăăćšăéŠĺăŞăăăŠăŤăă§ăă
ăă ăăé˘ć°ĺ¤ăĺż
çśçăŤä¸ĺŽă§ăăă¨ăăăŽăŻčŞ¤č§Łă§ăă ăĄă˝ăăăŽăă¤ăłăăŤăăăăŻăŠăšĺ
ă§ä¸ĺŽă§ăăăă¨ăăăăăăžăăăăăăŤăăŁăŚçŹčŞăŽçŻĺ˛ăŽăă°ăçşçăăžăă ăă ăăä¸čŹăŤăé˘ć°ăłăłăăźăăłăăŽĺ¤ăéăăé˘ć°ăŻăĺŽć°ă¨ăŻčŚăŞăăăžăăă lintăŤăźăŤăŻăä˝ăăăšăăăć示ăăăă¨ăŤă¤ăăŚăă賢ăăŞăăžăăă ďźă¨ăă§ăŻăĺ
ăŤç§ťĺăăďźćăç°ĄĺăŞäżŽćŁďźăăžăăŻuseCallback
ăŠăăăăăŞăŠăďź
ăăăŽĺ寞ăŽăšăăŻăăŤăŤĺéĄăăăăžăăăăăŻăçĄéăŤăźăăçşçăăĺ ´ćă§ăďźé˘ć°ĺ¤ăŻĺ¸¸ăŤĺ¤ĺăăžăďźă ĺŻč˝ăŞĺ ´ĺăŻďźĺăăłăłăăźăăłăă§ďźlintăŤăźăŤă§ăăăăăŁăăăă俎ćŁăććĄăăžăă ăăăăä˝ăăć°ăŹăăŤä¸ăŤć¸Ąăă¨ćł¨ćăĺż čŚă§ăă
ăăă§ăĺéĄă俎ćŁăăăăăŤuseCallback
ăŠăăăăăă¨ăă§ăăžăă ćčĄçăŤăŻăé˘ć°ăĺ¤ć´ăăăă¨ăŻćĺšă§ăăăăă°ăŽăŞăšăŻăĺăăăŤăăŽăąăźăšăçĄčŚăăăă¨ăŻă§ăăŞăonChange={shouldHandle ? handleChange : null}
ăăĺăĺ ´ćă§ăŽfoo ? <Page fetch={fetchComments /> : <Page fetch={fetchArticles />
ăŹăłăăŞăłă°ăŞăŠă ăžăăŻă茪ăłăłăăźăăłăăŽçść
ăéăăfetchComments
ă§ăăăăăžăă ăăăŻĺ¤ăăuseCallback
ă¨ăé˘ć°ăŽIDčŞä˝ăĺ¤ć´ăăăžăăăĺż
čŚăŞĺ ´ĺăŤéăăžăă ăăăăŁăŚăăăăŻäžżĺŠăŞăăăăăŁă§ăăăĺéżăăăăăŽé厳ă§ăŻăăăžăăă
çĄéăŽéĺćăŤăźăăć¤ĺşăăăăăŽăăčŻăă˝ăŞăĽăźăˇă§ăłăčż˝ĺ ăăĺż čŚăăăăžăă ăăăŤăăăćăç´ăăăăĺ´é˘ă硊ĺăăăăŻăă§ăă ĺ°ćĽăăăăŤĺŻžăăć¤ĺşăčż˝ĺ ăăĺŻč˝ć§ăăăăžăă 揥ăŽăăăŞăăŽăčŞĺă§ć¸ăăă¨ăă§ăăžăă
useWarnAboutTooFrequentChanges([deps]);
ăăăŻçćłçă§ăŻăŞăăăăăăăĺŞé
ăŤĺŚçăăăă¨ăć¤č¨ăăĺż
čŚăăăăžăă ç§ăŻăăŽăăăŞăąăźăšăăăŞăĺäťă§ăăăă¨ăŤĺćăăžăă ăŤăźăŤăŤéĺăăŞă俎ćŁăŻăăă¨ăă°APIăcreateTextInput(rules)
ăŤĺ¤ć´ăăŚă rules
éçăŤăă register
ă¨unregister
ăuseCallback
ăŤăŠăăăăăă¨ă§ăă register
ă¨unregister
ĺé¤ăă dispatch
ă ăăé
罎ăăĺĽăŽăłăłăăăšăăŤç˝Žăćăăžăă ăăăăă°ăăăăčŞăăă¨ă¨ăŻç°ăŞăé˘ć°IDăćă¤ăă¨ăćąşăăŚăŞăăă¨ăäżč¨źă§ăăžăă
ă¨ăŤăăăłăłăăăšăĺ¤ăŤuseMemo
ăčż˝ĺ ăăăă¨ăăĺ§ăăăžăăăăăŻăăăăă¤ăăźăĺ¤ăăŽč¨çŽăčĄăăăăć°ăăăłăłăăźăăłăăçťé˛ăăăŚăăŞăăăčŞčşŤăŽčŚŞăć´ć°ăăăĺ ´ĺăŤçš°ăčżăăŽăŻć˛ăăăă¨ă§ăă ăăăăŁăŚăăăŽç¨ŽăŽĺéĄăŻăäťăŽćšćłă§ăŻć°äťăăŞăăŁăăăăăăŞăĺéĄăăăçŽçŤăăăžăă ç§ăŻĺćăăžăăăăăă辡ăăŁăă¨ăăŤăăăăăăŤçŽçŤăăăĺż
čŚăăăăžăă
é˘ć°ĺžĺąć§ăĺŽĺ ¨ăŤçĄčŚăăă¨ăé˘ć°ăłăłăăźăăłăă¨ăăăŻăŽăă°ăćŞĺăăžăăăăăčĄăă¨ăĺ¤ăĺ°éĺ ˇă¨çść ă襨示ăăçśăăăăă§ăă ă§ăăăăă§ăăéăăăăăŞăăăăŤăăŚăă ăăă
ăăŽäžăćŹčłŞçăŤă¤ăăłăăăłăăŠăźă§ăăä˝ăăŤă¨ăă§ăŻăă使ç¨ăăççąăŻç§ăŤăŻĺĽĺŚă§ăă ă¤ăăłăăăłăăŠăźă§ĺăăăă°ăďźăăŠăźă é俥ăŽĺŻč˝ć§ăăăă¨ćăăžăďźăĺŽčĄăăćšăéŠĺăŞăăă§ăă ăăăŻăăłăłăăźăăłăăă˘ăłăăŚăłăăăăă¨ăăŤä˝ă辡ăăăăčăăĺ ´ĺăŤçšăŤĺ˝ăŚăŻăžăăžăă ă¨ăă§ăŻăăăšăąă¸ăĽăźăŤăăăç´ĺžăŤă˘ăłăăŚăłăăăĺ ´ĺăŻăŠăăŞăăžăăďź ăăŽĺ ´ĺăăăŠăźă é俥ăŽăăăŞăăŽăŻĺăŤă辡ăăăŞăăăšăă§ăŻăăăžăăă ă§ăăăăĺšćăŻééăŁăé¸ćăăăăăŞăăăă§ăă
ă¤ăžăă fullName
ăsetSubmittedData({firstName, lastName})
ăŤăăă¨ă [submittedData]
ăäžĺé˘äżăŤăŞăăăăăăfirstName
čŞăżĺăăă¨ăă§ăăžăă lastName
ă
jQueryăăŠă°ă¤ăłăçăŽDOMAPIăŞăŠăŽĺż é ăŽăăŽă¨çľąĺăăĺ ´ĺăĺ¤ĺ°ăŽä¸ĺżŤćăäşćłăăăĺ ´ĺăăăăžăă ăăăŻč¨ăŁăŚăăăăŽäžă§ăŻăĺšćăăăĺ°ăçľąĺă§ăăă¨ćĺž ăăŚăăžăă
誰ăĺżăăŞăăŁăă¨ăăăŽă§ăăďź ç§ăăăŁăăŽăăä˝ăä¸ćăŞçšăăăăŽăââćăăŚăă ăăă ăăăăăŽăŹăăšăłăăăăŤăăă¤ăăŽăăăĽăĄăłăăŤĺ¤ăăăă¨ăăžăă
@gaearon ăćéăĺ˛ăăŚĺéĄăďź@trevorgithubăŤăăďź14920ďźăłăĄăłăďźďźăčŚéăăžăăă ďźĺ¤ăăŽćšăăăŽăăŁăźăăăăŻăĺ¤ăăŁăăă¨ăŻç˘şăăŤăăăăăă§ăăç§ăŽĺ ăŽăłăĄăłăăŻăĺéĄăŽăłăĄăłăăŽéä¸ăŽé ăă˘ă¤ăă ăŽăťăŻăˇă§ăłă§ĺ¤ąăăăă¨ćăăžăďźă
ç§ăŽăľăłăăŤăŻăĺ˝äť¤ĺ/ăŹăŹăˇăźăłăźăă¨ăŽçľąĺăăŤčŠ˛ĺ˝ăăă¨ćăăžăăăäťăŽăŤăă´ăŞăĺć§ă§ăăďź
ăĺ˝äť¤ĺ/ăŹăŹăˇăźăłăźăă¨ăŽçľąĺăăŽĺéĄăŽĺ ´ĺăĺŽčĄă§ăăăă¨ăĺ¤ăăŞăăăăŤćăăăžăă ăăŽăăăŞĺ ´ĺăăăŽčŚĺăăŠăŽăăăŤçĄčŚăăžăăďź ç§ăŻć¨ć¸Źăăďź
// eslint-disable-line react-hooks/exhaustive-deps
ăăżăžăăăăăăéăăžăăă
ĺ°éĺ ˇăäťăăŚăăźăżăĺ俥ăăăăć示çăŞĺ¤ć´ăčĄăăăăžă§ăăăăŽĺ°éĺ ˇă使ç¨ăăăăŞăĺ ´ĺăŻăçść ăć´žçăăăăă¨ăă˘ăăŤĺăăćŁăăćšćłăŽăăăŤćăăžăă
ăăŞăăŻăăăăĺĽăŽĺ°éĺ ˇăžă§ĺ°éĺ ˇă¸ăŽĺ¤ć´ăçĄčŚăăăăă¨čăăŚăăžăă ăăăăăç§ăŽăłăłăăźăăłăăŤăŻăçść ă§ăă§ăăćŠč˝ăăăăžăă ĺĽăŽĺ°éĺ ˇăĺ¤ć´ăăăă¨ăĺ°éĺ ˇăăć´ć°ăăăžăăă
ä¸čŹçăŤć´žççść ăŻć¨ĺĽ¨ăăăžăăăăăăă§ăŻăăŞăăćăăăŽăŽăăă§ăă ăăăĺŽčŁ ăăćăç°ĄĺăŞćšćłăŻćŹĄăŽăăăŤăŞăăžăă
const [currentGetData, setCurrentGetData] = useState(getData);
const [prevRefreshRequest, setPrevRefreshRequest] = useState(refreshRequest);
if (prevRefreshRequest !== refreshRequest) {
setPrevRefreshRequest(refreshRequest);
setCurrentGetData(getData);
}
useEffect(() => {
currentGetData(someId);
}, [currentGetData, someId]);
ăžăăé
罎ăăĺż
čŚăăăă¨ćăăžăuseCallback
ăŽĺ¨ăăŤgetData
ăăŞăăăăŚăłăăŚć¸ĄăăŚăăăă¨ă
ä¸čŹăŤăăă§ăăăŽăăăŤéĺćé˘ć°ă渥ăăăżăźăłăŻăç§ăŤăŻćŞăăăŤćăăăă¨ăŤćł¨ćăăŚăă ăăă ăăŞăăŽĺ ´ĺăReduxă使ç¨ăăŚăăă¨ćăăžăăŽă§ăăăăŻçăŤăăŞăŁăŚăăžăă ăă ăăéĺćé˘ć°ă茪ăłăłăăźăăłăă§ĺŽçžŠăăăŚăăĺ ´ĺăŻă獜ĺçść ăŤăŞăĺŻč˝ć§ăăăăăăçăăăăăŽăŤăŞăăžăă ă¨ăă§ăŻăăŤăŻăŻăŞăźăłă˘ăăăăŞăăŽă§ăăŚăźăśăźăĺĽăŽIDăé¸ćăăăă¨ăăŠăŽăăăŤăăŚçĽăăă¨ăă§ăăžăăďź ăŞăŻă¨ăšăăé ä¸ĺă§ĺ°çăăééăŁăçść ăč¨ĺŽăăăŞăšăŻăăăăžăă ă§ăăăăăăăŻčŚăăŚăăăšăăă¨ă§ăă ăăźăżăă§ăăăăłăłăăźăăłăčŞä˝ăŤăăĺ ´ĺăŻăăçĄčŚăăăŠă°ăč¨ĺŽăăŚsetStateăĺżçăăŞăăăăŤăăă¨ăă§ăŻăăŻăŞăźăłă˘ăăé˘ć°ă使ç¨ă§ăăžăă ďźăăĄăăăăăźăżăĺ¤é¨ăăŁăăˇăĽăŤç§ťĺăăćšăĺŞăăă˝ăŞăĽăźăˇă§ăłă§ăăăă¨ăăăăăăžăăăăăSuspenseăŽćŠč˝ă§ăăăăžăăďź
ă¤ăăłăăăłăăŠăźă§ĺăăăă°ăďźăăŠăźă é俥ăŽĺŻč˝ć§ăăăă¨ćăăžăďźăĺŽčĄăăćšăéŠĺăŞăăă§ăă
@gaearonç§ăčŚăĺéĄăŻăă¤ăăłăăăłăăŠăźă§ăăăčĄăăă¨ăŻăć´ć°ăăłăăăăăăĺăŤĺŻä˝ç¨ăçşçăăăă¨ăćĺłăăă¨ăăăă¨ă§ăă ăăŽă¤ăăłăăŽçľćă¨ăăŚăłăłăăźăăłăăćŁĺ¸¸ăŤĺăŹăłăăŞăłă°ăăăă¨ăăĺłĺŻăŞäżč¨źăŻăŞăăăăă¤ăăłăăăłăăŠăźă§ăăăčĄăăŽăŻććĺ°ćŠă§ăăĺŻč˝ć§ăăăăžăă
ăă¨ăă°ăăŚăźăśăźăć°ăăć¤ç´˘ăŻă¨ăŞăćŁĺ¸¸ăŤé俥ăăçľćă襨示ăăŚăăăă¨ăăă°ăŤč¨é˛ăăăĺ ´ĺă§ăă ä˝ăĺéĄăçşçăăŚăłăłăăźăăłăăăšăăźăăăĺ ´ĺăăăŽăă°ă¤ăăłăăçşçăăăă¨ăŻćăžăăăăăžăăă
揥ăŤăăăŽĺŻä˝ç¨ăéĺćă§ăăĺŻč˝ć§ăăăăăă useEffect
ă使ç¨ăăă¨ăŻăŞăźăłă˘ăăé˘ć°ăĺžăăăžăă
useReducer
ăŽĺéĄăăăăžăăăăŽĺ ´ĺăăă°ăŤč¨é˛ăăăĺ¤ăă¤ăăłăăăłăăŠăźă§ä˝żç¨ă§ăăžăăă ăăăăç§ăŻăăăăă§ăŤăăšăŚăŽăŹăźăăźăŤăăă¨ćăăžăđ
ăŠăĄăăŽĺ ´ĺăăć¨ĺĽ¨ăăă˘ăăăźăă§ĺĺă§ăăĺŻč˝ć§ăăăăžăă ć§ćăăăçść ăăć§ćăăăĺă ăŽĺ¤ăŤĺźăçśăă˘ăŻăťăšă§ăă形ĺźă§äżĺăăžăă
é˘ć°ăčż˝ĺ ăŽăăŠăĄăźăżăźă§ăŠăăăăŚć¸ĄăăăăŽäžżĺŠăŞăăăŻăăăăžăă ăăăŻćŹĄăŽăăăŤăŞăăžăă
function useBoundCallback(fn, ...bound) {
return useCallback((...args) => fn(...bound, ...args), [fn, ...bound]);
}
ďźăăă¤ăăŽčż˝ĺ ćŠč˝ăăăăăăĺŽéăŤăŻăăĺ°ăč¤éă§ăăăä¸č¨ăŻé˘éŁăăĺéĄă示ăăŚăăžăďźă
ăŚăźăšăąăźăšăŻăăłăłăăźăăłăăăăăăăŁăĺăŤć¸Ąăĺż čŚăăăăĺăŤăăŽçšĺŽăŽăăăăăŁăĺ¤ć´ăăćšćłăćăăăăĺ ´ĺă§ăă ăă¨ăă°ăĺă˘ă¤ăă ăŤçˇ¨éăŞăăˇă§ăłăăăăŞăšăăŤă¤ăăŚčăăŚăżăžăă 茪ăŞăă¸ă§ăŻăăŻĺĺăŤĺ¤ă渥ăăĺ¤ă硨éăăĺ ´ĺăŻăłăźăŤăăăŻé˘ć°ăĺźăłĺşăăžăă ĺăŻčĄ¨ç¤şăăăŚăăă˘ă¤ăă IDăçĽăăŞăăăă茪ăŻăăŽăăŠăĄăźăżăźăĺŤăăăăăŤăłăźăŤăăăŻăĺ¤ć´ăăĺż čŚăăăăžăă ăăăŻăäťťćăŽćˇąăăŤăăšăă§ăăžăă
ăăŽăăăźăŽç°ĄĺăŞäžă揥ăŤç¤şăăžăďź https ďź
ĺéĄăŻăăăŽăŤăźăŤă§2ă¤ăŽăŞăłăżăźă¨ăŠăźăçşçăăăă¨ă§ăă
React HookďźXďźăŤäžĺé˘äżăăăăžăăďź 'bound'ă ăăăĺŤăăăăäžĺé˘äżé ĺăĺé¤ăăžă
React HookďźXďźăŽäžĺé˘äżé ĺăŤăŻspreadčŚç´ ăăăăžăă ăăăŻăćŁăăäžĺé˘äżă渥ăăăăŠăăăéçăŤć¤č¨źă§ăăŞăăă¨ăćĺłăăžă
ăăŠăĄăźăżăŽăŞăšăă使ç¨ăăăăăŤĺ¤ć´ăăă¨ďźă¤ăžăăăšăăŹăăćźçŽĺă使ç¨ăăŞăă¨ďźăăăŠăĄăźăżăĺä¸ă§ââăăŁăŚăăĺźăłĺşăăă¨ăŤăŞăšăăä˝ćăăăăăăăĄă˘ĺăç ´ćŁăăăžăă
čăďź
ăăăŤăĄăŻ@gaearon ăç§ăŻăĄăăăŠăăŽčŚĺă
Accessing 'myRef.current' during the effect cleanup will likely read a different ref value because by this time React has already updated the ref. If this ref is managed by React, store 'myRef.current' in a variable inside the effect itself and refer to that variable from the cleanup function.
ăăŽăĄăăťăźă¸ăŻĺ°ăç´ăăăăă¨ćăăžăă ăŻăŞăźăłă˘ăăćăŽĺç
§éťćľĺ¤ăă¨ăă§ăŻăćŹä˝ăŽĺ¤ă¨ç°ăŞăĺŻč˝ć§ăăăăă¨ăčŚĺăăăă¨ăăŚăăă¨ćăăžăă ĺłďź
ăăŽĺ ´ĺăăăăčŞčăăŚăăĺ ´ĺăăăŽčŚĺăçĄčŚăăŚăĺŽĺ
¨/ĺćłă§ăăďź
ç§ăŽĺ ´ĺăčĺłćˇąăĺ ´ĺďź CodeSandbox
ăłăłăăăšăďźăăă¤ăăŽăŤăšăżă ăăźăżăă§ăăăăăŻă 獜ĺçść
ă¨ăăŚăłăăăăŚăăŞăăłăłăăźăăłăăŽć´ć°ăŽä¸Ąćšăé˛ăăăăŤărefă§ăŤăŚăłăżăźă使ç¨ăăžăă
é˘ć°ĺ ă§čŞăżĺăăăĺç §ăé襨示ăŤăăăăăŻăŞăźăłă˘ăăăŽĺ ´ĺăŤĺĽăŽăăźăŤĺç §ăä˝ćăăăă¨ă§ăăăŽčŚĺăĺéżă§ăăă¨ćăăžăă ăăăăăăŽčŚĺăçĄčŚăăăă¨ăă§ăăă°ăä¸ĺż čŚăŤĺéˇăŤăŞăăžăă
@aweary
ăă¨ăă°ăăŚăźăśăźăć°ăăć¤ç´˘ăŻă¨ăŞăćŁĺ¸¸ăŤé俥ăăçľćă襨示ăăŚăăăă¨ăăă°ăŤč¨é˛ăăăĺ ´ĺă§ăă ä˝ăĺéĄăçşçăăŚăłăłăăźăăłăăăšăăźăăăĺ ´ĺăăăŽăă°ă¤ăăłăăçşçăăăă¨ăŻćăžăăăăăžăăă
ăăăăăăŻăăăăŞăŚăźăšăąăźăšăŽăăăŤčăăăžăă ăťă¨ăăŠăŽäşşăăĺŻä˝ç¨ăăćăă§ăăă¨ăăăăăŻăăŠăźă ăŽé俥čŞä˝ăćĺłăăŚăăă¨ćăăžăăé俥ăăăăăŠăźă ă襨示ăăă¨ăăäşĺŽă§ăŻăăăžăăă ăăŽĺ ´ĺăç§ăćäžăă解湺çăŻĺéĄăŞăăăă§ăă
@ davidje13
2çŞçŽăŽă¨ăŠăźăĺ˝ăŚăŻăžăĺ ´ĺăćĺăŽă¨ăŠăźă襨示ăă䞥ĺ¤ăŻăăăžăăďź
lintăŤăźăŤăĺ¤ć´ăăććĄăŤă¤ăăŚăŻăć°ăăĺéĄăćĺşăăŚăă ăăă
ăšăăŹăăćźçŽĺă使ç¨ăăăŚăăĺ ´ćă§ăăŽăŤăźăŤăçĄĺšăŤăăćšćłăŻăăăžăăďź
čŞĺăä˝ăăăŚăăăŽăăçĽăŁăŚăăă¨ćăăŞăăăă¤ă§ă// eslint-disable-next-line react-hooks/exhaustive-deps
ă§ăăžăă
é˘ć°ĺ ă§ĺ¤ć°ă使ç¨ăăăŽăspreadćźçŽĺăŽăżă§ăăĺ ´ĺăäžĺé˘äżă§spreadćźçŽĺă使ç¨ăăŚăĺŽĺ ¨ă§ăăăŤăźăŤăŻăă§ăŤăăăć¤ĺşăăŚăăăŽă§ă確ĺŽăŤč¨ąĺŻăăĺż čŚăăăăžăă
ć°ăăĺéĄăŽplsăćĺşăăŚăă ăăă
@CarlosGines
ăăŽăĄăăťăźă¸ăŻĺ°ăç´ăăăăă¨ćăăžăă ăŻăŞăźăłă˘ăăćăŽĺç §éťćľĺ¤ăă¨ăă§ăŻăćŹä˝ăŽĺ¤ă¨ç°ăŞăĺŻč˝ć§ăăăăă¨ăčŚĺăăăă¨ăăŚăăă¨ćăăžăă ĺłďź
ăŻăă
ăăŽĺ ´ĺăăăăčŞčăăŚăăĺ ´ĺăăăŽčŚĺăçĄčŚăăŚăĺŽĺ ¨/ĺćłă§ăăďź
ăăźă..ăăăăă°ăŤă¤ăŞăăĺ ´ĺăŻéăăžăă đ
ăłăłăăăšăďźăăă¤ăăŽăŤăšăżă ăăźăżăă§ăăăăăŻă 獜ĺçść ă¨ăăŚăłăăăăŚăăŞăăłăłăăźăăłăăŽć´ć°ăŽä¸Ąćšăé˛ăăăăŤărefă§ăŤăŚăłăżăźă使ç¨ăăžăă
ăăăĺ¤ĺăăŽăŚăźăšăąăźăšăŻĺćłă§ăă plsăč°čŤăăăăăŤć°ăăĺéĄăćĺşăăžăăďź
ĺĺăŞăăŁăźăăăăŻăăăăçľăżčžźăžăăŚăăăŽă§ăăăŽĺéĄăăăăŻăăžăă
ä¸čŹçăŞčłŞĺă¨ĺçďź https ďź
useEffect
ă¨äžĺé˘äżăŤă¤ăăŚčŠłăăçĽăăăĺ ´ĺăŻă https ďź
éăăŞăăăăĽăĄăłăăŤčż˝ĺ ăăäşĺŽă§ăă
ăŤăźăŤăŽĺ 厚ăĺ¤ć´ăăăĺ ´ĺăăžăăŻăąăźăšăćŁĺ˝ă§ăăăăŠăăăăăăŞăĺ ´ĺăŻăć°ăăĺéĄăćĺşăăŚăă ăăă
ćăĺčăŤăŞăăłăĄăłă
äťćĽăŻ@threepointoneă§ăăăăăăšăăžăăă čŚç´ăŻćŹĄăŽă¨ăăă§ăă
LintăŤăźăŤă§äżŽćŁăăăžăă
çĄé˘äżăŞ
useEffect
äžĺé˘äżćŁĺ˝ăŞăˇăăŞăŞăăăăăăăăŽăŤăźăŤăŻă
useEffect
ăĺ¤é¨ăăŽdepăčż˝ĺ ăăăă¨ă匨ăăăăŽă§ăŻăăăžăăăĺăăłăłăăźăăłăĺ ă§ćŠč˝ăăžăăăă¨ăă§ăŻăăŽĺ¤é¨ă§ĺŽçžŠăăăžă
LinterăŻăçžĺ¨ĺŽĺ ¨ă§ăăĺ ´ĺăŤăŻčŚĺăăžăăăăăă䝼ĺ¤ăŽĺ ´ĺăŻăăšăŚăăăčŻăććĄăćäžăăžăďźé˘ć°ăă¨ăă§ăŻăĺ ăŤç§ťĺăăăă
useCallback
ăŠăăăăăăăăŞăŠďźăăŚăźăśăźăłăźăă§äżŽćŁăă䞥ĺ¤ăăă
ĺ°éĺ ˇăŽçść ăăŞăťăăăăă¨ĺ¤ĺăăžă
ăăă§lintéĺăŻçşçăăŞăăŞăăžăăăăĺ°éĺ ˇăŤĺżăăŚçść ăăŞăťăăăăć Łç¨çăŞćšćłăŻç°ăŞăăžăă ăăŽă˝ăŞăĽăźăˇă§ăłă§ăŻăăŹăłăăŞăłă°ăŤä¸č˛Ťć§ăăŞăăăăćăžăăăăŠăăăŻăăăăžăăă
ăç§ăŽéé˘ć°ĺ¤ăŻä¸ĺŽă§ăă
ăăăŻăŻăĺŻč˝ăŞéăćŁç˘şăŤĺăăŁăŚăăŞăăĺ°ăăă¤ĺăăăžăă ăăŞăăŻďźăăă¤ăăŽăąăźăšă§ăŻăăăŞăăççĽă§ăăžăďźDEPSăćĺŽăăĺ ´ĺăç§ăăĄăŻĺźˇăăăăŞăăĺ¤ć´ăăăŞăă¨ćăăă¨ăăăăŽăĺŤăăăă¨ăăĺ§ăăăžăă ăŻăăăăŽ
useDebounce
äžă§ăŻăé ĺťśăĺ¤ăăĺŻč˝ć§ăŻçšĺŽăŽĺ¤ăéçă§ăăă¨çľśĺŻžăŤä¸ťĺźľăăĺ ´ĺăŻăăăă埡ĺśăăăă¨ăă§ăăžăă
ćăĺŽĺ ¨ăŞćšćłăŻăAPIă§ć示çăŤčĄăăă¨ă§ăă
揥ăŤăăŹăłăăŞăłă°ĺ ăŤé 罎ăăŞăéăăćăăăŤĺ¤ć´ăăăă¨ăŻă§ăăžăăă ďźăăăŻăăăŻăŽć Łç¨çăŞä˝żç¨ćłă§ăŻăăăžăăăďźăăăă
<Slider min={50} />
ăŻćąşăăŚĺ¤ć´ă§ăăŞăă¨č¨ăăă¨ăŻăĺŽéăŤăŻćĺšă§ăŻăăăžăăă誰ăăç°ĄĺăŤ<Slider min={state ? 50 : 100} />
ăŤĺ¤ć´ăăĺŻč˝ć§ăăăăžăă ĺŽéă誰ăăăăăčĄăăă¨ăă§ăăžăďźčŞ°ăă
isCelsius
çść ăĺăćżăăĺ ´ĺămin
ăĺ¤ć´ăăăŞăă¨ćłĺŽăăŚăăăłăłăăźăăłăăŻć´ć°ăŤĺ¤ąćăăžăă ăăŽĺ ´ĺăSlider
ăĺăăăŽăŤăŞăăăŠăăăŻćăăă§ăŻăăăžăăďźăă ăăăăŞăźĺ ă§ĺăä˝ç˝ŽăŤăăăăă§ăďźă ăăăăŁăŚăăăăŻăłăźăăŤĺ¤ć´ăĺ ăăă¨ăăçšă§ä¸ťčŚăŞčśłăăăă§ăă ReactăŽä¸ťăŞăă¤ăłăăŻăć´ć°ăĺćçść ă¨ĺăăăăŤăŹăłăăŞăłă°ăăăăă¨ă§ăďźé常ăăŠăĄăăăŠăĄăă§ăăăăŻăăăăžăăďźă ĺ°éĺ ˇăŽĺ¤BăăŹăłăăŞăłă°ăăăăĺ°éĺ ˇăŽĺ¤AăăBăŤç§ťĺăăăăŤăăăăăăĺ¤čŚłă¨ĺä˝ăŻĺăă§ăăĺż čŚăăăăžăăăăăŻăĺ§ăă§ăăžăăăăĺ ´ĺăŤăăŁăŚăŻă埡ĺśăĄăŤăăşă ăŻăĺ¤ăĺ¤ć´ăăăă¨ăăŤčŚĺăăăăăŻă§ăăĺŻč˝ć§ăăăăžăďźăă ăăćĺăŽăĄăŤăăşă ăćäžăăžăďźă ĺ°ăŞăă¨ăăăŽĺ ´ĺăŻăć°äťăăăĺŻč˝ć§ăéŤăăŞăăžăă
ć´ć°ăĺŚçă§ăăŞăă¨ăăćŁĺ˝ăŞăąăźăšăăăăăăă
key
ăăŞăťăăăăăŠăăăźăłăłăăźăăłăăä˝ćăăŚăć°ăăĺ°éĺ ˇă§ăŻăŞăźăłăŞĺăăŚăłăă埡ĺśăăăă¨ăă§ăăžăă ăăăŻăăšăŠă¤ăăźăăă§ăăŻăăăŻăšăŞăŠăŽăŞăźăăłăłăăźăăłăăŤăăăăéŠăăŚăăžăăăç§ăŽé˘ć°ĺ¤ăŻä¸ĺŽă§ăă
ăžă珏ä¸ăŤăăăăä¸ĺŽă§ăăăăŹăăŤăŽăšăłăźăăŤĺźăä¸ăăăăŚăăĺ ´ĺăăŞăłăżăźăŻćĺĽăč¨ăăžăăă ăăăăăăăŻĺ°éĺ ˇăćčăăćĽăăăŽăŤăŻĺ˝šçŤăĄăžăăă
ăăăçăŤä¸ĺŽă§ăăă°ăDEPSă§ăăăćĺŽăăă¨ăĺˇă¤ăăăă¨ăŻăăăžăăă ăŤăšăżă ăăăŻĺ ăŽ
setState
é˘ć°ăăłăłăăźăăłăăŤčżăăăă¨ăă§ăŻăăăĺźăłĺşăĺ ´ĺăŞăŠă§ăă lintăŤăźăŤăŻăăăŽăăăŞéćĽĺç §ăç解ăăăŽăŤĺĺăŞăťăŠčł˘ăăŻăăăžăăă ăăăä¸ćšă§ă誰ă§ăĺžă§ćťăĺăŤăăŽăłăźăŤăăăŻăăŠăăăăăăăăăăŽä¸ăŽĺĽăŽĺ°éĺ ˇăçść ăĺç §ăăăă¨ăă§ăăžăă ăăăăă¨ăăăăŻä¸ĺŽă§ăŻăŞăăŞăăžăďź ăăăŚăăăăăŽĺ¤ć´ăĺŚçă§ăăŞăă¨ăĺäťăŞĺ¤ăĺ°éĺ ˇ/çść ăŽăă°ăçşçăăžăă ăăăăŁăŚăăăăćĺŽăăćšăéŠĺăŞăăăŠăŤăă§ăăăă ăăé˘ć°ĺ¤ăĺż çśçăŤä¸ĺŽă§ăăă¨ăăăŽăŻčŞ¤č§Łă§ăă ăĄă˝ăăăŽăă¤ăłăăŤăăăăŻăŠăšĺ ă§ä¸ĺŽă§ăăăă¨ăăăăăăžăăăăăăŤăăŁăŚçŹčŞăŽçŻĺ˛ăŽăă°ăçşçăăžăă ăă ăăä¸čŹăŤăé˘ć°ăłăłăăźăăłăăŽĺ¤ăéăăé˘ć°ăŻăĺŽć°ă¨ăŻčŚăŞăăăžăăă lintăŤăźăŤăŻăä˝ăăăšăăăć示ăăăă¨ăŤă¤ăăŚăă賢ăăŞăăžăăă ďźă¨ăă§ăŻăĺ ăŤç§ťĺăăďźćăç°ĄĺăŞäżŽćŁďźăăžăăŻ
useCallback
ăŠăăăăăŞăŠăďźăăăŽĺ寞ăŽăšăăŻăăŤăŤĺéĄăăăăžăăăăăŻăçĄéăŤăźăăçşçăăĺ ´ćă§ăďźé˘ć°ĺ¤ăŻĺ¸¸ăŤĺ¤ĺăăžăďźă ĺŻč˝ăŞĺ ´ĺăŻďźĺăăłăłăăźăăłăă§ďźlintăŤăźăŤă§ăăăăăŁăăăă俎ćŁăććĄăăžăă ăăăăä˝ăăć°ăŹăăŤä¸ăŤć¸Ąăă¨ćł¨ćăĺż čŚă§ăă
ăăă§ăĺéĄă俎ćŁăăăăăŤ
useCallback
ăŠăăăăăă¨ăă§ăăžăă ćčĄçăŤăŻăé˘ć°ăĺ¤ć´ăăăă¨ăŻćĺšă§ăăăăă°ăŽăŞăšăŻăĺăăăŤăăŽăąăźăšăçĄčŚăăăă¨ăŻă§ăăŞăonChange={shouldHandle ? handleChange : null}
ăăĺăĺ ´ćă§ăŽfoo ? <Page fetch={fetchComments /> : <Page fetch={fetchArticles />
ăŹăłăăŞăłă°ăŞăŠă ăžăăŻă茪ăłăłăăźăăłăăŽçść ăéăăfetchComments
ă§ăăăăăžăă ăăăŻĺ¤ăăuseCallback
ă¨ăé˘ć°ăŽIDčŞä˝ăĺ¤ć´ăăăžăăăĺż čŚăŞĺ ´ĺăŤéăăžăă ăăăăŁăŚăăăăŻäžżĺŠăŞăăăăăŁă§ăăăĺéżăăăăăŽé厳ă§ăŻăăăžăăăçĄéăŽéĺćăŤăźăăć¤ĺşăăăăăŽăăčŻăă˝ăŞăĽăźăˇă§ăłăčż˝ĺ ăăĺż čŚăăăăžăă ăăăŤăăăćăç´ăăăăĺ´é˘ă硊ĺăăăăŻăă§ăă ĺ°ćĽăăăăŤĺŻžăăć¤ĺşăčż˝ĺ ăăĺŻč˝ć§ăăăăžăă 揥ăŽăăăŞăăŽăčŞĺă§ć¸ăăă¨ăă§ăăžăă
ăăăŻçćłçă§ăŻăŞăăăăăăăĺŞé ăŤĺŚçăăăă¨ăć¤č¨ăăĺż čŚăăăăžăă ç§ăŻăăŽăăăŞăąăźăšăăăŞăĺäťă§ăăăă¨ăŤĺćăăžăă ăŤăźăŤăŤéĺăăŞă俎ćŁăŻăăă¨ăă°APIă
createTextInput(rules)
ăŤĺ¤ć´ăăŚărules
éçăŤăăregister
ă¨unregister
ăuseCallback
ăŤăŠăăăăăă¨ă§ăăregister
ă¨unregister
ĺé¤ăădispatch
ă ăăé 罎ăăĺĽăŽăłăłăăăšăăŤç˝Žăćăăžăă ăăăăă°ăăăăčŞăăă¨ă¨ăŻç°ăŞăé˘ć°IDăćă¤ăă¨ăćąşăăŚăŞăăă¨ăäżč¨źă§ăăžăăă¨ăŤăăăłăłăăăšăĺ¤ăŤ
useMemo
ăčż˝ĺ ăăăă¨ăăĺ§ăăăžăăăăăŻăăăăă¤ăăźăĺ¤ăăŽč¨çŽăčĄăăăăć°ăăăłăłăăźăăłăăçťé˛ăăăŚăăŞăăăčŞčşŤăŽčŚŞăć´ć°ăăăĺ ´ĺăŤçš°ăčżăăŽăŻć˛ăăăă¨ă§ăă ăăăăŁăŚăăăŽç¨ŽăŽĺéĄăŻăäťăŽćšćłă§ăŻć°äťăăŞăăŁăăăăăăŞăĺéĄăăăçŽçŤăăăžăă ç§ăŻĺćăăžăăăăăă辡ăăŁăă¨ăăŤăăăăăăŤçŽçŤăăăĺż čŚăăăăžăăé˘ć°ĺžĺąć§ăĺŽĺ ¨ăŤçĄčŚăăă¨ăé˘ć°ăłăłăăźăăłăă¨ăăăŻăŽăă°ăćŞĺăăžăăăăăčĄăă¨ăĺ¤ăĺ°éĺ ˇă¨çść ă襨示ăăçśăăăăă§ăă ă§ăăăăă§ăăéăăăăăŞăăăăŤăăŚăă ăăă
č¤ĺĺ¤ăŽĺ¤ĺăŤĺĺżăă
ăăŽäžăćŹčłŞçăŤă¤ăăłăăăłăăŠăźă§ăăä˝ăăŤă¨ăă§ăŻăă使ç¨ăăççąăŻç§ăŤăŻĺĽĺŚă§ăă ă¤ăăłăăăłăăŠăźă§ĺăăăă°ăďźăăŠăźă é俥ăŽĺŻč˝ć§ăăăă¨ćăăžăďźăĺŽčĄăăćšăéŠĺăŞăăă§ăă ăăăŻăăłăłăăźăăłăăă˘ăłăăŚăłăăăăă¨ăăŤä˝ă辡ăăăăčăăĺ ´ĺăŤçšăŤĺ˝ăŚăŻăžăăžăă ă¨ăă§ăŻăăăšăąă¸ăĽăźăŤăăăç´ĺžăŤă˘ăłăăŚăłăăăĺ ´ĺăŻăŠăăŞăăžăăďź ăăŽĺ ´ĺăăăŠăźă é俥ăŽăăăŞăăŽăŻĺăŤă辡ăăăŞăăăšăă§ăŻăăăžăăă ă§ăăăăĺšćăŻééăŁăé¸ćăăăăăŞăăăă§ăă
ă¤ăžăă
fullName
ăsetSubmittedData({firstName, lastName})
ăŤăăă¨ă[submittedData]
ăäžĺé˘äżăŤăŞăăăăăăfirstName
čŞăżĺăăă¨ăă§ăăžăălastName
ăĺ˝äť¤ĺ/ăŹăŹăˇăźăłăźăă¨ăŽçľąĺ
jQueryăăŠă°ă¤ăłăçăŽDOMAPIăŞăŠăŽĺż é ăŽăăŽă¨çľąĺăăĺ ´ĺăĺ¤ĺ°ăŽä¸ĺżŤćăäşćłăăăĺ ´ĺăăăăžăă ăăăŻč¨ăŁăŚăăăăŽäžă§ăŻăĺšćăăăĺ°ăçľąĺă§ăăă¨ćĺž ăăŚăăžăă
誰ăĺżăăŞăăŁăă¨ăăăŽă§ăăďź ç§ăăăŁăăŽăăä˝ăä¸ćăŞçšăăăăŽăââćăăŚăă ăăă ăăăăăŽăŹăăšăłăăăăŤăăă¤ăăŽăăăĽăĄăłăăŤĺ¤ăăăă¨ăăžăă