From ec7728ddb63a05a510de1f5c771b29cf1cb94549 Mon Sep 17 00:00:00 2001 From: yuimorii <109933604+itsyuimorii@users.noreply.github.com> Date: Mon, 29 Jan 2024 06:48:45 -0600 Subject: [PATCH] deploy --- 404.html | 20 + assets/css/0.styles.8f3dca9f.css | 1 + assets/img/action.af11efbe.png | Bin 0 -> 73651 bytes assets/img/contenttypebuilder.24db04ba.png | Bin 0 -> 117315 bytes assets/img/contenttypebuilder2.d73df612.png | Bin 0 -> 52169 bytes assets/img/destrcturing.1503f4e8.png | Bin 0 -> 236438 bytes assets/img/errorobject.51c51d3f.png | Bin 0 -> 330172 bytes assets/img/gitrebase.175e6a7f.png | Bin 0 -> 106686 bytes assets/img/heapandstack.5e7d479c.png | Bin 0 -> 15003 bytes assets/img/mapobject.7b1842a0.png | Bin 0 -> 190685 bytes assets/img/redux.e6057df8.png | Bin 0 -> 13338 bytes assets/img/reduxasync.0f79d5bf.png | Bin 0 -> 17456 bytes assets/img/search.83621669.svg | 1 + assets/js/1.8d37d391.js | 1 + assets/js/10.d8df69df.js | 1 + assets/js/11.2a97faa3.js | 1 + assets/js/12.5fd72f78.js | 1 + assets/js/13.767d92f0.js | 1 + assets/js/14.09112e04.js | 1 + assets/js/15.2d87bde7.js | 1 + assets/js/16.d6bec5e2.js | 1 + assets/js/17.3dbcb51f.js | 1 + assets/js/18.4c170722.js | 1 + assets/js/19.2c90b27d.js | 1 + assets/js/2.a44fb3b0.js | 1 + assets/js/20.b2ffde3d.js | 1 + assets/js/21.7f8f7869.js | 1 + assets/js/22.3f20ce36.js | 1 + assets/js/23.40d3f423.js | 1 + assets/js/24.00bed91f.js | 1 + assets/js/25.4b75e33e.js | 1 + assets/js/26.c3c8e865.js | 1 + assets/js/27.6c078df5.js | 1 + assets/js/28.2212ab5e.js | 1 + assets/js/29.406b7de6.js | 1 + assets/js/3.f8c28e7e.js | 1 + assets/js/30.ab821c7e.js | 1 + assets/js/31.c2296a43.js | 1 + assets/js/32.a64339eb.js | 1 + assets/js/33.a7f43a2e.js | 1 + assets/js/34.b9fe4fba.js | 1 + assets/js/35.6015d88a.js | 1 + assets/js/36.2ee99065.js | 1 + assets/js/37.847bad24.js | 1 + assets/js/38.2cfb7649.js | 1 + assets/js/39.ae4e90ef.js | 1 + assets/js/4.9eb8282d.js | 1 + assets/js/40.2b6981d1.js | 1 + assets/js/41.b55d51e9.js | 1 + assets/js/42.f21bd3bd.js | 1 + assets/js/43.8e67900b.js | 1 + assets/js/44.0e1420d6.js | 1 + assets/js/45.53b109cf.js | 1 + assets/js/46.f7c681d7.js | 1 + assets/js/47.8ca3627f.js | 1 + assets/js/48.c45fa987.js | 1 + assets/js/49.73811052.js | 1 + assets/js/5.4ceb5601.js | 1 + assets/js/50.4ea28ae2.js | 1 + assets/js/51.4b2c0433.js | 1 + assets/js/52.a937d41d.js | 1 + assets/js/53.7b06419b.js | 1 + assets/js/6.cb88f024.js | 1 + assets/js/7.0f51d652.js | 1 + assets/js/app.91071ce0.js | 16 + assets/js/vendors~docsearch.8ee43d73.js | 3 + guide/javascript/index.html | 74 ++ guide/javascript/js-array.html | 782 ++++++++++++++++++++ guide/javascript/js-study-notes.html | 74 ++ guide/nextjs/index.html | 74 ++ guide/nextjs/nextjs-basic.html | 78 ++ guide/nextjs/nextjs-study-notes.html | 113 +++ guide/react/index.html | 76 ++ guide/react/react-study-notes.html | 70 ++ guide/react/reactBasics.html | 99 +++ guide/react/reactHooks.html | 546 ++++++++++++++ guide/react/reactRedux.html | 74 ++ guide/react/reactRouter.html | 302 ++++++++ guide/typescript/advanced.html | 777 +++++++++++++++++++ guide/typescript/basic.html | 292 ++++++++ guide/typescript/index.html | 74 ++ index.html | 78 ++ logo.gif | Bin 0 -> 223822 bytes logo.jpg | Bin 0 -> 256870 bytes memo/Formik.html | 78 ++ memo/arrayusage.html | 134 ++++ memo/axios.html | 78 ++ memo/config.html | 111 +++ memo/gitRealted.html | 82 ++ memo/index.html | 74 ++ memo/jsreview.html | 562 ++++++++++++++ memo/reacthooks.html | 321 ++++++++ memo/redux.html | 293 ++++++++ memo/strapi.html | 144 ++++ memo/tswithreact.html | 79 ++ memo/typescript.html | 78 ++ memo/webpack.html | 141 ++++ practice/index.html | 74 ++ practice/shoppingcart.html | 592 +++++++++++++++ practice/todolist.html | 462 ++++++++++++ 100 files changed, 6978 insertions(+) create mode 100644 404.html create mode 100644 assets/css/0.styles.8f3dca9f.css create mode 100644 assets/img/action.af11efbe.png create mode 100644 assets/img/contenttypebuilder.24db04ba.png create mode 100644 assets/img/contenttypebuilder2.d73df612.png create mode 100644 assets/img/destrcturing.1503f4e8.png create mode 100644 assets/img/errorobject.51c51d3f.png create mode 100644 assets/img/gitrebase.175e6a7f.png create mode 100644 assets/img/heapandstack.5e7d479c.png create mode 100644 assets/img/mapobject.7b1842a0.png create mode 100644 assets/img/redux.e6057df8.png create mode 100644 assets/img/reduxasync.0f79d5bf.png create mode 100644 assets/img/search.83621669.svg create mode 100644 assets/js/1.8d37d391.js create mode 100644 assets/js/10.d8df69df.js create mode 100644 assets/js/11.2a97faa3.js create mode 100644 assets/js/12.5fd72f78.js create mode 100644 assets/js/13.767d92f0.js create mode 100644 assets/js/14.09112e04.js create mode 100644 assets/js/15.2d87bde7.js create mode 100644 assets/js/16.d6bec5e2.js create mode 100644 assets/js/17.3dbcb51f.js create mode 100644 assets/js/18.4c170722.js create mode 100644 assets/js/19.2c90b27d.js create mode 100644 assets/js/2.a44fb3b0.js create mode 100644 assets/js/20.b2ffde3d.js create mode 100644 assets/js/21.7f8f7869.js create mode 100644 assets/js/22.3f20ce36.js create mode 100644 assets/js/23.40d3f423.js create mode 100644 assets/js/24.00bed91f.js create mode 100644 assets/js/25.4b75e33e.js create mode 100644 assets/js/26.c3c8e865.js create mode 100644 assets/js/27.6c078df5.js create mode 100644 assets/js/28.2212ab5e.js create mode 100644 assets/js/29.406b7de6.js create mode 100644 assets/js/3.f8c28e7e.js create mode 100644 assets/js/30.ab821c7e.js create mode 100644 assets/js/31.c2296a43.js create mode 100644 assets/js/32.a64339eb.js create mode 100644 assets/js/33.a7f43a2e.js create mode 100644 assets/js/34.b9fe4fba.js create mode 100644 assets/js/35.6015d88a.js create mode 100644 assets/js/36.2ee99065.js create mode 100644 assets/js/37.847bad24.js create mode 100644 assets/js/38.2cfb7649.js create mode 100644 assets/js/39.ae4e90ef.js create mode 100644 assets/js/4.9eb8282d.js create mode 100644 assets/js/40.2b6981d1.js create mode 100644 assets/js/41.b55d51e9.js create mode 100644 assets/js/42.f21bd3bd.js create mode 100644 assets/js/43.8e67900b.js create mode 100644 assets/js/44.0e1420d6.js create mode 100644 assets/js/45.53b109cf.js create mode 100644 assets/js/46.f7c681d7.js create mode 100644 assets/js/47.8ca3627f.js create mode 100644 assets/js/48.c45fa987.js create mode 100644 assets/js/49.73811052.js create mode 100644 assets/js/5.4ceb5601.js create mode 100644 assets/js/50.4ea28ae2.js create mode 100644 assets/js/51.4b2c0433.js create mode 100644 assets/js/52.a937d41d.js create mode 100644 assets/js/53.7b06419b.js create mode 100644 assets/js/6.cb88f024.js create mode 100644 assets/js/7.0f51d652.js create mode 100644 assets/js/app.91071ce0.js create mode 100644 assets/js/vendors~docsearch.8ee43d73.js create mode 100644 guide/javascript/index.html create mode 100644 guide/javascript/js-array.html create mode 100644 guide/javascript/js-study-notes.html create mode 100644 guide/nextjs/index.html create mode 100644 guide/nextjs/nextjs-basic.html create mode 100644 guide/nextjs/nextjs-study-notes.html create mode 100644 guide/react/index.html create mode 100644 guide/react/react-study-notes.html create mode 100644 guide/react/reactBasics.html create mode 100644 guide/react/reactHooks.html create mode 100644 guide/react/reactRedux.html create mode 100644 guide/react/reactRouter.html create mode 100644 guide/typescript/advanced.html create mode 100644 guide/typescript/basic.html create mode 100644 guide/typescript/index.html create mode 100644 index.html create mode 100644 logo.gif create mode 100644 logo.jpg create mode 100644 memo/Formik.html create mode 100644 memo/arrayusage.html create mode 100644 memo/axios.html create mode 100644 memo/config.html create mode 100644 memo/gitRealted.html create mode 100644 memo/index.html create mode 100644 memo/jsreview.html create mode 100644 memo/reacthooks.html create mode 100644 memo/redux.html create mode 100644 memo/strapi.html create mode 100644 memo/tswithreact.html create mode 100644 memo/typescript.html create mode 100644 memo/webpack.html create mode 100644 practice/index.html create mode 100644 practice/shoppingcart.html create mode 100644 practice/todolist.html diff --git a/404.html b/404.html new file mode 100644 index 00000000..0fb31edf --- /dev/null +++ b/404.html @@ -0,0 +1,20 @@ + + + + + + ☻ itsyuimorii.space + + + + + + + + +

404

How did we get here?
+ Take me home. +
+ + + diff --git a/assets/css/0.styles.8f3dca9f.css b/assets/css/0.styles.8f3dca9f.css new file mode 100644 index 00000000..c214af18 --- /dev/null +++ b/assets/css/0.styles.8f3dca9f.css @@ -0,0 +1 @@ +code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#3eaf7c}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:focus .header-anchor,h1:hover .header-anchor,h2:focus .header-anchor,h2:hover .header-anchor,h3:focus .header-anchor,h3:hover .header-anchor,h4:focus .header-anchor,h4:hover .header-anchor,h5:focus .header-anchor,h5:hover .header-anchor,h6:focus .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;-webkit-user-select:none;user-select:none;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#3eaf7c transparent transparent #3eaf7c;border-style:solid;border-width:2px;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.algolia-search-wrapper>span{vertical-align:middle}.algolia-search-wrapper .algolia-autocomplete{line-height:normal}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu{background-color:#fff;border:1px solid #999;border-radius:4px;font-size:16px;margin:6px 0 0;padding:4px;text-align:left}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu:before{border-color:#999}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu [class*=ds-dataset-]{border:none;padding:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestions{margin-top:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestion{border-bottom:1px solid #eaecef}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#2c815b}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion{border-color:#eaecef;padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header{padding:5px 10px;margin-top:0;background:#3eaf7c;color:#fff;font-weight:600}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background:hsla(0,0%,100%,.6)}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--title{font-weight:600;margin-bottom:0;color:#2c3e50}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{vertical-align:top;padding:5px 7px 5px 5px;border-color:#eaecef;background:#f1f3f5}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{display:none}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column-text{color:#555}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-footer{border-color:#eaecef}.algolia-search-wrapper .algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--content{background-color:#e7edf3!important;color:#2c3e50}@media (min-width:719px){.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{float:none;width:150px;min-width:150px;display:table-cell}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{float:none;display:table-cell;width:100%;vertical-align:top}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .ds-dropdown-menu{min-width:515px!important}}@media (max-width:719px){.algolia-search-wrapper .ds-dropdown-menu{min-width:calc(100vw - 4rem)!important;max-width:calc(100vw - 4rem)!important}.algolia-search-wrapper .algolia-docsearch-suggestion--wrapper{padding:5px 7px 5px 5px!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column{padding:0!important;background:#fff!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column-text:after{content:" > ";font-size:10px;line-height:14.4px;display:inline-block;width:5px;margin:-3px 3px 0;vertical-align:middle}}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#3eaf7c;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #389d70}.home .hero .action-button:hover{background-color:#4abf8a}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#3eaf7c}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#3eaf7c}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.badge[data-v-15b7b770]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-15b7b770],.badge.tip[data-v-15b7b770],.badge[data-v-15b7b770]{background-color:#42b983}.badge.error[data-v-15b7b770]{background-color:#da5961}.badge.warn[data-v-15b7b770],.badge.warning[data-v-15b7b770],.badge.yellow[data-v-15b7b770]{background-color:#e7c000}.badge+.badge[data-v-15b7b770]{margin-left:5px}.theme-code-block[data-v-759a7d02]{display:none}.theme-code-block__active[data-v-759a7d02]{display:block}.theme-code-block>pre[data-v-759a7d02]{background-color:orange}.theme-code-group__nav[data-v-deefee04]{margin-bottom:-35px;background-color:#282c34;padding-bottom:22px;border-top-left-radius:6px;border-top-right-radius:6px;padding-left:10px;padding-top:10px}.theme-code-group__ul[data-v-deefee04]{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.theme-code-group__nav-tab[data-v-deefee04]{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:hsla(0,0%,100%,.9);font-weight:600}.theme-code-group__nav-tab-active[data-v-deefee04]{border-bottom:1px solid #42b983}.pre-blank[data-v-deefee04]{color:#42b983}.searchbox{display:inline-block;position:relative;width:200px;height:32px!important;white-space:nowrap;box-sizing:border-box;visibility:visible!important}.searchbox .algolia-autocomplete{display:block;width:100%;height:100%}.searchbox__wrapper{width:100%;height:100%;z-index:999;position:relative}.searchbox__input{display:inline-block;box-sizing:border-box;transition:box-shadow .4s ease,background .4s ease;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;background:#fff!important;padding:0 26px 0 32px;width:100%;height:100%;vertical-align:middle;white-space:normal;font-size:12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{outline:0;box-shadow:inset 0 0 0 1px #aaa;background:#fff}.searchbox__input::-moz-placeholder{color:#aaa}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{position:absolute;top:0;margin:0;border:0;border-radius:16px 0 0 16px;background-color:rgba(69,142,225,0);padding:0;width:32px;height:100%;vertical-align:middle;text-align:center;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;right:inherit;left:0}.searchbox__submit:before{display:inline-block;margin-right:-4px;height:100%;vertical-align:middle;content:""}.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit:focus{outline:0}.searchbox__submit svg{width:14px;height:14px;vertical-align:middle;fill:#6d7e96}.searchbox__reset{display:block;position:absolute;top:8px;right:8px;margin:0;border:0;background:none;cursor:pointer;padding:0;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;fill:rgba(0,0,0,.5)}.searchbox__reset.hide{display:none}.searchbox__reset:focus{outline:0}.searchbox__reset svg{display:block;margin:4px;width:8px;height:8px}.searchbox__input:valid~.searchbox__reset{display:block;animation-name:sbx-reset-in;animation-duration:.15s}@keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{right:0!important;left:inherit!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;right:inherit!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:48px}.algolia-autocomplete .ds-dropdown-menu{top:-6px;border-radius:4px;margin:6px 0 0;padding:0;text-align:left;height:auto;position:relative;background:transparent;border:none;z-index:999;max-width:600px;min-width:500px;box-shadow:0 1px 0 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1)}.algolia-autocomplete .ds-dropdown-menu:before{display:block;position:absolute;content:"";width:14px;height:14px;background:#fff;z-index:1000;top:-7px;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;transform:rotate(-45deg);border-radius:2px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000;margin-top:8px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover{text-decoration:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion{cursor:pointer}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple,.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content{background-color:rgba(69,142,225,.05)}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{position:relative;border:1px solid #d9d9d9;background:#fff;border-radius:4px;overflow:auto;padding:0 8px 8px}.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;position:relative;padding:0 8px;background:#fff;color:#02060c;overflow:hidden}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#174d8c;background:rgba(143,187,237,.1);padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{padding:0 0 1px;background:inherit;box-shadow:inset 0 -2px 0 0 rgba(69,142,225,.8);color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--content{display:block;float:right;width:70%;position:relative;padding:5.33333px 0 5.33333px 10.66667px;cursor:pointer}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;left:-1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{position:relative;border-bottom:1px solid #ddd;display:none;margin-top:8px;padding:4px 0;font-size:1em;color:#33363d}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{width:100%;float:left;padding:8px 0 0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{float:left;width:30%;text-align:right;position:relative;padding:5.33333px 10.66667px;color:#a4a7ae;font-size:.9em;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;right:0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:4px;color:#02060c;font-size:.9em;font-weight:700}.algolia-autocomplete .algolia-docsearch-suggestion--text{display:block;line-height:1.2em;font-size:.85em;color:#63676d}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{width:100%;padding:8px 0;text-align:center;font-size:1.2em}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{padding:1px 5px;font-size:90%;border:none;color:#222;background-color:#ebebeb;border-radius:3px;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}@media (min-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:block}}@media (max-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:inline-block;width:auto;float:left;padding:0;color:#02060c;font-size:.9em;font-weight:700;text-align:left;opacity:.5}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{content:"|"}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{display:inline-block;width:auto;text-align:left;float:left;padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}}.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion{border-bottom:1px solid #eee;padding:8px;margin:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content{width:100%;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content:before{display:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header{margin:0;padding:0;display:block;width:100%;border:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1{opacity:.6;font-size:.85em}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1:before{background-image:url('data:image/svg+xml;utf8,');content:"";width:10px;height:10px;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper{width:100%;float:left;margin:0;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline{display:none!important}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title{margin:0;color:#458ee1;font-size:.9em;font-weight:400}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title:before{content:"#";font-weight:700;color:#458ee1;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text{margin:4px 0 0;display:block;line-height:1.4em;padding:5.33333px 8px;background:#f8f8f8;font-size:.85em;opacity:.8}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{color:#3f4145;font-weight:700;box-shadow:none}.algolia-autocomplete .algolia-docsearch-footer{width:134px;height:20px;z-index:2000;margin-top:10.66667px;float:right;font-size:0;line-height:0}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 012.966 2.966V20.5a2.967 2.967 0 01-2.966 2.964H78.988a2.967 2.967 0 01-2.966-2.964V3.897A2.961 2.961 0 0178.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 00-1.574-.199 5.7 5.7 0 00-.897.069 2.699 2.699 0 00-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 01-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 01-1.471-.636 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 011.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 011.82-.185 8.404 8.404 0 011.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 00-.384-.73 1.784 1.784 0 00-.724-.493 3.164 3.164 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 00-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 012.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 00-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 00-.814.24 1.46 1.46 0 00-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 01.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 01-1.471-.635 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 012.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 00-.109-.875 1.873 1.873 0 00-.384-.731 1.784 1.784 0 00-.724-.492 3.165 3.165 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 00-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 012.073-.177zm-8.034-1.271a1.626 1.626 0 01-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 01-1.128 1.906 4.986 4.986 0 01-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 01-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 01-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 011.15-1.892 5.133 5.133 0 011.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 011.753 1.216 5.644 5.644 0 011.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 00-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 01-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 01-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 012.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 00-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 01-.582-.271 13.67 13.67 0 01-.55-.287 4.275 4.275 0 01-.567-.351 6.92 6.92 0 01-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 01-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 00-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 00-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 00-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 01-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 00-.978-.977h-2.28a.978.978 0 00-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 011.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 00-1.382 0l-.465.465a.973.973 0 000 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 00-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 01-4.49-4.482 4.488 4.488 0 014.49-4.482 4.488 4.488 0 014.489 4.482 4.484 4.484 0 01-4.49 4.482m0-10.85a6.363 6.363 0 100 12.729 6.37 6.37 0 006.372-6.368 6.358 6.358 0 00-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%;overflow:hidden;text-indent:-9000px;padding:0!important;width:100%;height:100%;display:block}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title,.dropdown-wrapper .mobile-dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover,.dropdown-wrapper .mobile-dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow,.dropdown-wrapper .mobile-dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .mobile-dropdown-title{display:none;font-weight:600}.dropdown-wrapper .mobile-dropdown-title font-size inherit:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:1rem 1.5rem .45rem 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #3eaf7c;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{display:none}.dropdown-wrapper .mobile-dropdown-title{display:block}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #46bd87}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#767676}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-heading.clickable:hover{color:#3eaf7c}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#3eaf7c}a.sidebar-link.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}} \ No newline at end of file diff --git a/assets/img/action.af11efbe.png b/assets/img/action.af11efbe.png new file mode 100644 index 0000000000000000000000000000000000000000..b2698dccb63fcbbed3f02b2e20d543b7bb00124e GIT binary patch literal 73651 zcmeFZg;yNQ8~%wixP<`%1h+6SxVt+fB)B`l2^uWO;K41y2^w^O;O>&(0fK~J!Gc2= ze4G2Vdw;wC!0uVjnbR}fU0u~x)m7Ec=Xr_J(on?1evFNTgoLN8B=;N%38fJU2{{^s z0qg-M+P?=j$giI(${PIZFQ<#UEtFeWSQyI11Lfi20M6ie?d$Ae?!)2yn&Dp;`OkIatY2HY+q-($yExN6 zT-V&f#nVHap8g@D|Ni}}oYp?}|I5kw^}lZmxIyT{5hyn&7xcf^29k=n_n_px@= zm$P>Qst3qJf>)SN?633xZ%6)@4?iT}0C zzZ3uc;J*`!K_Bk?Z#D6+YW{04P|p(BV$lD#nFRLRwdoH?NK#13a?&q+kbh^Rx4rBK z4@3}Z$vtwEe+EZ2%#C`tY&<`H5ct$fBKPWdm90eU`uFAeXjU*=w8!aK&{^vk^`Gyy zxh-2J2L_V(t<0V8^-sTk_X4AvF0LVc6l{9<_@^q>lMSo>UIw*JkQ$jpquZ&J9OZ~h!{f`obGXCbZyGn)5v1mw zX85u-A5ytNayQhOf1+c&Z}*Q|KEgzqF51+2hcoPGH~J~EGVZCWkK;BE%y+T*f2~7~ zGR=!J&EH(K`bydr$1{U(&5*T9T<~v&?IIkC@ABA7Bh;bbu@B>s>l?%STLWZB5ZQq@ zbkuDbb(Q8P|5io8J0!t2^3LDF6x?B9)c;7*L1>o-B(eLyCqWI~xr5b0zCOBIUr5KT zrL{5tdt=*Wf%qIoot`I$$qDW>FaNzpy9n*tKpC3?`A#w+4rxnhZ-1x#{T|;vLati^ z+ht5Z1sU7X3%*8jY4q@Px0L`sl47aB#*{b|{MmGILI!7C9FUu<@JR zra}GXCDP_hg;JyC%Z~3xgcsj`)(yx~>CS$n5~Zt>1@Zm7JySM4bM>v3{U4WGEq00dtwrPCD~Sv312c+(bEZwJe%aq^oePbakjp(2DSDabAB}7G z0Yu*H^kLto=${=}Nvdne35C^b^lxqYucB-;*f(URF8pIZEiy7gBUau#$3F{L9Q8Kw z|1bFe8*AK-%iV8)!nR3WaG5V31oQ&CE70%O!;XW)pnJb>PirrJ__fLsi1WEzvE=v^ zi2knWJ&|a{1fCf!O0$w8bks(R zQ~C$oDAtLKeuwRI=R4CZ=Z#+l77=2Ni_W5r(;A}vm+1k^4Nis^1C%aJq6bYMf7e5T z2V#)+uNNGun<;Fw;J;u?<`L9XomyJ{e*2$weaZ{A3bUaB16|Io`@jCI1l>pfdjDcP z+D0q5Z&uF|ud~!{xy2LxxkI2bpZv`y{a>%nE-mAP2b`K#!=1nK&z(^_cB7MdVAA;4 zth4U?Xm4HgT69`|RbE+a=;deyD%|<$FJGw;G?JdaTpcf^zwrk~X5xC-eqpj4UpV-V zQrG)yolD1MabO&2$79LBw$|eT%4M5Or(YUEt6|tBCfOU?M|;(sf%;L<4#e64FqL|) z1YTEOuSU=;l~;G{>KND;)lR8Jw@t|4G>77g41MJpg(%0fdsS;mY-PQUGxV60UuK9G zdkz;zoG*bm|*@3#Le zx=1d+N?89Yxbhop=*X?80yWOGs-bUTXom~W`EcH}7&6a3GDLn}~k z6N9&B)0)d0!^z9Fqnvw{QHP!Pfy(y3V!}3WY3>mb*NFA_7dV@z-*ioz z#sAFrE(csJ9{|TLtg3#im3%}yXgeKCa+t2QRu!}!Nl984l0b1(Z5=_%fT!O9*?jsUM`nDOflY0y9kN*_m!a~@_?1D? zK)Kv)$pzm??GhLVA8(lP2B`O|70Y<>UpCpEvu}pYf_uIq72I^*-$GAy*vr>F=ZxnJ zx%ZgJjcNi~XAK;h@dW0(KD(?)_^d7A@_zX_DnoHegwaDj`nzuYpt27KQX_RUWI7HM zizF-4}-4x8kXEu8-KjnyX1gEnh86# zQWTnQi?(JuWh3zK+%GrNs~hD9)N8Oui)-C+VIsAu3i`i3I8+@?@@uUx`^OY%0ycn0K)@v!gQeY zF!PJh4r8U9z$^QU30Z(QrSB1&k^}V4FK05{KfcCpRxe70!7+Z>=J*z01LM%% zbfHE{u&sTFC{|0{pJJ+XBX?zE*CM}JecQ`=y{6M%`udsYs+T^mByU8Rn##1EfWyx4 zdfuY88rdU)DUVAXSTh}KqdIecT~N=4wgI)7^F~ynUT|OP%1pMiD_gOkrPw@U_Lu$s zM=`#J?)A#XAMRVZK^;LUpU3OgnT=A52Pj3|iM@!h6k9fih24Ac1e-p_iHzjF-Ut-Z z*vj#9j>mDr4WBc5{f;2>%oN-fIq0vjGSN1I&~8tj+RPdFEl*~=F^X(b-FBiP9x&iM z4CG*NK_#Xsx?kVI__D*|niK2M<4(`_Xe{Ib29fwmzG1qG`&^C9SzSZ6czrCk(gc>Kh`rVnPLd_pvz^{@dN!Z6t{g36V zLCUB_19iZ2nWk#WlG^AnS9SM;v-S5H$3zMZ)5Yah?zOT*oba!s@pGCE6}?Z&G$G1O zs?hcs$+4vPsa2)c^TQR%wp1T{-~4KLM!vDayT_Zf$1|zdgrmS{`!#rLGu_lAUBQ6n z=JsOc)+#JDnTEVzf+@j@xe3~NGc}jq&~~+3zGuSt{q?x`t*Uv-yC{eG8uK{rW8m2k zx{Q6UU;;swoib-Z%j#{=4qSy>4#rh!muTG0I@W#tb?P`*WlY|e{~{GX8M9D70M-D5 zOiI9ZDVRs%ureldJMXR>Rsw3DaflAQ!90a%!mCHv%pGh`>dC?_SkfhPfpN3q%* z1GJ!r881`Ftzgi%FOnz@Jqi4%y7R7ulGi47JoI>ozo$>;Jvqyn+mxxzd+VDF@Yu%J zQPEi4NbU>$j7Z3JSjatgDl8p_aB4rFb?&(Qb-Iq_O|)CU{fJT5Tjh4bZCm6D%}rpz zj-fgNROr#T@QS_jC~rk0TjX1^3|H~e@6rjH<2@@B#jdQTL2B=;k1i9sit$hOy75=dehY+{q9KZ_ z$9bdF6O!x$@!$%nnP0d5%{UxFc3dhL5b7ouSg6|me(xmejOCbIcKhi<8Z08rH{rO) zzszGYs0mK@)D#{dIEr{l;b8?ab?Yb1(awu-jj+loaGE@h96%EtHS2O_+$T}hq0Z8| zufIzHLpfuN)8nM{ow53DVtBs$pMKo~u||hrf%0Xm>&8TK+PKIGnUz!67AI;|E-~fr z2C*rMxIMPDT!t-a3veka;AT5-{iRh}JokPn6Pee%;=Ysw2G&6LW!u~Ue`64fAZ`jN zHQ6YsIkf2~iuct{iC>X~Sr?KEo(+%8>iyMTwI>vWM;hZU4kRQDg}9@l;-c>MSLe4ERFljL#>MNnYs*u zZ5o__uCGyh)-8)K+-E4oiocbgurjGgv(LRM(fTMsa7i;GMSolE1K%+8QwAZS68Wu3 z6L(@FzLS!vYzAbl?Ix7xjwJuBkNKqZHYOo2b8Y>b@b7C|qgJ@wj}r68xjJf2vi(nn zJ-c^kAO(aKEQC&=cz@V?B{-M)tvMWPve%$5omS4mUbg*N;0Rkulc95SKR5FP5#dv` z@<-M^1sI76W1@#*k|y3id~GGu%2+Ikmx!*AoFY8Am9bOh-L|&~X~5c`bL-$#&8{dR zLPjNg9RZIgU>RmhtO2AWI!LR^W9_Wz5?Trf7u`!>v6EilyQCE3O-HEzE#2geeL8{U z(9Q^Z^>1Zl5wzfxDX7Q33&wrEB<;Icza7kq6uq%|;}EWz`H#-KB;NP7qKr{GdZ_k6Fx4zv*8cAoi_j%^xH9Ik`lFn0?_tA7>McrLdP)Ek;|))@YUM0hy9 zHK(;BT|G-H^lW;<7(U-&Xm?|A8xQjhd&8Zxy*>o2*ABN#LB0qc&VBk@vXWj;9crV} zyGswdd>>`&TEBjViM$PPxuKnYKM!om@-25a1FNP^DlrD9VHY7$iVs^sC11r$R^~8e zPURXiZt1X)B2p$ix^HQ8i_1;YW>^W46ZyZlyBsksj-{IO+Vt7zSp_lLnBVk|ClQQb zV`0J9_CSe>S|)m}Lzz)x_DTKfNNPS~eGH?d`+e~u^z|=|Oez*{SOrI(IFS2V7A2n@ zEH5VW$IY1rwRgVztd_(?1LOFkw0thZklYF)b_$)y)tYjD#@0xX^u)@v2PZwj5G$S$ld&uyg)`xjz$)mBbY;3=$~oCsN=?F3~HI#FX~6l7EuBMkD!ZK5-1tF&^+U9pR-hnyqUV2mj-2Yr3Q zs>FH%50`?>T%HBji!0cIqGe`_v>Z_!yh`_ty<$ZNp}f))9QG>)PR=iE_54?1{ojD8 zE+tKEjn^X_EjxCMK9^6qSM}Uxl_CGf_N!m=XMPfb&=WA6i8ID*h{ImS<1@SRHFsK# z7Q=${30d=f^nR=UK=srt5d(#YLSNeT??`E{)?bjOd@kD}WneJ;eCK9TG!Qcl-}68- zD3PrCt*x(<@>GS|95#d`{pM_YHRz5WK`^Q!VNHdmDkd*1RUqd`f_m$loN5dC5J^$* z=n&BZ&JT-1f)QzU91FDf3=TprwFns1SC3<{!0s&ONie=V54t&!c^Fn9PWOk*ms%+P z@Zcz+l!=$JBz|gMJxAX}$S6S5y33wW$4>Wa+S!j z$#Db1mV#gln5z6eV87;&&lK*X-i!9K3&^S>cbR%O5>cnxn)m9^N)PV-v0Q%=#L4MnGl;h_JU$mN71YJ#2^Z&qjj zFP}o|W+gQ`XMEg5yt3n@LX#Hj3zXoin0;x=kO~V`Qk_r7Z%5O0ruwRoqlnE;2;{A> z(BF+yj6`t|D{(E>R8ZCZ%4VWb*H{4Kj1uSA4)aFcD04^HZ;B3Lqrv;Du^jDWD{Av= zwX=KtE~m=RZ(se9R%cc_$*&>Iue6FPQBMMMs=4kunBUZ&&PS6qB8P!vC`kAZo~ng4 zeIGh!;&2iVtzQ$>uh24G3UQT=-YaqlKs+fYZ^hn5s+gxAxI77SJi;+{eWauF(w~M- z&XMU9&v_&mmgMB(RQD8r@cAflF;VV1ahRFsJJX+Q63MR5O@Hd^5WUy+;Sl)jmw$as zNp=TgkDZN=x4`PvCm}q^zpAZW97!fsK6&u-f>4=%0xVm@V%IYF`VGhiiRIf-r=8yOnjUu<&92`dYY40PaO+={h@F( z8C;z-9=#Kq?AL`DLdnF4MrU-ioiu8(E%Gx+cKL$VhXWY7b^9mO$+mT zU&ydf+%=sgmN}U;N?BJ@Z(8S6agN$RO7hj}w3;v-b0JjsiGE88c(B46Yu!qC5Ishs zTL7ZNotoOBrE^(itITdnUV|(DMn#lg89`(sk!*$VR7G1O|y_2_;wVw zAnNgw7Sf8j&9w7uik;EzeO-P0fWR&LqaVm!7Bq41WCC&!kT5n;%Ty>1EhK{$v28#U zcu#w!xk(0(f1-OvOdnUeoZ95C0gE}X6(3nfo)h&ipQMgeU(y{(m01^L3y4+Orh`lp z|L`<>A{X(9LEpob`<&ofn;U4uI#@P1_{49m-agGEVwjpqIl>AjlPqAn6wy+EC?Zr* zrV4^cD2AML58@L?t>AEi;Icu_uM(6~(87|Od`wU*YB%~RhLBvkKQdmH^R}^eF@EvF z8-Xg*hN;;(HrKAnKU<5>WTIh~_1A?HTOO~%xDUAPwG@mPx(H&pB}@^|)G+|WwMO3N73$-gmg23E*5Hm?b7_o+886(e3zV=wk=n85TbBr}? z-ZS`A?T3Lsw~fWHL7I?Bnu7=7I`Z#QL6Z8Lurlp7y)Q{Nz}42g)7%^_WmtJM(wA*<64tx z{hhOlS~$-I3D>g=h#Ck|b7=p()Pwd&!2iA2yU+pZc zaFHZ1v_u(uQ&tEBsY258(n8DPbqgl#=^L{eQ27x26|Mh|wi0u<7$cU1MNd$ZeO@V? zM=FKxcwq`fH4+8NwA!ik2H_OG|K+F6b*AmiyQp}Vc4BBsy?>AEW|nqUy@>68sNQF- z?SxN+(@l;es)|1rU^6mi+tY-GMoM8Igv4joyQg^=3UFkJ&`Zd zsvXRXwHJ@%QJDRig~2jm!Dv$~O!~XZk{|c!xKq-(gKIKkZ*NjK6~W4oXmUyMH)lte zQ>K?Bqk1oiz^abVWd5*{^-^{7<} zz?-dZ!T}@O3-D)noC-t7Yyh?X%`q`iK*%w2prieIx?--DKQ$?Ig&RL&g~c+xezF`w zO#5dSQyIbLR3l@jxFD#G;K6+pf{qq|Wid*Q>334l?tA*A=SxU5481R#EZLP!>V+3| zs;PhWi(fMPvIf9X3ly?gt_!_~;a0JwGpgpYKw=ESu7;{V95ZJ1q#uTTj!(EIuoyS$ z=}CnS)(pL*_I#mNweGjdJGQ=c%&*7mOnc(bkJO8OO1l3dw)9EixKU`FIb2y}29fy^cqjg@zp;$dV%DTgN7F*dC%MdBw!S_P50p*-OipzMcZkA-l zkh!%`-ZIO^2X8ny>(6+5MllwjKfcb-EQKTM)!4naqQsV1#z~A~5ecNbtk+GN-sUV(FdW9zdbg61IfA4k%iy=3xyz*p`30_OM4Oh$wyEnJzBHBO zp67F5HXsOiG8gQB`|hUh&t-+RI`*JZx8{Zrn;O$$*^grsc$Qe9B<=6ZD;?n-vd5ju z_IuPw6gf#fR_(e@5nS&p|9yuUeJ&XW$^ z1vwKtMfPX<=mP_oqw%eZ6T@C^Y~It`H>#<`D*1otHxbz#+38GtJS zvGK$IR6QumI!%9xSQWDRK+Gx#zWv5Yb-aLVejzSi@X=woeZKedRa+B2;IYtX z%-B;&r_+EsEe)8*unF!wZsx$?#&G~D=CfR$W3J&N=D<=t*!-*?fJ<(@y!6Td$$V@% z=>GNqpaz~afrxwp5{Wrsonk|m_HXR~aFn3x+pnM2n6?BMVQaJZO2FLe>5vY$J)GKq zGgbGB%b}{dI4JJWh!ydUIR2VyvC-u)C~L)ITHRdBd$+9Q4T`Gqe4t6d`M13sKx^)o zkPx)V4e$yI{Po^e1k#nV`7vI?y@}vRErei+qj71iH;Fkd^?^^BYUjF#VQm5A>R9;; z@3`0<=*}%0Uu2s$cjbX|IXA6hL>Qv?5aEJN{oR77?-UJ>Vz11pIl~Oey)&H}-0FqT zi#Xu^14%_IgqUBxHM%-=p);fydoO=$2guozpazY@j%#PlKfPS5mjLuzA5}0s{+P8S zYj;Shqt~7L(2G66S2fGGy~KCg;@d1|4n`7;x<+m=KcGF@VWjlx84XU0SA)@*Y0BrO zj`03Azo@Gf_Ug8^BO-+w8Et~FH4P~eLl0c*CtkIMk-`ST_~7jeG(ZS;bm zND@eL>82c1qH(rZly0)HMG$i&?bkfssJK1V;hJ?&Swu!LomBGQ{PDuxIoWlk)UfL?P> zW%%cT!<`bnyi?=q^LwBaEv)u|DP#q7!I4QT>861@0qVf}IM63Np$XCk=R6dOfofK2 z0%}$3gYg%E@WCg36-gfVm*YV<0vDyvKKcjFtTwI3ow^A_73U>P-G`Z$o7~oy04#Kn zY~hYG%r6MveLf2ef0LE~3YEO9q3Wg`UW=(_c2nBBSP9bX|H|@bD+u5&ZF|eDjhO&{ z7K=lm9Rl6xhpsSgdeO?w^~${$rAr&Unuf6%;DHB6y#(Gscdyip?#JzWFHquieZIGq zX7H-4tqMF7C83Z_8%>Bk66Js~ZW46sdH6|sEdiq{5$G)M=^{2+X*FOvMiBDG}fg6nG>HuKp z?vgi0p`np7Ym=h&hASNb;&dGcEqjq`>#vsFjqPG5B5Kdjhbr}*rDq;y@`s+)%)}LZ z5~78eA_5Cn$OBluL$^;h9Jj0&Ifgx1Swh;E7daQG4+#(n8JKCPE=7=_MrU`E8S-4u z?|p^OaLn+-fa9g+x)N}at%*5Gm5e!#FT6qMQnre`l`oYNFLAZqlHOnAD2?P3B_qdz zJAN64MY5zo>9j#x4LUb;sQi2*d|cyrJT__F4Ss8>bf zgthwKuS}Oej5zoDkg-dD=iaj}PP|4gh$((vR>D|G&YKZQ3pZkm?4lK^sX2Yy>^Jj( ziNWZHiZ3u*wF1*|Y1~F_1|cVeO3#sT7=zOBC%4~5qT&)TeH?^J5z~GE09Rx0hltc{ zc~sw_EdjR5ii^^{mAgNJ4_FWphypKKu4!<~y`v2-H37T_cS(WTrFX_H9>;RY#{*-a zkk5Z=dhuTaGJTP$*#iZXfDR=tAl0I|(T@QG&H6g`zVz4SA>dQdifYr}-WlqA1Dra*aR4YZ- zr;k3q1|2WzqcL4ef{T7#?@_9duK0F(EM6Ex04lrSt+YEZSntdvQ*lo1j`NP-H=FCC z6@+aPCT2!=M&6++qN#qYAsx1fU{XfZV)#l=v5FQd39ICUc1|pgr?rg$&AAGCG)cy`qd;KOA5}2qhb0qV(1D^uVWbYlk^Ep|M#hXgg`OZc3b+!3+nxD~NE=oL zh1k;8N8M(lJShkf|1_^Lv`~4@M-W~A77)$Yz!9~6!yL>|PlMS%hfe z6N7z}3~u2AA=2<%+o^{3in)K(1Fu@`1LU@YPahenSOoW}PAS>ub0>Xvd(L%Q2>-CiC=8^C;Wx&fwOCgqUPt)yS|7L0|jsD}5w2>J9gCKt;Wo zu;nOCjGd4I_9g?4vBB+SA6Z}8-Pg5uXWbl2%E}{{#NXhSik%$Q0?(Qd1{cuwv*(gI zKECnU6bpo%&u-LX5+Ua!Arv^z&J($UytwpgHb}r|O21o@{#Y1w)Hi8%#=+cS;7dd^ z_#Pn~AtMH!I$jgU)gJL(ARk^JoA~r?seurW>zraeDQGl7E)WF8 z$Q6~OYHONHe#5u-XO^Qc)y}Mfqk4-rKia}vDMdU=S*UBphzZt)1u7VU8e8cOdf&1$ z_}O2EP6wf6+24biPKLQ7*k%S!COff742E*WJek^ZAfgXhzy=E(H`I=p{C;-+v#3Su zNVoq`z%-NH#NhT@m2I|XTF@}afl)6aq#Tc!SX!UW4N6!=#b()2jZuR@qx8aLT?CvM zMpHB!L(icw<=)t3WKc_ohcq?aRl?W$Y$7G$^R73aveDMo+@D2HRLg#0Bhcf;Kf#J2 z0u!Az*Wg|y$#ci#`TK4M=5s$+G1Xe|;`?iv52x1>dyV@l#F|+C-68!fl?g`g(;Y&FEO085%y z&44?W{-%5yByAtkv}!tBfU+lg$?JPcugeNNpoIiI@|TxuXr=;hg^tQtOr94S3lElj zfDu6l&9T<^Jt5u+)q1qlYJbkShnR4XiC9gHvQ~$ zJH!xOF6#{=7Fvnc?RUJq3jg>F$&Fx7a=~z|BTP&JFYRqnv*EQwd2j%dKO4=g^_B8= z@8jao{#3WPdzM*4S7`sj`yvy4u65Ycis3WfkuM?P@(eM`IYn5vxiyH@(-5!|Dt^8h za`C-|b^pt!>aJKQl4og=oUNGlA=MXvVNh2W155zvuw$3N(qUucQvjA8;85V*r5Z|X zNij$Buf^?SUKDG6=Q45~LuN&0hlX4KaJfVNE8kD#Q`IqlnzX+KoeCl44~>YUaQe>n2~$D;Cpo;n zC+pL;{%bK&zc!LJtNhIIM<2_PjxvBP7vvZBpHdcP!a#i_S<@z<=TsvJ=z^foj;^l7 z?F3NAb0W=1*cG1MsrvIPaA9-{*RyHOdeSjfb3!^LaL3>oB^RS(QcYwqn&q-3cXvT( zHu8@)G71|yIsMBwC@XaGJzknBjauX*qdiE({h3GgSaa9E>*6&z`}B5f%Ov-^Ln6`f ztzjDu>GWzOG9&!A7^9E_3BAr^O&D${Su110Y@rLWHuH}L+wP$dY;VvNZk4Q3MtbM* zR*>>V-Av3jjH}l;DjgH9Ha%WSww`rd1hr+{)Lih#3WXs9=omIZJ5oBdW~(u*{l!t6czeXTZ5H%u z#1*`(2d~&1hge)rPH!hCKA;8nv_#7*^^xGbQrbu!G5jK4k)oD$;-(g@nsZZ|u*(&w zvqUSUHgCV5QM6L3X*OKgZZY}##x>cbBdYiHyVUghlSHxr9X5wI%D#OUFXrxq_uhbe zDiEJcJFcd~6SSvNDMQwFl^)kqI#K^p7pFVv!#iX*@h{XoouY_|buZFtSCYiBNx@RS zGN}tn*y^mW_iZMX)HXstW2s)ZLiAGV4Zv+e7+SgQ*E!;<9j@qGg;S~SRSXr)vjr5U zu0s4{rUzQ#+6amWz}I}PGj+YtDlTfYD+y@H9J88Lbvdz(!?32 z{cBUCA@1@>1e&_))tzQHo+FN<*gy!hfffl`jm55Yxj*{EMe(V4_Ts_k{u1e1(qH51f5T9KyHap=2yNZ`OZNG1@QW5YAh_uuzfhg}XBhPhopbz$JcO5OjM!cV4yM^N;!gf;p7XzPK+Y z*cqDqQyqON4>Z=x)z5wZY^=w`!L>`ok3Z!t|9Z7Pt6!XISb44HJP8wRYH%`W$;F8C z43MB)HQC`EZl87u$>g$sB}+PZ@|Obk-zKyx1o6FcUvw*;J$QR=&~$r|HTM;MGcfkG z;lu07){Q*J^)y$8nL+ zj%AC^#fUi0*SwkAH2Na$KK;`ml?#A=yl1&`}EUhl#YEM}fYu5m&Dct$NrG9&T0cEF-G4ewL?8`ceesNU7 zQ|})0k8re~O*sRezt^ULmqnQ({P&#Q#hK2#3!fdf!f`2*nu*&oE*m>Yl@UVil~J z7Yl3yogXZ@(W^d)FIdEI7?tZ(E&=ArH5I2iu6G|^7E;)V_2Tk2v1u3c^?sP^7B z#wGkdTp!~x7gRPZj5q;`rDuGaX`t`m_y!b>R;9kX2M2mH_x0y*K*AUg^Cm2MTJrD~ ze8}=3cI+Gi@3YR8pJ&~1IO?@t13oV8+ivUtb)rBq24eB z^NpU!Zt2He>tIfLiB3TIo$>Sf4IjJ`f^>aQ5$#9lzJko6789A~Q9eX0nD)pxDJ%kx zFy8zy`>=~qahJu0NAMGMP;@|%-wJqbbf*b8OB6jBVjxLoSy_*l z{1M*?nErDQ0N?GO@Wj3@uew(tJ{9-Y`^S|_3X7b-73zQg>exFirbO(w9&BD8zIGA6 zdrK*CCM)RC_r>`e#~-)FC+?Apm)n-hYS}vOrvCgN9a`6R50bK3n!ej;Fk?MvMVNpB zmR^Bb3fcxd`-brzUjPXru>S^-iDz+gJ-T;)18?-+fYse$c|F@}VfdK$5+~TF_I7WW z##T>2P=F(BGFHT=Yd9_S_P#{8Gfye3Jc4^h`~52ywi=49NT20*j8k-aS|>FZfj>&!jP_ zHvm2Nc*Y-W?D1@_M3d%0LoN^uZ$1djKDeTi_SGbDDE)3^mey#(CnXnZfA z($7}b^kBPbwN}xiyo;0nvQkzl>hUpZ>?=>M!-`jiVfmKPm^yjR9>q?d8~^+xkt?h^|V8kVeNIWvwxtzO2+ti0*?$r4V;3Cm$I zpCmt+)N}#FaZP7HtnU9rigl54Iwm?!?ejCZ%$IANfLdhc;ZKQW01~aZ=+>sAisI3kh4YTAn0ih<-=^lV?<~B(6I@U7Z4Zv_$ zevao)0E_h?b;fuHpxj-&&Cv1}KHTK-MP@T-g9jx?~&YR5qd zz>0l|As!#!?sws}Q2Y>WBvvK{OkcYp@Sz1DlEnXBMq2W6Bl!Rb*s1i3BaPddv0dwn zI(Psgt?2f5wPAy~=^aWdRyfD`5l>F+IUASUoyWy5&eGDWJFZ4nMxV1(MEd=PNA$`l z-CrLM(gfV^(OiD0)3R#w_&q;4mwH#!HXO^7c>ln@upXcL0OG2DyYHA)4bWXgAz#j{ zr-IKW(`AK!zD2zW;qP+?0+GF&D2Ofqdhkhg4^XL2?ajNbD!3cIyG`niPLU0XI(_-G z`>lM8I!ZaA`Fo-8Q9i!#HiT zcn>(6eulKHNf&1jYj!$ngj6_elM{XsM! zaEgz^bdGbjxpIH!E%^g<3cv#2wSN4!jH7M&HLHou1aoM=`WVgI@_TpIAL!7sPfV|j z*`#imtZ5B{O7qUWn5@kQ`{I_@3pmEC(lnFfdbqFD_TI-4Y8efJBK)LT>&Y&;OQuTL z1_A6qgHa}Wn3!3&3d+~yxcumn5ybd2b|OgaF@CUuZL_i4-4Ypr!KTSPMKVKdC!X8> zVyu_LVNIUl=dHG?euTO6NXA{&W}$@hO-k?R$9hv6q;-+J&PeLrEq&Ca3OYKu%^ zq;#rJ%w?s>bM)pat@+7izD4qg*N~UcMu|Mk5tv=vPQMD~#-o^%V%Z+?M6E~ki(?g{ zn5vE_lE>ld90)Rh2SNwi=|Aw2 zYSc53*s&6_PbIu%F?3t{81St2ES`^!ijn*hpfn}VDrQJwqgE=Cp)(GK6r)Q-id3tO zt#;l@1chicDk*MBj=(hagxy5W_qd!_jkX4)l542BhcCogt_!8;6u%l&3CH|aq2UeMY2!1a`dL}0utwxzG9kStk}nPRsHOWt03 z#9sB}<5#;2*9z+$9KeQwgP!<2u3j{tT#K?+FE}#Vk!w;0OthQB2>DG227%6h$(vpg z&N3)Tgb_U>=a{|yx)fx8%c<%Y%7Wmr(c9M60pGXoH)PInZ)*bX_`W7p%Yspk>>4S@!<*LomWhP~9KDZ+J_`?N${NF5NJyJxy1ii=1;UeBLjjQ15^1V-p^URHG^Xz z$KAf9=-p<$f+(Q$NMlo=KA_poYI&Nfz_4}94&qCbz@T>TNtX)zAOVXRJ^HO zBIY5r677$A68l~(3B*rS(<(;l^1!dpLb_wQzZ{^*v;oY0E_ZN!Y^DDGQ@GULry?VZ z9%GSMPi>aQFGSxbIR!s9d+i%Gdp2gR6ZB-({qnN=K90A$(&K5$dr>g3fnRl6p}lm3 z%&;6ubKTM_c>4{Hia-7O_(Gt0DS5?C7t@lq?ebTqCu8JroL>beKX*aRGc-_WymWLt zeVTaKFeR)TjTrycBTUpsMd5||XS7a;O|zHZupf;En^>J-q1|&2%UV1$K#0%*F;dEU z^n}c$7=Q5=7L~P{TAP<~o3XBdJs_IpxgO#BNb<0UIJQPtcxsZ%w>{p{t{}6LtMK9c z8#)B2i3cmMq9%_vg#=yRxaJYu?q`}35+Z@Cwy6>~$x#P{XQeno>V<5d z7k9eimB}A^er>lxyR?FYCCwg2+q(=fREdIasixk3i%EY)c!u9fcIL42^8V-e{bP4X z!QuC)?jh-GuJG;TZIuDMTTKkY8VCmFw{65Ykja+9Kbq7 z@mv+l@!n33g$^Kvn1GDWu)k8$MX9nY-r%A{y(C)+93VTTd`hJ7gty?l)|9d+1MT27JuD*IPfKRkB@pOL36M*w}W~coaGt0*U+bSaB;!X zO82qm1*4%0MV_AJd4oh>ghK@rE2W57GO`N^gC11^pfE4plRNfVBh^ePYU$B6p9}Kd zVRFkWq4Hp|F}N@p*bz^7X#*xXv5M)A|x(F>|Z?ES31HJ#maLTVlnUlGXB0 z7zigmVVBGE}FKT_H#7>Ph*} zKOv}$H8*0mze4tnnLnXA$xv|aFAsnbad0 z(&}B^*=NY2sq3ElaXSskU|GaKKUUPKut@N9pMu5LpWMQvo=nmaIu1Ry!d!mK4^68N z)K&A7O=5bJ$a%m*=y3Je+7c2`aHkEr=hB!Bq#RhKk{R|XA&_*#9%HZKlLkHX$!vw%mG_I}fo*1!s<)Pr?@=>KSbM$N}`J?fBd?N0mW-mkqxf?52-dMzCjU_N-2scibt!Gh6 zy4Plkc_ulCYO6M$5GT8*#oisH9~w5NHA^@9r(-$CeYYJ$|B!HMM}EjWE2yRxil2lX8|_j#0zhI=JZnV(+a2s`}QxQALngAn5|6 z8)Qi(Ho_Ze%y`~ANE-WTWUT%Jo^u$W`cF`qHU z^D8Dx-K=DaS}a)@GnQ98b{yX9MpYh^K}tk?Owa(fViB~$l>DT(Msyu62Ye= zyD%fPSlTdaoO;<^m+q?C<6Mu>pa<$!wdB)x!lyExEIn^qR9quNb6WCDj;i-}gNFp8 z%72Rs9R4!#IHpi=KMJZkyARlj%Ufi`)PV_e7O3<7hLuvp|}b|O}| z2DRX8gdWx9W0Dh4U_o0a@mhqU^!%fv>ADiTBYIvWYJ2|BZDi7LWz%1Y1F? zUXtaH#>@^st##mY@GGCU%+U%{;qI9Jo<_v!9DC!{hRBIZWf=Ce)G4fxn{Bq=N%y7d zZDIXl7cnYnf?@k=U?b|P#(GV`L%G<7A0+!peZom|u}<-=LY*3kf|uG`W9=^d=Q!<9 z)U^;3`aK}_=hc0avcKxko!h&EWdT7$S$WAQuSjWmrf>X?B8NaB+R~6+@;$$Q)e3%J z9p?M!DC|&Ps}*vOSMTD;X5Z^`SJ+bV7Nn6&$tcQ{M!%VP`Yr&IK??Fy-1@8+D#6Zx zNyZI``ik7A$st)9!t+}h6j!P`6on&vk$UaYG*~ovTz80&35t68EwduEW@WsSGgod_B>~jgRvN* z-UOsG$Wh!rPd9|W>!aK}I2Vtg9ay~1UL%En5%ot6T>?q)a`A{qM6kHVP+cJL-g&*B z$6l?|{~h0mP#k-AaLC4ddDKCA_k!#LKT&>nuJhmutCp0P`ilQmmod3lEWh#N55>tu z!WF^FZ#)M2X;r<Pe*4T=I$p9@o3h$`~ZGT%bgpJzu0_kR72a#22^ zK&Mg|jfBE1u;Y(Oa8&(n*oj^(`sg(VviBu%hv2P3a&Rtr-SCM=7iDnp<>eqO| zyxH#GevwyR-$EczJRJYX8noKgj;e|CBQhO5-vK&38C`M#S|(Jt=Qs@ZGdTq9{r*lF zppaAeRAs^D?A+~twF!6nqLaOWp~@^(7?s2w8Vo3}F9la)>xmW|o? zl_*`Px4-R#tJE-u|8$dwLwEW00w4S(6VIQ;jsNa8AU?;1W*xbz@UABWws!0!S1-Qw zaK*DTo+Z`}Nnd(LdAMmThdA&1&9WQp9wfM)Z3z(2j#MWQKjF`r^B!Y9VhT;)eETtl z^SE2KG0Nikag_IM=gq(v@|keaN+C&yUB1ckd#G(ao&RuU>S{|+pRBLL-pfAofo3UG zv+s)^Udl?-y+w!^vcI|dJi1?PGutT36Y1noMY{JfIrh_^LM!oU`<-xZ`~a0wr=mIO zk0kcF(0d+!ljW57oA94qa}Wt!vAV3z{JQqmn*Q$LE7n{TG@YWIdv1Xug=7L-9dTg` zGF*(=PnM7q`=_{)Uz`#y(P?QtRKC|?bj|Xht9V7@7OP#}XQNOADJtgTqAedGts}8{ ze59z`-Mk;eqkI>>9>{Z8iGH=x%eWFihO5a0J`UI9g%Z42GqHVH^N#Bbam`@3QrL!KO?1;P+b`a zWhS3e#8iHyTbJf47U=i89o$fMioAkFTNTbNs3-v4YuFA|!Qr*%_`K$wF0mny%f;|-BeEvw78$vo# z>tUoYrsQ50IhG8TsI7M=c+v$$o?+J4keb*i2kl zx99l@;>FeQ_FAHbCNQLekvJrHT1 zB4Yc7EmGm~`Ntfu;jSnOSP?P48WXF-WSzS6*v4xhGx%2aL~taTT45%du%Eg8#UmyO zi8=oql(LQ>@ncF%i5H^CP2_?wVyuLB;@#_w9hc0)q;6NA-wds2c2i5arTkrk=2SU- zASJFI5sdlK4e7z6^^}jVEq|BW;hMVoRaQsl8?3xsktJ&-ER0@&qj^e6zhBISm&$2BZU0A(-CXX7cLt98iKaS3AJAedW{T;oMDA!L`5Hy<$gIrA2mr8 zvNX&t*=iCLyHTW_`RZK2AD^O|*b;3#=!<)%kCSJO^`+Q~9(@GTp}0QmGSQ(j)xnZ_ zs#d%kUlXZMeAWotBk38hFE>K>Wxqo-fcPM-Qom0Pd=VBe^m{3m99wRANSlF6@Vo7U zKKcr-tbmD&FFwwdG2xS!aWnM%J8rHV@)*iQw`(RFCl^cjy*PCtIQ4E);_qU6wJRY}BeTKp-`#^PdWdT)N# zldg_|X8L9GQ*?9~Hhq4vuq%%{SMq8d*87gNS^lU_hhJ}AuaTF)=#^-tC7ffI6x+HW z>ZAUNc#)s{jcHy?`8_xHkmX5Gz|!aLBO1sku3r8jmF7p2oWD%Ci9{OD2=UU_vTE(^ ze~TV>kjjQbCM^M_fZajcgo zs-v?oCI3ENPsw98BK#4LT2zHnGy{4%*(UUwTs3&LD!s71v=48pS?^w3cn|w}r>cT& zM=#@f10Hd3=So-wPS{~#7lFcz-s8a2Mny-vEH{xWBR)1{gGX&6(NoA<7yg}kiWsVo z`=vF@XS?=GiZ|7F-^+0I@Vg~g{AHk(huq*JL?q5BcBMUgy=$>dC&SW(aoxcsexiwftC}v++MQe6IfVM8(b*F(74Yrhsn#RG zh5IM%ujYSnhwTw9-n~y?sAp!7NegxQx1>e@s}09LZ>pGnit1k$cFFhHrW1*?SohDY z3L22!$~rr&=}=oFP?b~l)Y=MQ*la(&O<#JGI=eH-I>*wG_MaA#98VBmRIk73@&+3u zFCG>{yNKU`BY*zG>hRZ7AH*LfKMEU_C;kI)*5eUr>)Ugj%2XlwC-nY>9d4xOu&X)$ zPq;aG2*C7j(_Vj5h7;2M*Lu%qBODM0Hs-EXT>kkL`RsrJAZLPMKKW0yIg^`;MLS0G zeu~dK#MB-4o|nlx$pf%vEftkDjbh$;)L-HH%W7Y;{~)ri%bIoDOe1dw>L;9dWEVNr~|@O_7S)drxe{i))G1h2~55cYv{mUEJ}bIQ$h>;3u= z--TA~VF!e60}lCI+o3|USe7$wJHWXHsV<>$8bV>TE+ta)3_);QTT9R)Um zZc1qQpC&(5G)`M@fNf}TyH`Uq^doagMsdq=z6h|MFA!yvTZK@WWq zHwyqNJWAsnMw&Hd<2@H&fg>2X(w`U7nTjk1$Gq2DIV4l3m;$#Wo~NVYrEuzgA61ki z`*7+FZeWarKo|5c@E%$SGKv{o5$srb!3frPuOiJ~*IZt=t}X!7Z2=l*y3e24<$BkIrPfa<^C+K@AY4Bcs2?=_xT6sDqeKXGQdA+5g9NB%^ zZVyqg*3t6-CR?udkoMw$%maWBsN0ahnctl=hYM!cV9;!!M(OiSgTyB(_Nqk}&xt>kMg9|s9I?bjrF6LSy)#OPiC!YEwI zaf_BH7lySDCX35zPlS@Kw~^4qBzuw+ike+Gtxp4tR8W)-$Eq;aHE834~~-M=a< zNZ%0)Cs-aA%Tl0yilYM9=C#)Ix6pOC4c|QwgEZXV-Q3hs*7Ddpz_GqM&EQN-LbfjX z9{No++p_4_X4Bd(PHJRK4O`g_dL(b19pfXa;L^BckIs?~;q@YEdLD`lxQ*_s)eI0*xnJz>)v9hQRY4Me&)T%kH-56Lop){#@Yw}O@#=wJw+}L@+UAdj0j9>w zH&+*}4|}_j#&o((Rh5jSu9T;!5*l-KXlI6#m@*8=m7oIEhcUPO#ub2Rp{V=>#(M`& zVPY_LRc)sPA|Qb99`f$43Zq=+Z_f=zO0aVT#cJpMd<-hi9E!*yA+KvWfQ@%=>ts6V zUoC*%&<5P1Y%#Ha3rKO!3)bSOJ#Ws>JX1Hrt@>C!RowI7Iu({+SX1TYOTIo9uDGY3 zHvmLERT1S=ZOl$u@e(EI;aG)ZlNU@(TXe9Izo#ruM_-5Q_n(3*E7Q4)4~mQ@X%-d` z6HqJw#(TYmg9(GuZt0F=k~)hcfmtK1<@w_o`7$XhWIi^H&U^WzkNx+6(PA09JMCXT zskjnTEg^p3j_A$ZtSq!BWqv?HNza_$UA(%kXkt*}M{Ts^^kxjm+Q z>nohR(5nspy&FL_mNi&Kby9a7KUSbshcfCMJQHXe?x#?>lz%vZ$rfc7k;ZZ=ux^q{ z6(8rqluTr&)Unn6+Y{i=|FW5+Sv`|VtS@KsP5Xf4BW7Hm7if9KrdQS6m+LnN!18i8ZP!b(Ij-czqlhm% zModwbB@EP+zwSPZZRe~hC^l{RMyqBWGh`h0>FEGQb`!#5Ogz!3xwV|+eTLAwibh17x^=; zYTIJM=URxvOv$$3uO4dtoF6(Ru^BFHi15*ILRt&fisXXgsTW^A4Vb=XG2kOv~pMBQU)_)svw`nK?4GpszevScE;HY2@R{?lsL zmp&)H5T>o+dZ-Y^LiMx`9GZV?ldLBs$W1Y@6so5{{*335{%F4AsAnu#b9#0W$6NuV z+H5^xo!zmO?Ef|0m@k|0`r<%9*7lllN~Mpo?)_A>CF`5I3&7aAxm=23g4CXFOAqSm z&$8v4K~VRwqnO9qc}V^xIPN8?JM<_>b3Tsx>1VHinLg@L4_441PcrB|A}y(V#3Il& z5z`)^(jARxb}gsswxm^i)J;lrxcGd67(O$6;$$2-iI84?%5Y6-i0k_d>aU;PxfEcO z2JzIpDf^CcTX9-w4(+BHLPRh0*DJ3yd5)AK_?Xqs0%wdmPg1&mtjl_VhIS+ zXJL`Y>>;UM*V|t9)Vz!qDzTV+rwYxe5tA@K^z9fbkK&1R_Z^0ZRnmLkXvCVb@+N(u zz&Z)np(T;RJ{uGZ3beGJC`AtRa6?(TBzh8+a8Tl$FMrFUTgFkye7?jJ(ke$3Qh+3s z=@`^QXoXSO5-GT&ND|JW%uwVV!w zrWniyG;N>IyN(%qP`)8Hr+U!BVsxrP3fXfnw1J#guxt7zN z)t{MDF6JFw2K^~xFqb25h+%MSfFoVmF?w$fY#Ym0SO~LK%j5IUsLqJ`J6*f8{RMx+ z`FH}$4<{K9rxzm_r|-w)Un194Di5&tM`gB(2HTBB$A3*4V>k~ULP2UGN88%%#1xn_ z#7IGT<%K2V_?qV&kR*={Ba!%4i9P)^5w``YDa5ztTnE08aKqduz9J#6qP>3rd~=yO zxLa{8rze3lu_x}zK$t&)(nx2seWMux702*5Z+#Y@D%RmlW(uw#V*B6&vM*oziYWXm zD@{LU!S~@;El;LkJw|xh#NltXFat4&HaZn-V)QoXdpIC8w?(6O6d$`M{3>KMS<9Bh z+NHl{wX#?RmT_32xqXDOL}fb^J`ryG@!7~E-i-kd8blB;k<^XY0~2+pN7o$WhA^WX z0~X0%4(m`G3Qh!b1tJL~vJX_gP5j+(fotKZdIhsT749fir8;AIdBu__G(o~yxFYu0 zJfxzZB_*gibxN{e?<_+^UgRSE$v$Co%Q`i(qdz1%Q>I6uLeR4zI`D&h4LEQUOf&`u*tBn0dZB$19KnldaCmH=XN zP36{;_;BGvojnVI@EyAoM;kS(*mYga(Yi+e-{?|un9Fuo== z7Dp}0h$D9Ey2?E>?EAnf{MLWAG#s;rOg(yJp}PjM7RDOf4NFx}YeN<3?^Rn7SGz{J z`pJV)2$3{b%P?3G`bJSBlW(>fiu7tq?M#{WUFkMt;)(r$@E5PodO{Ha^Z2N_ILC#| zjdOF&iif|%dSZ??e zEnK*pwfkD)Jw#okP0r9~7mlhEeWn-Kyxn?Rg-u;epl{h%{&=*va#$WQ#(537emxl2 zjuo+r>U4Z<85S16J0%lPvAa6+!lb(hamIz8EHaG<7tn@GFHT^5p*tkm`+` ze3v;IqZ!YG_AI;bc{!~Y9>H4TjU%N>=5jyTx0Mo6b#X#+HGi!57ig@|Vs*+|JD$*i z&*1@*^peTEe-I4xe#CC{*02<*6^nO=?qs{Fg;GRFFs$QpW7L)>)I{bE*T{ipjO<@E zjAR*uLGlaA+LyY}zpG6vyD;O>)vXt|B0dCwSMr!9NnR=ybkA@j+p8Gpn3bVVu%J zp~|Jv8f0jh`D}4UrA{BVjcKn-NfH5Ru^MEC_9Q}ox{IYpID@Ylz*ovwvg2iZX@QrHC!EjaRqQyl(&8FU-@ihwawNo`F2IFb11~I zpreOc>>@7G-}u&_T5Q=gDUh-@{9S*0wzjZ2Mfz0p6df~pS0tc0G zewr`V(zVIe#daz2xqQ^5$@>PqVeYRN)J&!6vceqGZAg_hCixAVy4_1yOKw+oM>0}a zmI(&f@Ly`bRl$c-1qzvPAw_z4q@fW%A^MLTFxriM#~|$Y`hgFJc|vOQLCnz%-)Ujm zLE^O5w4%2m2GUX%Eeh7YUf<;EXNKF&cr!Pb&ci5*)`KlJTl z|3>jNT1(RO-Am+8c?E`vYz&rJRG}duOJIRdrZxRmwGx!qlk>M*Cflwhp@k_=TeN0v zv5-wjMp)n1|99m{hkwv(bcEhS!!LNan3TEr?PFtWgi~rg89FWF*(v7*a#%DyZ0qPZ zc3F;YI_BP3_m)qB5Z}3(uS~xd2hfpVmcVb}Zg>B6rItbc--k`{O&yn4LuaU6(TGdP zBxrTQ`M?C2;356dQ?!~?if?KMqI#nPO&mm0bI@o=A44nLGU5pJ<;?Spap4Xogd#cS*KE1Wc_}7 z`ZCt{_UmtJAsIE))*=I-}6@o|=7J3Yy|9mbLuT z_aKv~O{O@pP{VR3GN{H^C`d&(%jNeY0u<(1vk3ZeEd4n0c7I~g=Yu+K zR~=v)OI=fp?t+GawlG&S{A+idpW)-7Wj{`XxSmZ@Zq%t4KG^xAY}{Ccxw|1{yoXIy z1v%Hp9*;CD9xKjO<-pXB4QY!V9SNe|A>J=cgw-x#w_JWU&3gPSy7RE$)UZQ_w|>@N zMPh%vEVc(>n|(nYPYawvO1<}yUcr7!W|tlM8!9i8v({-S)RY%vNLn&LuKoE*y!hjI z*qEx5-=~a6O8&0IGQn=^Kz$q)Jz~HokAtp+b8Cvd7rf&|6A7bF$x%yHQ4>~;uBKvNaX>VE`RZ6}t(bto^^fl!zDKCqHv6~N z47)T@xu@kV+0kbVEGST@5uWbWG_>bk$nonZ!8rYRW7H279$i|qSy&`bRW9u%lAS$t zq^^>qkF*U8mS`|NmXoQEx{WD~eD$6WOtC@nj|Ec>6_GCmj=FGL2qwtT)vw0h(0g;uf-tEwf zHkfo1iJVn6SO=Zz)If30#Ffdt(dbUSOzCajS zAwr0Jo#JRHbl^i%iW<&WE^luZyqXZJnkqI{ef{e0S##ixvJA|PBChuQC?cQu_)|hF z^&P%}&%#o-;H@5oQXOlic=^VO6M`cX^ViV~Q|4d>{<7nw4_9r^ntP<%n^Ga$dXGD! zn#i@cJ_ZvQOXD;b_YU+9;^qQJ5#|*GpNE(F^!VaC;tlFEzPF|}#l2M~x7|Lu$7_w^ z-gyt1nzp0SNMsNv6(L>0LG@rZu}d5j2co?kB*b+iif8vtSb;+_IQTihQkBmneSsYX(?3F(4RKbXMSfxttdgQkDnADj-}%4BK^ZZ{e@C-3OT4``<@ zVN3M#DhUxQ%Z7O-u76OTr%@jrsZt>Zy((UiKR^*ap{femo421+^%(VwnA{=RoD zq{|rnfQIiR#{OY+`jAjWh@B#2uE)-?#E@aHBatmp&iNHNYHl~zNTPsoc9bAb#niE% ze|ctZ6#W5pcx4xrr>y-_!D(FvZMfuN2r3N1H>NK{sNpCnZMI90&rA}ZC*XhNDEFm_ zs~aIK;4^Ht2@%Ci3I_`9z_S-8bY;M!jQJpz_g+dT^sBQGE5s~-8uV}S7Jda)FnbDX z^#^yWG>XDbNB6FAd;NX-RubE+f0uB(Jn?5^=f@6)HsE#o`@iv{FCuZwD4U9YnyBv; zZH-N>qqh3W%Tw}^fp|vvcxIWD_bv^m*1$-V2i=Qo@w7h;i6fYmXw=VEXa^jpTo_)lqgwZE_M1g?rSmFx_ z=+$W7d5`Owb+~+@*dK(1o$<4Z$L!Nf3}!2v=if~#es6YCNv8-~jtx~*`H{?abW3Ep zni+4VEC6fSVGsQZM?IwcMWgpUc06F8d{vR4`)yG#PwHz|980zpq?-yIkuH^YmFM-T zQ`UWS8E?1{|E4$~lPXKJq5oZ{RiyX0Z2H~QQFk?D##qy}8sOKVqyrV%LJ5A)pCt>_ zw?P!z70>)RM9?YTM{gDLa1CKnA#HE6b961om2N*wpvHzGH6~ZN-`3A|(=An{rNxU+ zeZqQM?h~K4z2&hz>J_c(_^8g@jyQ-8v*#^z!NXU8Uzb|nXC%4jW6SYQOApdsunvQG z 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⪚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 z

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 literal 0 HcmV?d00001 diff --git a/assets/img/contenttypebuilder2.d73df612.png b/assets/img/contenttypebuilder2.d73df612.png new file mode 100644 index 0000000000000000000000000000000000000000..30af1bde01e152a54aadd78905e374f58ade13e1 GIT binary patch literal 52169 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%0APn4;)e3|_51Xqc2UPW=;`uTk6TdL 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

uK%!wI7FFEhF!BbY+6+(N(CIKYQ1tb{Qw|5~ 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 z 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ȹnbGL`Ew=tAhl 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 z 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%0AQRb|rzUV{*Zy%r(PXrW-Y2{&fFVXf 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%0A?o~ej-FDKl1 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 +CnGpN9|S(&^<>xWrBnLH-uY>9+d+ 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 b4`sg*f`{FMo%nPY_@}O-eKA+b;_3eYh~q*$ literal 0 HcmV?d00001 diff --git a/assets/img/heapandstack.5e7d479c.png b/assets/img/heapandstack.5e7d479c.png new file mode 100644 index 0000000000000000000000000000000000000000..4767cde0c00a2ba36d12786ba7fa676fea7d7127 GIT binary patch literal 15003 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 literal 0 HcmV?d00001 diff --git a/assets/img/mapobject.7b1842a0.png b/assets/img/mapobject.7b1842a0.png new file mode 100644 index 0000000000000000000000000000000000000000..05ea59ae41e393462aff17c7e3e7268f4f95239f GIT binary patch literal 190685 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/img/redux.e6057df8.png b/assets/img/redux.e6057df8.png new file mode 100644 index 0000000000000000000000000000000000000000..5166886dfb8a7d57c700fc4646dcb8d2adac0fc1 GIT binary patch literal 13338 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 NFWOwdn_qwMzW~T3HOc@0 literal 0 HcmV?d00001 diff --git a/assets/img/reduxasync.0f79d5bf.png b/assets/img/reduxasync.0f79d5bf.png new file mode 100644 index 0000000000000000000000000000000000000000..9acf600034704d3df55dce57f8462f5648881651 GIT binary patch literal 17456 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 diff --git a/assets/js/1.8d37d391.js b/assets/js/1.8d37d391.js new file mode 100644 index 00000000..89e82e91 --- /dev/null +++ b/assets/js/1.8d37d391.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1,12,14,21,22,25],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return s})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return p})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return k}));n(90);const s=/#.*$/,i=/\.(md|html)$/,r=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(s,"").replace(i,"")}function l(t){return o.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(l(t))return t;const e=t.match(s),n=e?e[0]:"",i=a(t);return r.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(s);if(e)return e[0]}(e);if(i&&n!==i)return!1;return a(t.path)===a(e)}function p(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const s=t.charAt(0);if("/"===s)return t;if("?"===s||"#"===s)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,s,i=1){if("string"==typeof e)return p(n,e,s);if(Array.isArray(e))return Object.assign(p(n,e[0],s),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(p(n,e.path,s),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:r.map(e=>t(e,n,s,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function k(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var s=n(239),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(s.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(s.g)(this.link)||Object(s.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(s.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(s.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(14),o=Object(r.a)(i,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},242:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(243),n(14)),r=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},247:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},254:function(t,e,n){"use strict";n.r(e);var s=n(241),i=n(242),r=n(91),o=n.n(r),a={name:"DropdownLink",components:{NavLink:s.default,DropdownTransition:i.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,s){return e("li",{key:n.link||s,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(s){return e("li",{key:s.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:s},on:{focusout:function(e){t.isLastItemOfArray(s,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},257:function(t,e,n){"use strict";n(247)},258:function(t,e,n){},265:function(t,e,n){"use strict";n.r(e);var s=n(254),i=n(239),r={name:"NavLinks",components:{NavLink:n(241).default,DropdownLink:s.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,s=this.$site.themeConfig.locales||{},i={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(i=>{const r=t[i],o=s[i]&&s[i].label||r.lang;let a;return r.lang===this.$lang?a=e:(a=e.replace(this.$localeConfig.path,i),n.some(t=>t.path===a)||(a=i)),{text:o,link:a}})};return[...this.userNav,i]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(i.j)(t),{items:(t.items||[]).map(i.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;n{let s=i()(e,"title","");return i()(e,"frontmatter.tags")&&(s+=" "+e.frontmatter.tags.join(" ")),n&&(s+=" "+n),o(t,s)};const o=(t,e)=>{const n=t=>t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),s=new RegExp("[^\0-]"),i=t.split(/\s+/g).map(t=>t.trim()).filter(t=>!!t);if(s.test(t))return i.some(t=>e.toLowerCase().indexOf(t)>-1);{const s=t.endsWith(" ");return new RegExp(i.map((t,e)=>i.length!==e+1||s?`(?=.*\\b${n(t)}\\b)`:`(?=.*\\b${n(t)})`).join("")+".+","gi").test(e)}};var a={name:"SearchBox",data:()=>({query:"",focused:!1,focusIndex:0,placeholder:void 0}),computed:{showSuggestions(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions(){const t=this.query.trim().toLowerCase();if(!t)return;const{pages:e}=this.$site,n=this.$site.themeConfig.searchMaxSuggestions||5,s=this.$localePath,i=[];for(let o=0;o=n);o++){const a=e[o];if(this.getPageLocalePath(a)===s&&this.isSearchable(a))if(r(t,a))i.push(a);else if(a.headers)for(let e=0;e=n);e++){const n=a.headers[e];n.title&&r(t,a,n.title)&&i.push(Object.assign({},a,{path:a.path+"#"+n.slug,header:n}))}}return i},alignRight(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},mounted(){this.placeholder=this.$site.themeConfig.searchPlaceholder||"",document.addEventListener("keydown",this.onHotkey)},beforeDestroy(){document.removeEventListener("keydown",this.onHotkey)},methods:{getPageLocalePath(t){for(const e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},isSearchable(t){let e=null;return null===e||(e=Array.isArray(e)?e:new Array(e),e.filter(e=>t.path.match(e)).length>0)},onHotkey(t){t.srcElement===document.body&&["s","/"].includes(t.key)&&(this.$refs.input.focus(),t.preventDefault())},onUp(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown(){this.showSuggestions&&(this.focusIndex "+t._s(n.header.title))]):t._e()])])})),0):t._e()])}),[],!1,null,null,null).exports,c=n(283),h=n(265);function f(t,e){return t.ownerDocument.defaultView.getComputedStyle(t,null)[e]}var p={name:"Navbar",components:{SidebarButton:c.default,NavLinks:h.default,SearchBox:u,AlgoliaSearchBox:{}},data:()=>({linksWrapMaxWidth:null}),computed:{algolia(){return this.$themeLocaleConfig.algolia||this.$site.themeConfig.algolia||{}},isAlgoliaSearch(){return this.algolia&&this.algolia.apiKey&&this.algolia.indexName}},mounted(){const t=parseInt(f(this.$el,"paddingLeft"))+parseInt(f(this.$el,"paddingRight")),e=()=>{document.documentElement.clientWidth<719?this.linksWrapMaxWidth=null:this.linksWrapMaxWidth=this.$el.offsetWidth-t-(this.$refs.siteName&&this.$refs.siteName.offsetWidth||0)};e(),window.addEventListener("resize",e,!1)}},d=(n(290),Object(l.a)(p,(function(){var t=this,e=t._self._c;return e("header",{staticClass:"navbar"},[e("SidebarButton",{on:{"toggle-sidebar":function(e){return t.$emit("toggle-sidebar")}}}),t._v(" "),e("RouterLink",{staticClass:"home-link",attrs:{to:t.$localePath}},[t.$site.themeConfig.logo?e("img",{staticClass:"logo",attrs:{src:t.$withBase(t.$site.themeConfig.logo),alt:t.$siteTitle}}):t._e(),t._v(" "),t.$siteTitle?e("span",{ref:"siteName",staticClass:"site-name",class:{"can-hide":t.$site.themeConfig.logo}},[t._v(t._s(t.$siteTitle))]):t._e()]),t._v(" "),e("div",{staticClass:"links",style:t.linksWrapMaxWidth?{"max-width":t.linksWrapMaxWidth+"px"}:{}},[t.isAlgoliaSearch?e("AlgoliaSearchBox",{attrs:{options:t.algolia}}):!1!==t.$site.themeConfig.search&&!1!==t.$page.frontmatter.search?e("SearchBox"):t._e(),t._v(" "),e("NavLinks",{staticClass:"can-hide"})],1)],1)}),[],!1,null,null,null));e.default=d.exports}}]); \ No newline at end of file diff --git a/assets/js/10.d8df69df.js b/assets/js/10.d8df69df.js new file mode 100644 index 00000000..4debec43 --- /dev/null +++ b/assets/js/10.d8df69df.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[10,3,12,14,18,21,25],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return h})),n.d(e,"k",(function(){return d})),n.d(e,"l",(function(){return f})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return g}));n(90);const i=/#.*$/,s=/\.(md|html)$/,r=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(s,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",s=o(t);return r.test(s)?t:s+".html"+n}function h(t,e){const n=decodeURIComponent(t.hash),s=function(t){const e=t.match(i);if(e)return e[0]}(e);if(s&&n!==s)return!1;return o(t.path)===o(e)}function d(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const s=e.split("/");n&&s[s.length-1]||s.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,s=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:r.map(e=>t(e,n,i,s+1)),collapsable:!1!==e.collapsable}}}(t,s,n)):[]}return[]}function b(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var i=n(239),s={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(14),a=Object(r.a)(s,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},242:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},s=(n(243),n(14)),r=Object(s.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},245:function(t,e,n){},247:function(t,e,n){},250:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},252:function(t,e,n){"use strict";n(245)},253:function(t,e,n){"use strict";n.r(e);var i=n(266),s=n(255),r=n(239);function a(t,e){if("group"===e.type){const n=e.path&&Object(r.e)(t,e.path),i=e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(r.e)(t,e.path));return n||i}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:i.default,SidebarLink:s.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(r.e)(this.$route,t.regularPath)}}},l=n(14),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,i){return e("li",{key:i},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:i===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(i)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},254:function(t,e,n){"use strict";n.r(e);var i=n(241),s=n(242),r=n(91),a=n.n(r),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:s.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},255:function(t,e,n){"use strict";n.r(e);var i=n(239);function s(t,e,n,i,s){const r={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:i,"sidebar-link":!0}};return s>2&&(r.style={"padding-left":s+"rem"}),t("RouterLink",r,n)}function r(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(i.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,n+"#"+e.slug,e.title,u,e.level-1),r(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(i.e)(a,u.path),h="auto"===u.type?p||u.children.some(t=>Object(i.e)(a,u.basePath+"#"+t.slug)):p,d="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):s(t,u.path,u.title||u.path,h),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[d,r(t,u.children,u.basePath,a,f)];if((h||b)&&u.headers&&!i.d.test(u.path)){return[d,r(t,Object(i.c)(u.headers),u.path,a,f)]}return d}},o=(n(252),n(14)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},257:function(t,e,n){"use strict";n(247)},263:function(t,e,n){"use strict";n(250)},264:function(t,e,n){},265:function(t,e,n){"use strict";n.r(e);var i=n(254),s=n(239),r={name:"NavLinks",components:{NavLink:n(241).default,DropdownLink:i.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,i=this.$site.themeConfig.locales||{},s={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(s=>{const r=t[s],a=i[s]&&i[s].label||r.lang;let o;return r.lang===this.$lang?o=e:(o=e.replace(this.$localeConfig.path,s),n.some(t=>t.path===o)||(o=s)),{text:a,link:o}})};return[...this.userNav,s]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(s.j)(t),{items:(t.items||[]).map(s.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;nfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function v(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},246:function(t,e){t.exports=function(t){return null==t}},248:function(t,e,n){},249:function(t,e,n){},259:function(t,e,n){"use strict";n(248)},260:function(t,e,n){var r=n(11),i=n(4),a=n(10);t.exports=function(t){return"string"==typeof t||!i(t)&&a(t)&&"[object String]"==r(t)}},261:function(t,e,n){"use strict";n(249)},262:function(t,e,n){},267:function(t,e,n){"use strict";n.r(e);var r=n(246),i=n.n(r),a=n(239),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=i()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:r="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,r,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,r,i){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i+`?mode=edit&spa=0&at=${r}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}}},o=(n(259),n(14)),u=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=u.exports},268:function(t,e,n){"use strict";n.r(e);n(90);var r=n(239),i=n(260),a=n.n(i),s=n(246),o=n.n(s),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return l(c.PREV,this)},next(){return l(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function l(t,{$themeConfig:e,$page:n,$route:i,$site:s,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:l,getPageLinkConfig:p}=t,f=l(e),d=p(n),h=o()(d)?f:d;return!1===h?void 0:a()(h)?Object(r.k)(s.pages,h,i.path):c(n,u)}function p(t,e,n){const r=[];!function t(e,n){for(let r=0,i=e.length;rfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var i=n(239),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(14),a=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},242:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(243),n(14)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},247:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},254:function(t,e,n){"use strict";n.r(e);var i=n(241),r=n(242),s=n(91),a=n.n(s),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},257:function(t,e,n){"use strict";n(247)},265:function(t,e,n){"use strict";n.r(e);var i=n(254),r=n(239),s={name:"NavLinks",components:{NavLink:n(241).default,DropdownLink:i.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,i=this.$site.themeConfig.locales||{},r={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(r=>{const s=t[r],a=i[r]&&i[r].label||s.lang;let o;return s.lang===this.$lang?o=e:(o=e.replace(this.$localeConfig.path,r),n.some(t=>t.path===o)||(o=r)),{text:a,link:o}})};return[...this.userNav,r]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(r.j)(t),{items:(t.items||[]).map(r.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;n({placeholder:void 0}),watch:{$lang(e){this.update(this.options,e)},options(e){this.update(e,this.$lang)}},mounted(){this.initialize(this.options,this.$lang),this.placeholder=this.$site.themeConfig.searchPlaceholder||""},methods:{initialize(e,t){Promise.all([Promise.all([a.e(0),a.e(9)]).then(a.t.bind(null,306,7)),Promise.all([a.e(0),a.e(9)]).then(a.t.bind(null,307,7))]).then(([a])=>{a=a.default;const{algoliaOptions:i={}}=e;a(Object.assign({},e,{inputSelector:"#algolia-search-input",algoliaOptions:{...i,facetFilters:["lang:"+t].concat(i.facetFilters||[])},handleSelected:(e,t,a)=>{const{pathname:i,hash:n}=new URL(a.url),r=i.replace(this.$site.base,"/"),s=decodeURIComponent(n);this.$router.push(`${r}${s}`)}}))})},update(e,t){this.$el.innerHTML='',this.initialize(e,t)}}},n=(a(288),a(14)),r=Object(n.a)(i,(function(){var e=this._self._c;return e("form",{staticClass:"algolia-search-wrapper search-box",attrs:{id:"search-form",role:"search"}},[e("input",{staticClass:"search-query",attrs:{id:"algolia-search-input",placeholder:this.placeholder}})])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/14.09112e04.js b/assets/js/14.09112e04.js new file mode 100644 index 00000000..309cee7a --- /dev/null +++ b/assets/js/14.09112e04.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[14,21,25],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return h})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return b})),n.d(e,"j",(function(){return g}));n(90);const i=/#.*$/,r=/\.(md|html)$/,s=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(i,"").replace(r,"")}function l(t){return o.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",r=a(t);return s.test(r)?t:r+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return a(t.path)===a(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return h(n,e,i);if(Array.isArray(e))return Object.assign(h(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var i=n(239),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(14),o=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},242:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(243),n(14)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},254:function(t,e,n){"use strict";n.r(e);var i=n(241),r=n(242),s=n(91),o=n.n(s),a={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports}}]); \ No newline at end of file diff --git a/assets/js/15.2d87bde7.js b/assets/js/15.2d87bde7.js new file mode 100644 index 00000000..77d5618f --- /dev/null +++ b/assets/js/15.2d87bde7.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{239:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return o})),e.d(n,"i",(function(){return a})),e.d(n,"f",(function(){return u})),e.d(n,"g",(function(){return c})),e.d(n,"h",(function(){return p})),e.d(n,"b",(function(){return l})),e.d(n,"e",(function(){return f})),e.d(n,"k",(function(){return h})),e.d(n,"l",(function(){return d})),e.d(n,"c",(function(){return v})),e.d(n,"j",(function(){return b}));e(90);const r=/#.*$/,i=/\.(md|html)$/,o=/\/$/,a=/^[a-z]+:/i;function s(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return a.test(t)}function c(t){return/^mailto:/.test(t)}function p(t){return/^tel:/.test(t)}function l(t){if(u(t))return t;const n=t.match(r),e=n?n[0]:"",i=s(t);return o.test(i)?t:i+".html"+e}function f(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return s(t.path)===s(n)}function h(t,n,e){if(u(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const o=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return h(e,n,r);if(Array.isArray(n))return Object.assign(h(e,n[0],r),{title:n[1]});{const o=n.children||[];return 0===o.length&&n.path?Object.assign(h(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,initialOpenGroupIndex:n.initialOpenGroupIndex,children:o.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function g(t){const n=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function v(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},246:function(t,n){t.exports=function(t){return null==t}},249:function(t,n,e){},260:function(t,n,e){var r=e(11),i=e(4),o=e(10);t.exports=function(t){return"string"==typeof t||!i(t)&&o(t)&&"[object String]"==r(t)}},261:function(t,n,e){"use strict";e(249)},268:function(t,n,e){"use strict";e.r(n);e(90);var r=e(239),i=e(260),o=e.n(i),a=e(246),s=e.n(a),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return p(c.PREV,this)},next(){return p(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,n){return l(t,n,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,n){return l(t,n,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function p(t,{$themeConfig:n,$page:e,$route:i,$site:a,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:p,getPageLinkConfig:l}=t,f=p(n),h=l(e),d=s()(h)?f:h;return!1===d?void 0:o()(d)?Object(r.k)(a.pages,d,i.path):c(e,u)}function l(t,n,e){const r=[];!function t(n,e){for(let r=0,i=n.length;rfunction t(e,n,i,r=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},241:function(t,e,n){"use strict";n.r(e);var i=n(239),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},a=n(14),s=Object(a.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=s.exports},256:function(t,e,n){},269:function(t,e,n){"use strict";n(256)},280:function(t,e,n){"use strict";n.r(e);var i={name:"Home",components:{NavLink:n(241).default},computed:{data(){return this.$page.frontmatter},actionLink(){return{link:this.data.actionLink,text:this.data.actionText}}}},r=(n(269),n(14)),a=Object(r.a)(i,(function(){var t=this,e=t._self._c;return e("main",{staticClass:"home",attrs:{"aria-labelledby":null!==t.data.heroText?"main-title":null}},[e("header",{staticClass:"hero"},[t.data.heroImage?e("img",{attrs:{src:t.$withBase(t.data.heroImage),alt:t.data.heroAlt||"hero"}}):t._e(),t._v(" "),null!==t.data.heroText?e("h1",{attrs:{id:"main-title"}},[t._v("\n "+t._s(t.data.heroText||t.$title||"Hello")+"\n ")]):t._e(),t._v(" "),null!==t.data.tagline?e("p",{staticClass:"description"},[t._v("\n "+t._s(t.data.tagline||t.$description||"Welcome to your VuePress site")+"\n ")]):t._e(),t._v(" "),t.data.actionText&&t.data.actionLink?e("p",{staticClass:"action"},[e("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()]),t._v(" "),t.data.features&&t.data.features.length?e("div",{staticClass:"features"},t._l(t.data.features,(function(n,i){return e("div",{key:i,staticClass:"feature"},[e("h2",[t._v(t._s(n.title))]),t._v(" "),e("p",[t._v(t._s(n.details))])])})),0):t._e(),t._v(" "),e("Content",{staticClass:"theme-default-content custom"}),t._v(" "),t.data.footer?e("div",{staticClass:"footer"},[t._v("\n "+t._s(t.data.footer)+"\n ")]):e("Content",{staticClass:"footer",attrs:{"slot-key":"footer"}})],1)}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/17.3dbcb51f.js b/assets/js/17.3dbcb51f.js new file mode 100644 index 00000000..affb29da --- /dev/null +++ b/assets/js/17.3dbcb51f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return c})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return d})),n.d(e,"e",(function(){return p})),n.d(e,"k",(function(){return f})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return b}));n(90);const i=/#.*$/,r=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function c(t){return s.test(t)}function u(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function d(t){if(c(t))return t;const e=t.match(i),n=e?e[0]:"",r=o(t);return a.test(r)?t:r+".html"+n}function p(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return o(t.path)===o(e)}function f(t,e,n){if(c(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},246:function(t,e){t.exports=function(t){return null==t}},248:function(t,e,n){},259:function(t,e,n){"use strict";n(248)},267:function(t,e,n){"use strict";n.r(e);var i=n(246),r=n.n(i),a=n(239),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=r()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:i="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,i,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,i,r){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r+`?mode=edit&spa=0&at=${i}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}}},o=(n(259),n(14)),c=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=c.exports}}]); \ No newline at end of file diff --git a/assets/js/18.4c170722.js b/assets/js/18.4c170722.js new file mode 100644 index 00000000..07ed4beb --- /dev/null +++ b/assets/js/18.4c170722.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return o})),n.d(e,"g",(function(){return c})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return d})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return g})),n.d(e,"j",(function(){return m}));n(90);const r=/#.*$/,i=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function u(t){return decodeURI(t).replace(r,"").replace(i,"")}function o(t){return s.test(t)}function c(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function p(t){if(o(t))return t;const e=t.match(r),n=e?e[0]:"",i=u(t);return a.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return u(t.path)===u(e)}function d(t,e,n){if(o(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},245:function(t,e,n){},252:function(t,e,n){"use strict";n(245)},255:function(t,e,n){"use strict";n.r(e);var r=n(239);function i(t,e,n,r,i){const a={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(a.style={"padding-left":i+"rem"}),t("RouterLink",a,n)}function a(t,e,n,s,u,o=1){return!e||o>u?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const c=Object(r.e)(s,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,c,e.level-1),a(t,e.children,n,s,u,o+1)])}))}var s={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:s,$themeConfig:u,$themeLocaleConfig:o},props:{item:c,sidebarDepth:l}}){const p=Object(r.e)(s,c.path),f="auto"===c.type?p||c.children.some(t=>Object(r.e)(s,c.basePath+"#"+t.slug)):p,d="external"===c.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,c.path,c.title||c.path):i(t,c.path,c.title||c.path,f),h=[e.frontmatter.sidebarDepth,l,o.sidebarDepth,u.sidebarDepth,1].find(t=>void 0!==t),b=o.displayAllHeaders||u.displayAllHeaders;if("auto"===c.type)return[d,a(t,c.children,c.basePath,s,h)];if((f||b)&&c.headers&&!r.d.test(c.path)){return[d,a(t,Object(r.c)(c.headers),c.path,s,h)]}return d}},u=(n(252),n(14)),o=Object(u.a)(s,void 0,void 0,!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/19.2c90b27d.js b/assets/js/19.2c90b27d.js new file mode 100644 index 00000000..bb06f857 --- /dev/null +++ b/assets/js/19.2c90b27d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{302:function(t,s,a){t.exports=a.p+"assets/img/heapandstack.5e7d479c.png"},303:function(t,s,a){t.exports=a.p+"assets/img/destrcturing.1503f4e8.png"},304:function(t,s,a){t.exports=a.p+"assets/img/mapobject.7b1842a0.png"},342:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"⚪️-javascript-深い理解と実践"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-javascript-深い理解と実践"}},[t._v("#")]),t._v(" ⚪️ JavaScript 深い理解と実践")]),t._v(" "),s("h2",{attrs:{id:"🔶-reference-vs-primitive"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔶-reference-vs-primitive"}},[t._v("#")]),t._v(" 🔶 Reference vs Primitive")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://www.youtube.com/watch?v=9ooYYRLdg_g&t=102s",target:"_blank",rel:"noopener noreferrer"}},[t._v("Reference vs Primitive Values/ Types"),s("OutboundLink")],1)])]),t._v(" "),s("blockquote",[s("p",[t._v("In JavaScript, "),s("strong",[t._v("objects")]),t._v(" and "),s("strong",[t._v("arrays")]),t._v(" are examples of "),s("em",[t._v("reference")]),t._v(" types, which are distinct from "),s("strong",[t._v("primitive types")]),t._v(" like "),s("code",[t._v("strings")]),t._v("and "),s("code",[t._v("Boolean")]),t._v(", "),s("code",[t._v("numbers")]),t._v(", "),s("code",[t._v("undefined")]),t._v(", "),s("code",[t._v("Null")]),t._v(".")])]),t._v(" "),s("p",[s("img",{attrs:{src:a(302),alt:"heapandstack"}})]),t._v(" "),s("h3",{attrs:{id:"▫️-reference-types-in-javascript"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-reference-types-in-javascript"}},[t._v("#")]),t._v(" ▫️ "),s("strong",[t._v("Reference Types in JavaScript:")])]),t._v(" "),s("ul",[s("li",[s("p",[s("strong",[t._v("Objects and Arrays:")])]),t._v(" "),s("ul",[s("li",[t._v("Objects, like the "),s("code",[t._v("person")]),t._v(" object, are reference types.")]),t._v(" "),s("li",[t._v("They can hold properties with primitive values or other reference types.")]),t._v(" "),s("li",[t._v("Nesting of objects or arrays inside a reference type doesn't change its reference type nature.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Hobbies Array:")])]),t._v(" "),s("ul",[s("li",[t._v("The "),s("code",[t._v("hobbies")]),t._v(" array, though holding strings (primitive values), is a reference type.")]),t._v(" "),s("li",[t._v("Arrays in JavaScript are always considered reference types.")])])])]),t._v(" "),s("p",[s("strong",[t._v("Difference in Memory Management:")])]),t._v(" "),s("ul",[s("li",[s("p",[s("strong",[t._v("Memory Types:")])]),t._v(" "),s("ul",[s("li",[t._v("JavaScript uses two types of memory: The Stack and the Heap.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Stack Memory:")])]),t._v(" "),s("ul",[s("li",[t._v("The stack is easy-to-access memory, managing items in a stack-like structure.")]),t._v(" "),s("li",[t._v("Suitable for items with known sizes in advance (numbers, strings, booleans).")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Heap Memory:")])]),t._v(" "),s("ul",[s("li",[t._v("The heap is used for items with dynamic · s and structures, like objects and arrays.")]),t._v(" "),s("li",[t._v("Objects and arrays go into the heap since they can be mutated and change at runtime.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Pointer Mechanism:")])]),t._v(" "),s("ul",[s("li",[t._v("Each heap item has an exact address stored in a pointer.")]),t._v(" "),s("li",[t._v("The pointer, pointing at the item in the heap, is stored on the stack.")])])])]),t._v(" "),s("h3",{attrs:{id:"▫️-strange-behavior-of-reference-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-strange-behavior-of-reference-types"}},[t._v("#")]),t._v(' ▫️ Strange Behavior of "Reference Types"')]),t._v(" "),s("ul",[s("li",[t._v("What's actually stored in the person variable in the following snippet?\nb. "),s("code",[t._v("var person = { name: 'Max' }")])])]),t._v(" "),s("p",[t._v("It's b. A pointer to the person object is stored in the variable. The same would be the case for the hobbies array.")]),t._v(" "),s("ul",[s("li",[t._v("What does the following code spit out then?")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" person "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Max"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" newPerson "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" person"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nnewPerson"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Anna"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("person"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// What does this line print? 'Anna'")]),t._v("\n")])])]),s("ul",[s("li",[s("p",[s("strong",[t._v("Why?")])]),t._v(" "),s("ul",[s("li",[t._v("Because you never copied the person object itself to newPerson.")]),t._v(" "),s("li",[t._v("You only copied the pointer!")]),t._v(" "),s("li",[t._v("It still points at the same address in memory though. Hence changing "),s("code",[t._v("newPerson.name")]),t._v(" also changes "),s("code",[t._v("person.name")]),t._v(" because "),s("code",[t._v("newPerson")]),t._v(" points at the exactly same object!")])])])]),t._v(" "),s("h3",{attrs:{id:"▫️-how-to-copy-objects-and-arrays"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-how-to-copy-objects-and-arrays"}},[t._v("#")]),t._v(" ▫️ "),s("strong",[t._v("How to Copy Objects and Arrays:")])]),t._v(" "),s("p",[t._v("Now that we know that we only copy the pointer - how can we actually copy the value behind the pointer? The actual object or array?")]),t._v(" "),s("p",[t._v("You basically need to construct a new object or array and immediately fill it with the properties or elements of the old object or array.")]),t._v(" "),s("p",[t._v("You got multiple ways of doing this - also depending on which kind of JavaScript version you're using (during development).")]),t._v(" "),s("p",[t._v("Here are the two most popular approaches for arrays:")]),t._v(" "),s("ol",[s("li",[s("p",[t._v("Use the "),s("code",[t._v("slice()")]),t._v(" is a standard array method provided by JavaScript. You can check out its full documentation here.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" hobbies "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sports"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cooking"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" copiedHobbies "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" hobbies"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("p",[t._v("It basically returns a "),s("em",[t._v("new array")]),t._v(" which contains "),s("strong",[t._v("all elements of the old element")]),t._v(", starting at the starting index you passed (and then up to the max number of elements you defined). If you just call "),s("code",[t._v("slice()")]),t._v(", without arguments, you get a new array with all elements of the old array.")]),t._v(" "),s("ol",{attrs:{start:"2"}},[s("li",[s("p",[t._v("Use the spread operator\nIf you're using ES6+, you can use the spread operator.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" hobbies "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sports"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cooking"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" copiedHobbies "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("hobbies"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("p",[t._v("Here, you also create a new array (manually, by using "),s("code",[t._v("[]")]),t._v(") and you then use the spread operator "),s("code",[t._v("(...)")]),t._v('to "pull all elements of the old array out" and add them to the new array.')]),t._v(" "),s("p",[t._v("For objects")]),t._v(" "),s("ol",[s("li",[s("p",[t._v("You can use the Object.assign() syntax which is explained in greater detail here.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" person "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Max"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" copiedPerson "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("assign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" person"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("p",[t._v("This syntax creates a new object (the {} part) and assigns all properties of the old object (the second argument) to that newly created one. This creates a copy.")]),t._v(" "),s("ol",{attrs:{start:"2"}},[s("li",[s("p",[t._v("Just as with arrays, you can also use the spread operator on objects.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" person "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Max"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" copiedPerson "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("person "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("p",[t._v("This will also create a new object (because you used { }) and will then pull all properties of person out of it, into the brand-new objects.")]),t._v(" "),s("h2",{attrs:{id:"🔶-deconstruction-assignment"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔶-deconstruction-assignment"}},[t._v("#")]),t._v(" 🔶 Deconstruction Assignment")]),t._v(" "),s("blockquote",[s("p",[t._v("ES6 Practical Deep "),s("code",[t._v("Deconstruction Assignment Methods")]),t._v(" for Deconstructed "),s("code",[t._v("Objects")]),t._v(", "),s("code",[t._v("Arrays")]),t._v(", "),s("code",[t._v("Hybrid Deconstruction")]),t._v(", and "),s("code",[t._v("Continuous Deconstruction")])])]),t._v(" "),s("h3",{attrs:{id:"▫️-deconstructing-objects"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-deconstructing-objects"}},[t._v("#")]),t._v(" ▫️ "),s("strong",[t._v("Deconstructing Objects")])]),t._v(" "),s("p",[t._v("Without destructuring assignment, accessing the properties of an object or the elements of an array requires "),s("code",[t._v("dot notation")]),t._v(" or "),s("code",[t._v("bracket notation")]),t._v(":")]),t._v(" "),s("p",[t._v("1.1 "),s("strong",[t._v("basic deconstruction format")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" object "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"XXX"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("age")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" age "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("age"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// XXX 22")]),t._v("\n")])])]),s("p",[t._v("1.2 "),s("strong",[t._v("variable alias")])]),t._v(" "),s("blockquote",[s("p",[t._v("if you want to use a different variable name than the property name, you can use the following syntax:")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" object "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"XXX"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("age")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" myName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("age")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" myAge "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" myAge"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// XXX 22")]),t._v("\n")])])]),s("p",[t._v("1.3 "),s("strong",[t._v("default value")])]),t._v(" "),s("blockquote",[s("p",[t._v("if 目標對象屬性中沒有要解構的屬性,不指定默認值, 那麼將會是 undefined, 此時可以給要解構變量寫 default 值.")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" gender "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"female"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"XXX"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("age")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("此種為變量設置默認值的方法,常用與函數參數中,加入調用函數時沒傳遞參數,有可能會對函數運行造成錯誤,那就可以形參位置進行對象解構, 對變量指定默認值。")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fn")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'xxx'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// xxx 30")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"▫️-deconstructing-arrays"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-deconstructing-arrays"}},[t._v("#")]),t._v(" ▫️ "),s("strong",[t._v("Deconstructing Arrays")])]),t._v(" "),s("blockquote",[s("p",[t._v("解構數組和對象有些不同, 解構對象的時候屬性前後位置不影響, 但是解構數組,需要按照 index 順序解構")])]),t._v(" "),s("p",[t._v("2.1 "),s("strong",[t._v("basic deconstruction format")]),t._v("\nwithout destructuring assignment, accessing the properties of an object or the elements of an array requires "),s("code",[t._v("dot notation")]),t._v(" or "),s("code",[t._v("bracket notation")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" array "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"XXX"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" age "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// XXX 22")]),t._v("\n")])])]),s("p",[t._v("if with "),s("code",[t._v("deconstructing")]),t._v(" assignment, you can use the following syntax:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" array "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"XXX"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// XXX 22")]),t._v("\n")])])]),s("p",[t._v("🔻 Scenario 01: To destructure the nested "),s("code",[t._v("data")]),t._v(" object within the main "),s("code",[t._v("data")]),t._v(" property of a response object to get to the inner "),s("code",[t._v("data")]),t._v(" array.")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Assuming the response object is named `response`")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("innerData"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("innerData"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This will log the inner object represented by the {...} in your screenshot")]),t._v("\n")])])]),s("p",[t._v("This snippet assumes that "),s("code",[t._v("response")]),t._v(" is the name of the variable holding the entire object you've shown in your screenshot. The destructuring pattern "),s("code",[t._v("{ data: { data: [innerData] } }")]),t._v(" navigates through the object structure to the inner "),s("code",[t._v("data")]),t._v(" array and grabs the first item from that array, assigning it to the "),s("code",[t._v("innerData")]),t._v(" variable. If you want to access other properties at the same level, you can add them to the destructuring pattern accordingly.")]),t._v(" "),s("p",[s("img",{attrs:{src:a(303),alt:"destrcturing"}})]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("banner")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simulating the structure from your screenshot")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" db\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"banner-list"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("orderBy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sort"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"desc"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("limit")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Correct destructuring pattern based on the screenshot you provided")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This will log the first object from the data array")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("In this updated code, "),s("code",[t._v("response")]),t._v(" represents the object returned from the database query. The destructuring pattern "),s("code",[t._v("{ data: { data: [result] } }")]),t._v(" navigates through the first "),s("code",[t._v("data")]),t._v(" object and then the "),s("code",[t._v("data")]),t._v(" array to extract the first item of that array into the "),s("code",[t._v("result")]),t._v(" variable.")]),t._v(" "),s("p",[t._v("Please make sure that the "),s("code",[t._v("db.collection(...).get()")]),t._v(" method indeed returns an object with a structure similar to the one in your screenshot, with nested "),s("code",[t._v("data")]),t._v(" properties. If the structure is different, you'll need to adjust the destructuring pattern accordingly.")]),t._v(" "),s("h2",{attrs:{id:"🔶-arrow-function-の理解"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔶-arrow-function-の理解"}},[t._v("#")]),t._v(" 🔶 Arrow function の理解")]),t._v(" "),s("ol",[s("li",[s("strong",[t._v("只有一個參數的函數 (Arrow Function with a Single Parameter):")])])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("參數")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" 返回值"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 例如:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("x")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[s("p",[s("strong",[t._v("沒有參數或多個參數的函數 (Arrow Function with No or Multiple Parameters):")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 沒有參數時使用空的小括號")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" 返回值\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 多個參數時使用小括號括起來")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("參數"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" 參數"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" 返回值\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 例如:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" a "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" b\n")])])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("箭頭後面的值就是返回值 (Arrow Function Expression):")])]),t._v(" "),s("ul",[s("li",[t._v("返回值必須是一個表達式。什麼叫表達式?有返回值的語句就是表達式。")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("如果返回值是一個對象,需要用括號包起來 (Object as Return Value):")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("key")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("li",[s("p",[t._v("如果需要在 arrow function 裡定義邏輯, 可以直接在箭頭後跟一個代碼塊,代碼塊中的語法和普通函數沒有區別。")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("參數"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" 參數"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 邏輯")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" 返回值"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("h2",{attrs:{id:"🔶-キーワード-this-の理解"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔶-キーワード-this-の理解"}},[t._v("#")]),t._v(' 🔶 キーワード "this "の理解')]),t._v(" "),s("ul",[s("li",[s("p",[s("a",{attrs:{href:"https://qiita.com/suin/items/a44825d253d023e31e4d",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaScript: 通常の関数とアロー関数の違いは「書き方だけ」ではない。異なる性質が 10 個ほどある"),s("OutboundLink")],1)])]),t._v(" "),s("li",[s("p",[s("a",{attrs:{href:"https://qiita.com/10mi8o/items/2da84ab650f4caffdeea",target:"_blank",rel:"noopener noreferrer"}},[t._v("アロー関数が便利な理由と使いどころ"),s("OutboundLink")],1)])])]),t._v(" "),s("h3",{attrs:{id:"アロー関数で書く理由-1-関数を短く書きたい"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#アロー関数で書く理由-1-関数を短く書きたい"}},[t._v("#")]),t._v(" アロー関数で書く理由 ① 関数を短く書きたい")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//アロー関数")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("arrowAddFunc")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//1個しか評価項目が無い場合は以下のようにも書ける")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//中括弧とreturnの省略が出来る")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("arrowAddFunc")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" a "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//評価項目が1個だけ、かつ引数が1個しか無い場合はこのようにも書ける")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//括弧も省略できる")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("arrowDoubleFunc")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("a")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("省略して、1行で書ける事も出来ますが、アロー関数を書き慣れていない人がパッと見た時に、やや分かりづらいかもしれません。必ずしも1行で書かなければいけない理由はありません。いずれにしろ、 function をいちいち書く必要がなく、短く書く事が出来ます。しかしアロー関数の真価は this を束縛しないという点にあるでしょう。")]),t._v(" "),s("h3",{attrs:{id:"アロー関数で書く理由-2-this-を束縛しない"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#アロー関数で書く理由-2-this-を束縛しない"}},[t._v("#")]),t._v(" アロー関数で書く理由 ② this を束縛しない")]),t._v(" "),s("p",[t._v("アロー関数で短く書けます!と説明されても、へーそうなんだ。。。で終わると思いますが、アロー関数を使う上でちゃんと理解しておきたいのは、こちらの方かと思います。")]),t._v(" "),s("p",[t._v("それは、this の値は関数定義時に決まる(=this を束縛しない) というルールです。\nthis を束縛しない、という説明はやや分かりづらいので、ここでは、アロー関数を使えば、this の値は関数定義時に決める事ができる、という理解で大丈夫でしょう。")]),t._v(" "),s("p",[t._v("JavaScript で this を扱う時、最初は分かりづらい...直感的でない...という事は、JavaScript を書いてる方なら、分かって頂けるかなと思います。this の呼び出しパターンにはいくつかあるのですが、ここでは、アロー関数を使うメリットを説明する上で、メソッド呼び出しパターンと関数呼び出しパターンを事前に例として挙げておきます。this を理解する上で大切なのは、呼び出し元が何であるかという事です。まずはメソッド呼び出しパターンから説明します。")]),t._v(" "),s("h3",{attrs:{id:"メソッド呼び出しパターン"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#メソッド呼び出しパターン"}},[t._v("#")]),t._v(" メソッド呼び出しパターン")]),t._v(" "),s("p",[t._v("以下のコードを実際に打ち込んで、console.log で確認してみましょう。")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" object "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("value")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("method1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//①何が返されるでしょう?")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("method2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//②何が返されるでしょう?")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//① thisはobject自身を参照している")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("method1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//{ value: 'test', method: [Function: method] }")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//② thisはobject自身を参照しているので、valueプロパティにもアクセスできる")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("method2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// test")]),t._v("\n")])])]),s("h2",{attrs:{id:"🔶-キーワード-class-の理解"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔶-キーワード-class-の理解"}},[t._v("#")]),t._v(' 🔶 キーワード "class"の理解')]),t._v(" "),s("h3",{attrs:{id:"class-の-基本概念"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#class-の-基本概念"}},[t._v("#")]),t._v(" Class の 基本概念")]),t._v(" "),s("p",[t._v("A class is a "),s("strong",[t._v("template")]),t._v(" for an object that defines its "),s("code",[t._v("properties")]),t._v(" and "),s("code",[t._v("methods")]),t._v(". In JavaScript, classes can be defined using the "),s("code",[t._v("class")]),t._v(" keyword.")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyClass")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// class of constructor functions that are called when the instance is created.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("constructor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// In a constructor function, this points to the instance object.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 類的實例方法")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("myMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// In the method, this still points to the instance object.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 類的靜態方法")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("myStaticMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// In static methods, this points to the class itself.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Examples of Creation")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" myInstance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyClass")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Calling Example Methods")]),t._v("\nmyInstance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("myMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Calling the static method")]),t._v("\nMyClass"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("myStaticMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"strict-mode-class"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#strict-mode-class"}},[t._v("#")]),t._v(" Strict mode && Class")]),t._v(" "),s("ul",[s("li",[t._v("All code in the class is executed in strict mode")]),t._v(" "),s("li",[t._v("In strict mode, when a function is called in the global context, this is no longer a global object (usually a window), but is undefined.")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"use strict"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyClass")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("constructor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在構造函數中,this 仍然指向實例對象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("myMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在方法中,this 仍然指向實例對象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("myStaticMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在靜態方法中,this 是指向類本身")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 創建類的實例")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" myInstance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyClass")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 調用實例方法")]),t._v("\nmyInstance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("myMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 調用靜態方法")]),t._v("\nMyClass"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("myStaticMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在全局上下文中,調用函數(不是在類中)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("globalFunction")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在嚴格模式下,全局上下文中的 this 將是 undefined")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在嚴格模式下,全局上下文中的 this 將是 undefined")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("globalFunction")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"箭頭函數在-class-中的影響"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#箭頭函數在-class-中的影響"}},[t._v("#")]),t._v(" 箭頭函數在 Class 中的影響")]),t._v(" "),s("ul",[s("li",[t._v("如果類中的方法是以箭頭函數定義的,則方法中的 this 將指向類的實例對象。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyClass")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("myArrowMethod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在箭頭函數中,this 指向類的實例對象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" myInstance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyClass")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmyInstance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("myArrowMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 調用箭頭函數方法")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("この形式の書き方は、アロー関数内の this が常にクラスのインスタンスオブジェクトを指すようにし、関数の呼び出し方法の影響を受けないように確保します。")])]),t._v(" "),s("h3",{attrs:{id:"クラスの継承"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#クラスの継承"}},[t._v("#")]),t._v(" クラスの継承")]),t._v(" "),s("ul",[s("li",[t._v("継承を使用すると、クラス内のプロパティやメソッドを利用でき、さらに新しいプロパティやメソッドをサブクラスに追加できます。")]),t._v(" "),s("li",[t._v("extends を使用してクラスを継承し、継承後はまるでそのクラスのコードが現在のクラスにコピーされたかのようになります。")]),t._v(" "),s("li",[t._v("親クラスのメソッドを上書きすることができますが、親クラスのメソッドは上書きされず、サブクラスに同じ名前のメソッドが追加されます。")])]),t._v(" "),s("blockquote",[s("p",[t._v("サブクラスで親クラスのコンストラクタを上書きする場合、サブクラスのコンストラクタ内で super() を呼び出さなければなりません。そうしないとエラーが発生します。")])]),t._v(" "),s("h2",{attrs:{id:"🔶-static-properties-and-static-methods-in-classes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔶-static-properties-and-static-methods-in-classes"}},[t._v("#")]),t._v(" 🔶 Static Properties and Static Methods in Classes")]),t._v(" "),s("p",[t._v("...待補充")]),t._v(" "),s("h2",{attrs:{id:"🔷-array-主なメソッド"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-array-主なメソッド"}},[t._v("#")]),t._v(" 🔷 Array 主なメソッド")]),t._v(" "),s("blockquote",[s("p",[s("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array",target:"_blank",rel:"noopener noreferrer"}},[t._v("Standard built-in objects-Array"),s("OutboundLink")],1)])]),t._v(" "),s("h3",{attrs:{id:"▫️-array-prototype-push"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-array-prototype-push"}},[t._v("#")]),t._v(" ▫️ Array.prototype.push()")]),t._v(" "),s("h3",{attrs:{id:"▫️array-prototype-from"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️array-prototype-from"}},[t._v("#")]),t._v(" ▫️Array.prototype.from()")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("用途")]),t._v(":從具有長度屬性的對象或可迭代對象創建數組。")]),t._v(" "),s("li",[s("strong",[t._v("示例")]),t._v(":")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" filledArray "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("length")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("hello")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"goodbye"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"▫️array-prototype-fill"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️array-prototype-fill"}},[t._v("#")]),t._v(" ▫️Array.prototype.fill()")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("用途")]),t._v(":填充數組的每個元素為相同的值。")]),t._v(" "),s("li",[s("strong",[t._v("示例")]),t._v(":"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" filledArray "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fill")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("li",[s("strong",[t._v("特點")]),t._v(":適用於不可變值(如數字、字符串、布爾值)。")]),t._v(" "),s("li",[s("strong",[t._v("問題")]),t._v(":用於對象時,填充的是對同一對象的引用。"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" filledArray "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fill")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("hello")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"goodbye"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"填充唯一對象"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#填充唯一對象"}},[t._v("#")]),t._v(" 填充唯一對象")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("方法")]),t._v(":結合 "),s("code",[t._v("fill")]),t._v(" 和 "),s("code",[t._v("map")]),t._v("。"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" filledArray "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fill")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("hello")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"goodbye"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("li",[s("strong",[t._v("特點")]),t._v(":創建具有唯一對象引用的數組。")]),t._v(" "),s("li",[s("strong",[t._v("注意")]),t._v(":"),s("code",[t._v("map")]),t._v(" 方法可能對大數據集來說代價昂貴。")])]),t._v(" "),s("h3",{attrs:{id:"使用-for-循環"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#使用-for-循環"}},[t._v("#")]),t._v(" 使用 for 循環")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("方法")]),t._v(":傳統的 for 循環。"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" filledArray "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n filledArray"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("hello")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"goodbye"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])]),t._v(" "),s("li",[s("strong",[t._v("特點")]),t._v(":避免了使用 "),s("code",[t._v("map")]),t._v(" 方法。")])]),t._v(" "),s("h3",{attrs:{id:"使用展開語法"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#使用展開語法"}},[t._v("#")]),t._v(" 使用展開語法 (...)")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("方法")]),t._v(":結合展開語法和 "),s("code",[t._v("map")]),t._v("。"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" filledArray "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'hello'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'goodbye'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("li",[s("strong",[t._v("特點")]),t._v(":避免使用 "),s("code",[t._v("fill")]),t._v(",但仍使用 "),s("code",[t._v("map")]),t._v("。")])]),t._v(" "),s("h3",{attrs:{id:"🔸-array-prototype-map"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-array-prototype-map"}},[t._v("#")]),t._v(" 🔸 Array.prototype.map()")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map",target:"_blank",rel:"noopener noreferrer"}},[t._v("Array.prototype.map()\n"),s("OutboundLink")],1)]),t._v(" "),s("ul",[s("li",[t._v("map() メソッドは、新しい配列を作成し、元の配列の各要素をコールバック関数で処理した結果を含みます。")]),t._v(" "),s("li",[t._v("コールバック関数が必要で、その戻り値が新しい配列内の各要素になります。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" array "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// マップに関数を渡す")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("item")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" item "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 回調函數中會出現三個參數:當前元素、當前索引和原始數組。")]),t._v("\nresult "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("currentValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" thisArg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 期待される出力: Array [2, 8, 18, 32]")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("使用シーン:ウェブページで配列を表示し、各配列要素にはラベルが必要な場合。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" fruits "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"banana"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"orange"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fruits"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("fruit")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("

  • ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("fruit"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("
  • ")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("🔻 使用シナリオ")]),t._v(" "),s("p",[s("strong",[t._v("例子 1:使用 "),s("code",[t._v("get")]),t._v(" 方法获取 Map 中的值")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" userPreferences "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 添加用户喜好设置")]),t._v("\nuserPreferences"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"theme"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dark"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nuserPreferences"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"language"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"en"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取特定键的值")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" theme "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" userPreferences"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"theme"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("theme"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 'dark'")]),t._v("\n")])])]),s("p",[s("strong",[t._v("例子 2:使用 "),s("code",[t._v("set")]),t._v(" 方法添加或更新 Map 中的键值对")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" userData "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 添加用户数据")]),t._v("\nuserData"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"user123"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nuserData"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"email"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"user@example.com"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 更新用户数据")]),t._v("\nuserData"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"email"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newuser@example.com"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("例子 3:使用 "),s("code",[t._v("has")]),t._v(" 方法检查 Map 中是否存在键")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" userPermissions "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 检查是否存在特定权限")]),t._v("\nuserPermissions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nuserPermissions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"editor"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("userPermissions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("has")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"用户是管理员"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"用户不是管理员"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[s("strong",[t._v("例子 4:使用 "),s("code",[t._v("delete")]),t._v(" 方法从 Map 中删除键值对")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" dataStore "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 添加数据")]),t._v("\ndataStore"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndataStore"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 删除数据")]),t._v("\ndataStore"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("delete")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("例子 5:使用 "),s("code",[t._v("size")]),t._v(" 属性获取 Map 的大小")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" cartItems "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 添加购物车商品")]),t._v("\ncartItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"item1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Product A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("price")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ncartItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"item2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Product B"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("price")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取购物车商品数量")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemCount "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cartItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("size"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("购物车中有 ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("itemCount"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" 件商品")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("例子 6:使用 "),s("code",[t._v("forEach")]),t._v(" 方法迭代 Map 中的键值对")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" userRoles "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 添加用户角色")]),t._v("\nuserRoles"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"user123"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"user"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nuserRoles"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin456"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 遍历用户角色")]),t._v("\nuserRoles"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("role"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" username")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("username"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" 的角色是 ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("role"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("例子 7:使用 "),s("code",[t._v("keys")]),t._v(" 方法获取 Map 中的所有键")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" menuItems "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 添加菜单项")]),t._v("\nmenuItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"home"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Home Page"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmenuItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"about"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"About Us"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmenuItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"contact"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Contact Us"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取所有菜单项的键")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" menuItemKeys "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("menuItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("keys")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("menuItemKeys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 ['home', 'about', 'contact']")]),t._v("\n")])])]),s("h3",{attrs:{id:"▫️-array-prototype-filter"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-array-prototype-filter"}},[t._v("#")]),t._v(" ▫️ Array.prototype.filter()")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("filter()")]),t._v(" メソッドは、指定された関数によって評価された元の配列の要素から構成される新しい配列を作成します。\n"),s("ul",[s("li",[t._v("配列から条件に合致する要素を取得できます。")]),t._v(" "),s("li",[t._v("コールバック関数の結果に基づいて、要素の保持または削除が決まります。結果が true なら保持し、false なら削除します。")])])])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" array "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("item")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" item "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//代碼處理邏輯: number%2 === 0 ? true : false 如果返回true,就留,否則就不留")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// expected output: Array [2, 4]")]),t._v("\n")])])]),s("h3",{attrs:{id:"▫️-array-prototype-find"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-array-prototype-find"}},[t._v("#")]),t._v(" ▫️ Array.prototype.find()")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("find()")]),t._v(" メソッドは、与えられたテスト関数を満たす配列内の最初の要素の値を返します。そうでなければ、"),s("code",[t._v("undefined")]),t._v(" を返します。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" array "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("130")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("44")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" found "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("element")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" element "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("found"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// expected output: 12")]),t._v("\n")])])]),s("h3",{attrs:{id:"▫️-array-prototype-reduce"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-array-prototype-reduce"}},[t._v("#")]),t._v(" ▫️ "),s("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#syntax",target:"_blank",rel:"noopener noreferrer"}},[t._v("Array.prototype.reduce()"),s("OutboundLink")],1)]),t._v(" "),s("ul",[s("li",[s("p",[s("code",[t._v("reduce()")]),t._v(" メソッドは、アキュムレータと配列の各要素(左から右へ)をコールバック関数に渡し、配列を単一の値にまとめます。")]),t._v(" "),s("ul",[s("li",[t._v("配列の各要素に対して、コールバック関数を実行します。")]),t._v(" "),s("li",[t._v("コールバック関数の戻り値をアキュムレータに代入します。")]),t._v(" "),s("li",[t._v("reduce() メソッドは、関数をアキュムレータとして受け取り、配列の各値を(左から右へ)最終値まで縮小していきます。")]),t._v(" "),s("li",[t._v("配列の要素が結合され、値が返されます。")])])])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" array1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 0 + 1 + 2 + 3 + 4")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" initialValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" sumWithInitial "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" array1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("accumulator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" currentValue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" accumulator "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" currentValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n initialValue\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sumWithInitial"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Expected output: 10")]),t._v("\n")])])]),s("p",[t._v("🔺 応用シナリオ")]),t._v(" "),s("ol",[s("li",[t._v("Calculating "),s("em",[t._v("Total Amount")]),t._v(" in a Shopping Cart\nSuppose you have a shopping cart application, where each item has a price and quantity, and you want to calculate the total amount.")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" cart "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("item")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("price")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("quantity")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("item")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Banana"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("price")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("quantity")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("item")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Orange"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("price")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("quantity")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"▫️-array-prototype-foreach"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-array-prototype-foreach"}},[t._v("#")]),t._v(" ▫️ Array.prototype.forEach()")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("forEach()")]),t._v(" メソッドは、与えられた関数を配列の各要素に対して一度ずつ実行します。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" array "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\narray"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("item")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// expected output: 1")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"🔷-object-method"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-object-method"}},[t._v("#")]),t._v(" 🔷 Object method")]),t._v(" "),s("h3",{attrs:{id:"▫️object-defineproperties"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️object-defineproperties"}},[t._v("#")]),t._v(" ▫️Object.defineProperties")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//使用 Object.defineProperties")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//創建和配置對象屬性: Object.defineProperties 被用來在 obj 對象上定義兩個屬性 a 和 b。這些屬性被配置為有特定值(分別為 1 和 2),並且是可枚舉的(enumerable: true)。")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//屬性值和可枚舉性: 設置 value 來指定屬性的值,並通過 enumerable 標記屬性是否應該出現在對象的枚舉屬性中。")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("defineProperties")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("a")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("value")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("enumerable")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("b")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("value")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("enumerable")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"▫️-object-entries"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-object-entries"}},[t._v("#")]),t._v(" ▫️ Object.entries()")]),t._v(" "),s("ul",[s("li",[t._v("使用 Object.entries(obj) 將 obj 對象轉換為一個鍵值對的數組(二維數組)。每個子數組包含一個鍵和對應的值。")]),t._v(" "),s("li",[t._v("返回值:给定对象自己的"),s("code",[t._v("可枚举")]),t._v("字符串键控属性键值对的数组。每个键值对都是一个包含"),s("strong",[t._v("两个元素的数组")]),t._v(":第一个元素是属性键(始终是字符串),第二个元素是属性值。")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" object "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("a")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"someString"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("b")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("42")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" testArr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("testArr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('//遍歷鍵值對列表: 使用 for...of 循環遍歷 Object.entries(obj) 返回的鍵值對列表,並打印每個鍵和對應的值。 `new Map([["a", 1], ["b", 2]])` 創建了一個包含兩個鍵值對的 Map 對象。')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("k"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" v"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" testArr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("k"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" v"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//用map方法將鍵值對列表轉換成map類型的數據: 通過將鍵值對的數組傳遞給 Map 的構造函數來創建一個新的 Map 對象。")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" m "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ul",[s("li",[s("strong",[t._v("應用 1")]),t._v(": Converting an Object to a Map:\n"),s("ul",[s("li",[t._v("The Map() constructor accepts an iterable of entries. With Object.entries, you can easily convert from Object to Map:")])])])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("baz")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("42")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" map "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("map"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// Map(2) {"foo" => "bar", "baz" => 42}')]),t._v("\n")])])]),s("ul",[s("li",[s("strong",[t._v("應用 2")]),t._v(": Iterating through an Object")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using for...of loop")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("a")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("b")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("c")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "a 5", "b 7", "c 9"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using array methods")]),t._v("\nObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "a 5", "b 7", "c 9"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"▫️-object-fromentries"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-object-fromentries"}},[t._v("#")]),t._v(" ▫️ Object.fromEntries()")]),t._v(" "),s("ul",[s("li",[t._v("Object.fromEntries() 是 Object.entries() 的逆操作,作用是将一个键值对数组转化为對象,返回的是"),s("strong",[t._v("新對象,不改变原对象")]),t._v("。")]),t._v(" "),s("li",[t._v("只是 Object.entries() 只返回字符串键属性,而 Object.fromEntries() 还可以创建符号键属性。")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromEntries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ul",[s("li",[t._v("也可以传入一个 Map 将其转为对象")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" map "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromEntries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("map"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("code",[t._v("Object.fromEntries()")]),t._v("實際應用:")]),t._v(" "),s("ol",[s("li",[t._v("過濾屬性")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("keys")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromEntries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("includes")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("table")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oli"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("age")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"12"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("這個 "),s("code",[t._v("foo")]),t._v(" 函數接受一個對象和一系列鍵作為參數,然後返回一個新的對象,其中只包含指定的鍵及其相應的值。具體來說:")]),t._v(" "),s("ol",[s("li",[s("p",[s("code",[t._v("Object.entries(obj)")]),t._v(" 會將 "),s("code",[t._v("obj")]),t._v(" 轉換為一個二維數組,每個內部數組包含一對鍵值(例如 "),s("code",[t._v("[['name', 'oli'], ['age', '12']]")]),t._v(")。")])]),t._v(" "),s("li",[s("p",[s("code",[t._v(".filter(([key]) => keys.includes(key))")]),t._v(" 會過濾這個數組,只保留那些鍵存在於 "),s("code",[t._v("keys")]),t._v(" 參數中的鍵值對。")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("Object.fromEntries()")]),t._v(" 將過濾後的二維數組轉回為對象。")])])]),t._v(" "),s("p",[t._v("在您的例子中,調用 "),s("code",[t._v('foo({ name: "oli", age: "12" }, "name")')]),t._v(" 會返回一個只包含 "),s("code",[t._v("name")]),t._v(" 鍵和其對應值的新對象。因此,這個函數調用的輸出將是:")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oli"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[s("code",[t._v("console.table")]),t._v(" 會以表格的形式在控制台輸出這個對象,顯示 "),s("code",[t._v("name")]),t._v(" 這一列及其對應的值 "),s("code",[t._v("oli")]),t._v("。")]),t._v(" "),s("ol",{attrs:{start:"2"}},[s("li",[t._v("将 url 查询字符串转为对象")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("query "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromEntries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("URLSearchParams")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo=bar&baz=qux"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("🔻 應用 1: 使用 "),s("code",[t._v("Object.entries")]),t._v(" 和 "),s("code",[t._v("Object.fromEntries")]),t._v(" 的代碼例子")]),t._v(" "),s("p",[s("strong",[t._v("例子 1:将对象转换为 Map 并操作数据")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("a")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("b")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("c")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 使用Object.entries将对象转换为Map")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" map "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在Map上进行数据操作")]),t._v("\nmap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"d"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("delete")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 使用Object.fromEntries将Map转换回对象")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" newObj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromEntries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("map"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newObj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 { a: 1, c: 3, d: 4 }")]),t._v("\n")])])]),s("p",[s("strong",[t._v("例子 2:将路由参数对象转换为 Map 并重新映射键名")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" routeParamsObj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("userId")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("actionType")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"edit"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 使用Object.entries将路由参数对象转换为Map")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" routeParamsMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("routeParamsObj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 重新映射键名")]),t._v("\nrouteParamsMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" routeParamsMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"userId"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nrouteParamsMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("delete")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"userId"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 使用Object.fromEntries将Map转换回路由参数对象")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" newRouteParamsObj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromEntries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("routeParamsMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newRouteParamsObj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 { id: 123, actionType: 'edit' }")]),t._v("\n")])])]),s("p",[t._v("这些示例演示了如何使用 "),s("code",[t._v("Object.entries")]),t._v(" 和 "),s("code",[t._v("Object.fromEntries")]),t._v(" 来进行对象和 Map 之间的转换,并对数据进行操作和重映射。")]),t._v(" "),s("p",[t._v("🔻 應用 2: 將對象轉換為 Map")]),t._v(" "),s("p",[t._v("當將对象转换为 Map 时,有许多应用场景,以下是其中一些示例:")]),t._v(" "),s("ol",[s("li",[s("strong",[t._v("API 响应数据解析:")]),t._v(" 当从 API 获取数据时,通常以 JSON 对象的形式返回。将 JSON 对象转换为 Map 可以更容易地提取和操作所需的数据字段。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiResponse "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"John"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("age")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" dataMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("apiResponse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 'John'")]),t._v("\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[s("strong",[t._v("表单数据处理:")]),t._v(" 在 Web 应用程序中,用户提交的表单数据通常作为对象传输。将表单数据转换为 Map 可以更容易地验证、操作和处理这些数据。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" formData "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("username")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"user123"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("email")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"user@example.com"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" formDataMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("formData"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("formDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"email"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 'user@example.com'")]),t._v("\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[s("strong",[t._v("路由参数:")]),t._v(" 在一些 Web 框架中,路由参数可能作为对象传递给控制器或路由处理程序。将路由参数转换为 Map 可以更方便地访问它们。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" routeParams "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("action")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"edit"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" routeParamsMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("routeParams"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("routeParamsMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 123")]),t._v("\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[s("strong",[t._v("配置管理:")]),t._v(" 在应用程序中,通常需要存储和管理配置数据。将配置对象转换为 Map 可以提供更好的配置管理和访问。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" config "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("apiKey")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"your-api-key"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("apiUrl")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://api.example.com"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" configMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("configMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apiUrl"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 'https://api.example.com'")]),t._v("\n")])])]),s("ol",{attrs:{start:"5"}},[s("li",[s("strong",[t._v("数据转换和处理:")]),t._v(" 在某些情况下,需要对数据进行转换或处理,例如将对象中的某些字段重新映射到新的键。将对象转换为 Map 可以帮助执行这些操作。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" person "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("first_name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"John"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("last_name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Doe"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" personMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("entries")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("person"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\npersonMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"full_name"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("personMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"first_name"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("personMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"last_name"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("personMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"full_name"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 'John Doe'")]),t._v("\n")])])]),s("h3",{attrs:{id:"▫️-object-assign"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-object-assign"}},[t._v("#")]),t._v(" ▫️ Object.assign()")]),t._v(" "),s("h3",{attrs:{id:"▫️-object-create"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-object-create"}},[t._v("#")]),t._v(" ▫️ Object.create()")]),t._v(" "),s("p",[t._v("Reference:\n"),s("a",{attrs:{href:"https://juejin.cn/post/6844903789938360333#heading-0",target:"_blank",rel:"noopener noreferrer"}},[t._v("Object.fromEntries"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"data-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#data-structure"}},[t._v("#")]),t._v(" Data Structure")]),t._v(" "),s("h3",{attrs:{id:"object-和-map-區別"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#object-和-map-區別"}},[t._v("#")]),t._v(" Object 和 Map 區別")]),t._v(" "),s("p",[t._v("共同點: Object 和 Map 都允許你按鍵存取一個值、刪除鍵、檢查一個鍵是否存在、以及迭代其餘的鍵。")]),t._v(" "),s("ol",[s("li",[t._v("構造方法的不同")])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("Object 的构造方法:"),s("code",[t._v("Object")]),t._v("可以使用对象字面量的方式创建,也可以使用"),s("code",[t._v("new Object()")]),t._v("或"),s("code",[t._v("Object.create(null)")]),t._v("来创建。")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("key1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("key2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//構造方法")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ojb2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("li",[s("p",[t._v("Map 的构造方法:Map 需要使用"),s("code",[t._v("new Map()")]),t._v("的方式来创建,也可以通过传入一个包含键值对的数组来初始化。")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" map "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" map "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("ol",{attrs:{start:"2"}},[s("li",[t._v("value 的類型的不同")])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("Object: 鍵類型必須是 String 或者 Symbol,如果是非 String 類型,會進行數據類型轉換,轉換成 String 類型,再進行操作。")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Symbol")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value5"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// {1: "value1", true: "value2", undefined: "value3", null: "value4", Symbol(): "value5"}')]),t._v("\n")])])])])]),t._v(" "),s("p",[s("img",{attrs:{src:a(304),alt:"mapobject"}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("Map: 鍵類型可以是任意類型,包括原始類型和引用類型, 不會進行數據類型轉換。 在添加鍵值對時, 會通過 === 來判斷鍵是否相等。")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" map "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'a'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Symbol")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value5"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("map"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// Map(5) {1 => "value1", true => "value2", undefined => "value3", null => "value4", Symbol() => "value5"}')]),t._v("\n")])])])])]),t._v(" "),s("ol",{attrs:{start:"3"}},[s("li",[t._v("鍵的順序")])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("Object")]),t._v(" "),s("ul",[s("li",[t._v("key 是無序的, 不會按照添加的順序返回。 1.對於>=0 的整數, 會按照大小排序。對於小數和負數, 會當作字符串處理。")]),t._v(" "),s("li",[t._v("對於字符串, 會按照定義的順序輸出")]),t._v(" "),s("li",[t._v("symbol 類型,會直接過濾掉,不會進行輸出。如果想輸出, 需要使用"),s("code",[t._v("Object.getOwnPropertySymbols")]),t._v("方法。")])])]),t._v(" "),s("li",[s("p",[t._v("Maps")]),t._v(" "),s("ul",[s("li",[t._v("key 是有序的, 會按照添加的順序返回。")]),t._v(" "),s("li",[t._v("key 可以是任意類型, 包括原始類型和引用類型。")]),t._v(" "),s("li",[t._v("key 的比較是"),s("code",[t._v("===")]),t._v(", 即使是兩個看起來一樣的數字, 也會被認為是不同的鍵。")]),t._v(" "),s("li",[s("code",[t._v("size")]),t._v(" 屬性可以獲取 Map 的大小。")])])])]),t._v(" "),s("ol",{attrs:{start:"4"}},[s("li",[t._v("鍵值對的訪問")])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("Object")]),t._v(" "),s("ul",[s("li",[t._v("添加或者修改屬性, 通過 點或者中括號的方式訪問。")]),t._v(" "),s("li",[t._v("判斷屬性是否存在, 通過 "),s("code",[t._v("in")]),t._v(" 或者 "),s("code",[t._v("hasOwnProperty")]),t._v("方法。")]),t._v(" "),s("li",[t._v("刪除屬性, 通過 "),s("code",[t._v("delete")]),t._v(" 操作符。")])])]),t._v(" "),s("li",[s("p",[t._v("Map")]),t._v(" "),s("ul",[s("li",[t._v("添加或者修改屬性, 通過"),s("code",[t._v("set")]),t._v("方法。")]),t._v(" "),s("li",[t._v("判斷屬性是否存在, 通過"),s("code",[t._v("has")]),t._v("方法。")]),t._v(" "),s("li",[t._v("刪除屬性, 通過"),s("code",[t._v("delete")]),t._v("方法。")]),t._v(" "),s("li",[s("code",[t._v("get")]),t._v(" 方法可以獲取屬性值。")]),t._v(" "),s("li",[s("code",[t._v("clear")]),t._v(" 方法可以清空所有屬性。")]),t._v(" "),s("li",[t._v("通過"),s("code",[t._v("keys")]),t._v("方法可以獲取所有的 key。")]),t._v(" "),s("li",[t._v("通過"),s("code",[t._v("values")]),t._v("方法可以獲取所有的 value。")]),t._v(" "),s("li",[t._v("通過"),s("code",[t._v("entries")]),t._v("方法可以獲取所有的 key value。")])])])]),t._v(" "),s("ol",{attrs:{start:"5"}},[s("li",[t._v("迭代")])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("Object")]),t._v(" "),s("ul",[s("li",[t._v("不具備 Iterator 特性,無法使用 for...of 循環迭代。")])])]),t._v(" "),s("li",[s("p",[t._v("Map")]),t._v(" "),s("ul",[s("li",[t._v("具備 Iterator 特性,可以使用 for...of 循環迭代。")])])])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" map "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" map"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("v")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("alue"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "key1 value1", "key2 value2"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("ol",{attrs:{start:"6"}},[s("li",[s("code",[t._v("JSON.stringify()")]),t._v(" 轉換")])]),t._v(" "),s("ul",[s("li",[s("code",[t._v("Map")]),t._v(" 類型的數據無法使用 "),s("code",[t._v("JSON.stringify()")]),t._v(" 方法轉換為 JSON 字符串, 需要先轉換為對象。")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("a")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("b")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("c")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" map "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// {"a":1,"b":2,"c":3}')]),t._v("\n")])])]),s("ol",{attrs:{start:"7"}},[s("li",[s("code",[t._v("Object")]),t._v(" 和 "),s("code",[t._v("Map")]),t._v(" 的性能比較")]),t._v(" "),s("li",[t._v("size-Object")])]),t._v(" "),s("ul",[s("li",[t._v("Object 沒有 size 屬性, 需要通過 Object.keys(obj).length 來獲取對象的大小。")]),t._v(" "),s("li",[t._v("Map 有 size 屬性, 可以直接獲取 Map 的大小。")])]),t._v(" "),s("p",[t._v("🔺 Reference:\n"),s("a",{attrs:{href:"https://medium.com/@wisecobbler/4-ways-to-populate-an-array-in-javascript-836952aea79f",target:"_blank",rel:"noopener noreferrer"}},[t._v("4 Ways to Populate an Array in JavaScript"),s("OutboundLink")],1)]),t._v(" "),s("h3",{attrs:{id:"set-和-map-區別"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#set-和-map-區別"}},[t._v("#")]),t._v(" Set 和 Map 區別")]),t._v(" "),s("p",[t._v("以下是 Set 和 Map 之间的一些主要区别和用途:")]),t._v(" "),s("ol",[s("li",[s("strong",[t._v("Set(集合):")]),t._v(" "),s("ul",[s("li",[t._v("用于存储唯一值,不允许重复的元素。")]),t._v(" "),s("li",[t._v("主要用途是存储一组唯一的元素,如集合、去重和检查元素是否存在。")]),t._v(" "),s("li",[t._v("不需要键值对,只存储单个值。")]),t._v(" "),s("li",[t._v("可以通过"),s("code",[t._v("add")]),t._v("方法添加元素,使用"),s("code",[t._v("has")]),t._v("方法检查元素是否存在,使用"),s("code",[t._v("delete")]),t._v("方法删除元素。")])])])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" uniqueNumbers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("uniqueNumbers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 Set { 1, 2, 3, 4, 5 }")]),t._v("\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[s("strong",[t._v("Map(映射):")]),t._v(" "),s("ul",[s("li",[t._v("用于存储键值对,允许根据键来访问值。")]),t._v(" "),s("li",[t._v("主要用途是创建键值对的映射,可以用于任何需要键值关联的场景。")]),t._v(" "),s("li",[t._v("存储键值对,键可以是任何数据类型,值也可以是任何数据类型。")]),t._v(" "),s("li",[t._v("可以通过"),s("code",[t._v("set")]),t._v("方法添加键值对,使用"),s("code",[t._v("get")]),t._v("方法根据键获取值,使用"),s("code",[t._v("delete")]),t._v("方法删除键值对。")])])])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" userPreferences "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nuserPreferences"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"theme"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dark"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nuserPreferences"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"language"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"en"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("userPreferences"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"theme"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 'dark'")]),t._v("\n")])])]),s("p",[t._v("Set 是 JavaScript 中的一种数据结构,它具有许多优势,使其在各种应用场景中非常有用。以下是 Set 的一些主要优势:")]),t._v(" "),s("ol",[s("li",[s("strong",[t._v("唯一性:")]),t._v(" Set 中的值是唯一的,不会重复。这意味着你可以使用 Set 来存储一组唯一的元素,而不必担心重复值。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" uniqueNumbers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("uniqueNumbers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 Set { 1, 2, 3, 4, 5 }")]),t._v("\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[s("strong",[t._v("查找和去重:")]),t._v(" 使用 Set 可以轻松查找特定元素是否存在于集合中,并且在添加元素时自动去重。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" fruits "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nfruits"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"banana"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fruits"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("has")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 true")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fruits"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("size"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 2,自动去重")]),t._v("\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[s("strong",[t._v("集合操作:")]),t._v(" Set 提供了各种集合操作方法,如交集、并集和差集,使你能够方便地进行数据操作。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" set1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" set2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 交集")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" intersection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("set1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("value")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" set2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("has")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("intersection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 Set { 2, 3 }")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 并集")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" union "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("set1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("set2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("union"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 Set { 1, 2, 3, 4 }")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 差集")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" difference "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("set1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("value")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("set2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("has")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("difference"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 输出 Set { 1 }")]),t._v("\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[s("strong",[t._v("队列操作:")]),t._v(" Set 的特性允许你实现一个简单的队列结构。可以使用 Set 来添加元素到队尾,并从队首删除元素。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" queue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nqueue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"item1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nqueue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"item2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" firstItem "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" queue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("values")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取队首元素")]),t._v("\nqueue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("delete")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("firstItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 删除队首元素")]),t._v("\nqueue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("delete")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("queue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 删除队首元素")]),t._v("\n")])])]),s("p",[t._v("总之,Set 在 JavaScript 中的使用非常灵活,适用于处理唯一值的情况以及各种集合操作。它可以在查找、去重、集合操作和队列等多种场景中提供便利的解决方案。")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/2.a44fb3b0.js b/assets/js/2.a44fb3b0.js new file mode 100644 index 00000000..86ac2e28 --- /dev/null +++ b/assets/js/2.a44fb3b0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{245:function(t,e,a){},246:function(t,e){t.exports=function(t){return null==t}},248:function(t,e,a){},249:function(t,e,a){},250:function(t,e,a){},252:function(t,e,a){"use strict";a(245)},253:function(t,e,a){"use strict";a.r(e);var n=a(266),s=a(255),i=a(239);function r(t,e){if("group"===e.type){const a=e.path&&Object(i.e)(t,e.path),n=e.children.some(e=>"group"===e.type?r(t,e):"page"===e.type&&Object(i.e)(t,e.path));return a||n}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:n.default,SidebarLink:s.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let a=0;a-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(i.e)(this.$route,t.regularPath)}}},l=a(14),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(a,n){return e("li",{key:n},["group"===a.type?e("SidebarGroup",{attrs:{item:a,open:n===t.openGroupIndex,collapsable:a.collapsable||a.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(n)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:a}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},255:function(t,e,a){"use strict";a.r(e);var n=a(239);function s(t,e,a,n,s){const i={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:n,"sidebar-link":!0}};return s>2&&(i.style={"padding-left":s+"rem"}),t("RouterLink",i,a)}function i(t,e,a,r,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(n.e)(r,a+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,a+"#"+e.slug,e.title,u,e.level-1),i(t,e.children,a,r,o,l+1)])}))}var r={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:a,$route:r,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(n.e)(r,u.path),d="auto"===u.type?p||u.children.some(t=>Object(n.e)(r,u.basePath+"#"+t.slug)):p,h="external"===u.type?function(t,e,a){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[a,t("OutboundLink")])}(t,u.path,u.title||u.path):s(t,u.path,u.title||u.path,d),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[h,i(t,u.children,u.basePath,r,f)];if((d||b)&&u.headers&&!n.d.test(u.path)){return[h,i(t,Object(n.c)(u.headers),u.path,r,f)]}return h}},o=(a(252),a(14)),l=Object(o.a)(r,void 0,void 0,!1,null,null,null);e.default=l.exports},256:function(t,e,a){},259:function(t,e,a){"use strict";a(248)},260:function(t,e,a){var n=a(11),s=a(4),i=a(10);t.exports=function(t){return"string"==typeof t||!s(t)&&i(t)&&"[object String]"==n(t)}},261:function(t,e,a){"use strict";a(249)},262:function(t,e,a){},263:function(t,e,a){"use strict";a(250)},264:function(t,e,a){},266:function(t,e,a){"use strict";a.r(e);var n=a(239),s={name:"SidebarGroup",components:{DropdownTransition:a(242).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=a(253).default},methods:{isActive:n.e}},i=(a(263),a(14)),r=Object(i.a)(s,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=r.exports},267:function(t,e,a){"use strict";a.r(e);var n=a(246),s=a.n(n),i=a(239),r={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=s()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:a="",docsBranch:n="master",docsRepo:i=e}=this.$site.themeConfig;return t&&i&&this.$page.relativePath?this.createEditLink(e,i,a,n,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,a,n,s){if(/bitbucket.org/.test(e)){return e.replace(i.a,"")+"/src"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s+`?mode=edit&spa=0&at=${n}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(i.a,"")+"/-/edit"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s}return(i.i.test(e)?e:"https://github.com/"+e).replace(i.a,"")+"/edit"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s}}},o=(a(259),a(14)),l=Object(o.a)(r,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=l.exports},268:function(t,e,a){"use strict";a.r(e);a(90);var n=a(239),s=a(260),i=a.n(s),r=a(246),o=a.n(r),l={name:"PageNav",props:["sidebarItems"],computed:{prev(){return c(u.PREV,this)},next(){return c(u.NEXT,this)}}};const u={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function c(t,{$themeConfig:e,$page:a,$route:s,$site:r,sidebarItems:l}){const{resolveLink:u,getThemeLinkConfig:c,getPageLinkConfig:p}=t,d=c(e),h=p(a),f=o()(h)?d:h;return!1===f?void 0:i()(f)?Object(n.k)(r.pages,f,s.path):u(a,l)}function p(t,e,a){const n=[];!function t(e,a){for(let n=0,s=e.length;n({isSidebarOpen:!1}),computed:{shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(o.l)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1})},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,a=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(a)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},u=a(14),c=Object(u.a)(l,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),t.$page.frontmatter.home?e("Home"):e("Page",{attrs:{"sidebar-items":t.sidebarItems},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("page-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("page-bottom")]},proxy:!0}],null,!0)})],1)}),[],!1,null,null,null);e.default=c.exports}}]); \ No newline at end of file diff --git a/assets/js/20.b2ffde3d.js b/assets/js/20.b2ffde3d.js new file mode 100644 index 00000000..984dda27 --- /dev/null +++ b/assets/js/20.b2ffde3d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{299:function(t,s,a){t.exports=a.p+"assets/img/redux.e6057df8.png"},300:function(t,s){t.exports="data:image/png;base64,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"},301:function(t,s,a){t.exports=a.p+"assets/img/reduxasync.0f79d5bf.png"},339:function(t,s,a){"use strict";a.r(s);var e=a(14),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"react-redux-を基礎から理解する"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#react-redux-を基礎から理解する"}},[t._v("#")]),t._v(" React Redux を基礎から理解する")]),t._v(" "),s("h2",{attrs:{id:"redux-の基本概念"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#redux-の基本概念"}},[t._v("#")]),t._v(" Redux の基本概念")]),t._v(" "),s("ul",[s("li",[s("p",[s("strong",[t._v("Redux Overview:")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Redux")]),t._v(" serves as an alternative to React Context, offering a centralized data store for the entire application.")]),t._v(" "),s("li",[t._v("The store manages all states, eg. critical data like authentication status and user input states.")]),t._v(" "),s("li",[t._v("It provides a unified state management approach by acting as a single store applicable to the entire application.")])]),t._v(" "),s("p",[s("img",{attrs:{src:a(299),alt:"redux"}})])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Subscription to Central Store:")])]),t._v(" "),s("ul",[s("li",[t._v("Components subscribe to the central store for updates.")]),t._v(" "),s("li",[t._v("Subscribed components receive notifications when data changes occur in the "),s("strong",[t._v("Redux store")]),t._v(".")]),t._v(" "),s("li",[t._v("Components selectively retrieve needed data, such as "),s("strong",[t._v("authentication status")]),t._v(", from specific portions of the Redux store.")]),t._v(" "),s("li",[t._v("This establishes a "),s("strong",[t._v("unidirectional flow")]),t._v(", enabling components to access and utilize data provided by the "),s("strong",[t._v("Redux store")]),t._v(".")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Important Rule:")])]),t._v(" "),s("ul",[s("li",[t._v("Components refrain from "),s("em",[t._v("direct data manipulation")]),t._v(".")]),t._v(" "),s("li",[s("em",[t._v("Subscriptions")]),t._v(" are established for components to receive updates, ensuring an indirect and controlled data flow.")]),t._v(" "),s("li",[t._v("Components avoid engaging in a direct data flow towards the storage.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Introducing Reducers:")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Reducers")]),t._v(" handle data mutations and changes within the stored data.")]),t._v(" "),s("li",[t._v('The term "reducer" in '),s("strong",[t._v("Redux")]),t._v(" differs from the reducer hook in React.")]),t._v(" "),s("li",[t._v("A "),s("strong",[t._v("reducer function")]),t._v(" takes input, transforms it, and produces a new output, adhering to general programming concepts.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Understanding Reducer Functions:")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Redux reducer functions")]),t._v(" accept input, transform it, and generate a new output.")]),t._v(" "),s("li",[t._v("They play a crucial role in updating stored data, following general programming principles.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Components and Actions:")])]),t._v(" "),s("ul",[s("li",[t._v("Components do not directly manipulate stored data; they use subscriptions for updates.")]),t._v(" "),s("li",[s("strong",[t._v("Actions")]),t._v(", triggered by components, describe the type of operation a "),s("strong",[t._v("reducer")]),t._v(" should execute.")]),t._v(" "),s("li",[t._v("Components dispatch actions as simple JavaScript objects, specifying the operation type.")]),t._v(" "),s("li",[s("strong",[t._v("Redux")]),t._v(" forwards actions to the appropriate "),s("strong",[t._v("reducer")]),t._v(", which performs the specified operation.")]),t._v(" "),s("li",[t._v("The "),s("strong",[t._v("reducer")]),t._v(" outputs a new state, effectively replacing the existing state in the central data store.")]),t._v(" "),s("li",[t._v("Subscribed components receive notifications of state updates, facilitating UI refresh.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Three Principles of Redux:")])]),t._v(" "),s("ol",[s("li",[s("strong",[t._v("Single Data Source:")]),t._v(" The entire application's state is stored in a single "),s("strong",[t._v("store")]),t._v(".")]),t._v(" "),s("li",[s("strong",[t._v("State is Read-Only:")]),t._v(" State changes occur only through triggering "),s("strong",[t._v("actions")]),t._v(", containing a required "),s("strong",[t._v("type")]),t._v(" attribute.")]),t._v(" "),s("li",[s("strong",[t._v("Use Pure Functions for Actions:")]),t._v(" "),s("strong",[t._v("Reducers")]),t._v(", implemented as pure functions, describe how actions change the state tree.")])])])]),t._v(" "),s("p",[s("img",{attrs:{src:a(300),alt:"redux"}})]),t._v(" "),s("ul",[s("li",[s("p",[s("strong",[t._v("Store and Reducer Relationship:")])]),t._v(" "),s("ul",[s("li",[t._v("The "),s("strong",[t._v("store")]),t._v(" manages data, and its content is determined by the "),s("strong",[t._v("reducer function")]),t._v(".")]),t._v(" "),s("li",[t._v("The "),s("strong",[t._v("reducer function")]),t._v(" produces a new state snapshot whenever an action reaches it.")]),t._v(" "),s("li",[t._v("Upon the initial code execution, the reducer also executes with a default action, typically setting the initial state.")]),t._v(" "),s("li",[t._v("It is crucial for the reducer function to return a new state object consistently.")]),t._v(" "),s("li",[t._v("The reducer function is a standard JavaScript function, always receiving the old/existing state and the dispatched action.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Reducer Function Structure:")])]),t._v(" "),s("ul",[s("li",[t._v("The "),s("strong",[t._v("reducer function")]),t._v(" is a JavaScript function, typically created using arrow function syntax.")]),t._v(" "),s("li",[t._v("It must always return a new state object, ensuring it adheres to the principles of a pure function.")]),t._v(" "),s("li",[t._v("Pure functions guarantee that the same inputs yield the same outputs and have no internal side effects.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Default State in Reducer:")])]),t._v(" "),s("ul",[s("li",[t._v("During the first execution, when the store initializes, the state might be undefined.")]),t._v(" "),s("li",[t._v("Provide a default value for the state parameter in the reducer function to handle this initial case.")]),t._v(" "),s("li",[t._v("The default value ensures that the state is set to an initial value, preventing undefined errors.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Creating and Subscribing to Store:")])]),t._v(" "),s("ul",[s("li",[t._v("Components subscribe to the store using a subscriber function.")]),t._v(" "),s("li",[t._v("The subscriber function is notified whenever data and the store change.")]),t._v(" "),s("li",[t._v("Use the "),s("code",[t._v("subscribe")]),t._v(" method on the store, passing the subscriber function, to establish the subscription.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Dispatching Actions:")])]),t._v(" "),s("ul",[s("li",[t._v("Dispatch actions using the "),s("code",[t._v("dispatch")]),t._v(" method on the store.")]),t._v(" "),s("li",[t._v("Actions are JavaScript objects with a "),s("code",[t._v("type")]),t._v(" attribute acting as an identifier.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("type")]),t._v(" attribute should be a unique string, representing the type of action to be performed.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Sample Action and State Update:")])]),t._v(" "),s("ul",[s("li",[t._v("Example of dispatching an action to increment a counter.")]),t._v(" "),s("li",[t._v("The dispatched action contains a "),s("code",[t._v("type")]),t._v(" attribute indicating an increment action.")]),t._v(" "),s("li",[t._v("The reducer function interprets the action type and produces a new state with an incremented counter.")]),t._v(" "),s("li",[t._v("Subscribed components are notified of the state update.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Understanding Output:")])]),t._v(" "),s("ul",[s("li",[t._v("Executing the code demonstrates the incrementing counter as actions are dispatched.")]),t._v(" "),s("li",[t._v("The store initialization and dispatching actions lead to state updates reflected in the output.")])])])]),t._v(" "),s("hr"),t._v(" "),s("h2",{attrs:{id:"redux-s-core-api"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#redux-s-core-api"}},[t._v("#")]),t._v(" Redux's Core API:")]),t._v(" "),s("ol",[s("li",[s("code",[t._v("Redux.createStore(reducer, [preloadedState], [enhancer])")])]),t._v(" "),s("li",[s("code",[t._v("store.dispatch(action)")])]),t._v(" "),s("li",[s("code",[t._v("store.subscribe(listener)")])]),t._v(" "),s("li",[s("code",[t._v("store.getState()")])]),t._v(" "),s("li",[s("code",[t._v("store.replaceReducer(nextReducer)")])])]),t._v(" "),s("h3",{attrs:{id:"createstore"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#createstore"}},[t._v("#")]),t._v(" createStore")]),t._v(" "),s("p",[s("strong",[t._v("createStore(reducer, [preloadedState], [enhancer])")])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("Creates a Redux store that holds the complete state tree of the app.")])]),t._v(" "),s("li",[s("p",[t._v("There should only be a single store in the app.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("createStore")]),t._v(" accepts three parameters:")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("reducer:")]),t._v(" A reducing function that returns the next state tree, given the current state tree and an action to handle.")]),t._v(" "),s("li",[s("strong",[t._v("[preloadedState]:")]),t._v(" The initial state.")]),t._v(" "),s("li",[s("strong",[t._v("[enhancer]:")]),t._v(" The store enhancer. You may optionally specify it to enhance the store with third-party capabilities such as middleware, time travel, persistence, etc. The only store enhancer that ships with Redux is "),s("code",[t._v("applyMiddleware()")]),t._v(".")])])])]),t._v(" "),s("blockquote",[s("p",[t._v("store/index.js")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" createStore "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"redux"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("counterReducer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("state "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("counter")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" action")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"increment"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("counter")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("counter "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"decrement"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("counter")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("counter "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" store "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createStore")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("counterReducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" store"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("index.js")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" ReactDOM "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-dom/client"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" Provider "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-redux"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./index.css"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" App "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./App"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" store "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./store/index"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" root "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ReactDOM"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createRoot")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"root"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nroot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("render")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Provider store"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("store"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("App "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("Provider"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("Counter.js")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" classes "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./Counter.module.css"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useSelector"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useDispatch "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-redux"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Counter")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Again, this function will be executed for us by React Redux. it will then pass the Redux state in order to manage the data into this function when it is executed, and then basically execute this code to retrieve the state portion of this component that is needed. then use select or overall to return the value. useSelector((state) => state.counter);")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" counter "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useSelector")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("state")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("counter"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Redux automatically sets up a subscription to the Redux store for this component. So whenever the data in the Redux store changes, your component will be updated and automatically receive the latest counter. So it's an automatic reaction that changes to the Redux store will cause this component function to be re-executed. So you'll always have the most up-to-date counter.")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" dispatch "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useDispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// dispatch is a function we can call, that will dispatch an action on our Redux store.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("decrementHandler")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"decrement"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("toggleCounterHandler")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("main className"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("classes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("counter"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Redux Counter"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div className"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("classes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("counter"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("incrementHandler"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Increment"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("decrementHandler"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Decrement"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("toggleCounterHandler"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Toggle Counter"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("main"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" Counter"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"useselector"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#useselector"}},[t._v("#")]),t._v(" "),s("strong",[t._v("useSelector")])]),t._v(" "),s("p",[t._v("In React Redux, the "),s("code",[t._v("useSelector")]),t._v(" hook requires two parameters:")]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("Selector Function:")])]),t._v(" "),s("ul",[s("li",[t._v("This is a function that takes the entire Redux state as a parameter and returns the portion of the state you want to extract. For example, if you have a Redux state tree with an object named "),s("code",[t._v("stock")]),t._v(", and within the "),s("code",[t._v("stock")]),t._v(" object, there's a property named "),s("code",[t._v("counter")]),t._v(", your selector function might be "),s("code",[t._v("(state) => state.stock.counter")]),t._v(". This function determines the data that "),s("code",[t._v("useSelector")]),t._v(" will return.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Equality Function (Optional):")])]),t._v(" "),s("ul",[s("li",[t._v("This is an optional parameter used to compare the values returned by the selector function in consecutive calls to determine if the component should be re-rendered. If omitted, "),s("code",[t._v("useSelector")]),t._v(" will use reference equality ("),s("code",[t._v("===")]),t._v("), meaning it will re-render only if the object references from the previous and current calls are the same. If you need to customize when the component should re-render based on some condition, you can provide a custom equality function.")])])])]),t._v(" "),s("p",[t._v("For example:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" counter "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useSelector")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("state")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("stock"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("counter"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("prev"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" prev "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" next\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("In this example, the first parameter is the selector function, extracting "),s("code",[t._v("state.stock.counter")]),t._v(". The second parameter is a custom equality function that uses reference equality to determine whether to re-render the component based on the returned values from the selector function.")]),t._v(" "),s("h3",{attrs:{id:"dispatch"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#dispatch"}},[t._v("#")]),t._v(" dispatch")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" dispatch "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useDispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// dispatch is a function we can call, that will dispatch an action on our Redux store.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("decrementHandler")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"decrement"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Attaching Payloads to Actions")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ul",[s("li",[s("a",{attrs:{href:"https://itsyuimorii.github.io/memo/jsreview.html#reference-vs-primitive",target:"_blank",rel:"noopener noreferrer"}},[t._v("Reference vs Primitive"),s("OutboundLink")],1)])]),t._v(" "),s("h2",{attrs:{id:"redux-toolkit"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#redux-toolkit"}},[t._v("#")]),t._v(" "),s("a",{attrs:{href:"https://redux-toolkit.js.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Redux Toolkit"),s("OutboundLink")],1)]),t._v(" "),s("blockquote",[s("p",[t._v("When our application grows in complexity, using Redux can become more intricate. In this course, we'll explore a simpler approach to utilizing Redux. Before we proceed, let's consider some potential issues:")])]),t._v(" "),s("p",[s("strong",[t._v("Potential Issues:")])]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("Action Type Identifiers:")])]),t._v(" "),s("ul",[s("li",[t._v("As the application grows, there may be numerous operations, leading to confusion with identifiers.")]),t._v(" "),s("li",[t._v("Issues such as misspelling or conflicts in identifiers might arise.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Data Volume Management:")])]),t._v(" "),s("ul",[s("li",[t._v("With an increase in data volume, the state object becomes larger.")]),t._v(" "),s("li",[t._v("The Reducer function becomes more complex and may be challenging to maintain.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Respecting State Immutability:")])]),t._v(" "),s("ul",[s("li",[t._v("Ensuring the consistent return of a new state snapshot and avoiding unintentional alterations to the existing state.")]),t._v(" "),s("li",[t._v("Complex nested object and array data can lead to unpredictable state changes.")])])])]),t._v(" "),s("p",[s("strong",[t._v("Solutions:")])]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("Unique Identifier Issue:")])]),t._v(" "),s("ul",[s("li",[t._v("Use constants to store identifiers, avoiding spelling errors and ensuring type consistency.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Data Volume Management and Complex Reducer Issue:")])]),t._v(" "),s("ul",[s("li",[t._v("Redux Toolkit provides solutions, such as splitting the Reducer into smaller ones.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("State Immutability Issue:")])]),t._v(" "),s("ul",[s("li",[t._v("Manual implementation of solutions is possible, or Redux Toolkit tools can be used to automate state copying, ensuring unintentional state edits are avoided.")])])])]),t._v(" "),s("h2",{attrs:{id:"redux-toolkit-s-core-apis"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#redux-toolkit-s-core-apis"}},[t._v("#")]),t._v(" Redux Toolkit's Core APIs:")]),t._v(" "),s("ul",[s("li",[s("p",[s("code",[t._v("configureStore()")]),t._v(": wraps "),s("code",[t._v("createStore")]),t._v(" to provide simplified configuration options and good defaults. It can automatically combine your slice reducers, adds whatever Redux middleware you supply, includes "),s("code",[t._v("redux-thunk")]),t._v(" by default, and enables use of the Redux DevTools Extension.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("createReducer()")]),t._v(": that lets you supply a lookup table of action types to case reducer functions, rather than writing switch statements. In addition, it automatically uses the "),s("code",[t._v("immer")]),t._v(" library to let you write simpler immutable updates with normal mutative code, like "),s("code",[t._v("state.todos[3].completed = true")]),t._v(".")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("createAction()")]),t._v(": generates an action creator function for the given action type string. The function itself has "),s("code",[t._v("toString()")]),t._v(" defined, so that it can be used in place of the type constant.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("createSlice()")]),t._v(": accepts an object of reducer functions, a slice name, and an initial state value, and automatically generates a slice reducer with corresponding action creators and action types.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("createAsyncThunk")]),t._v(": accepts an action type string and a function that returns a promise, and generates a thunk that dispatches pending/fulfilled/rejected action types based on that promise")])])]),t._v(" "),s("h3",{attrs:{id:"state-management-with-redux"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#state-management-with-redux"}},[t._v("#")]),t._v(" State management with Redux")]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("Redux Store Setup:")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Purpose:")]),t._v(" This section is responsible for setting up the global Redux store using the "),s("code",[t._v("configureStore")]),t._v(" function from the "),s("code",[t._v("@reduxjs/toolkit")]),t._v(" library. The store is configured with the combined reducers that handle different parts of the application state.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Wrap the App with the Redux Provider:")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Purpose:")]),t._v(" The "),s("code",[t._v("Provider")]),t._v(" component from "),s("code",[t._v("react-redux")]),t._v(" is wrapped around the main application component (in this case, "),s("code",[t._v("App")]),t._v('). This ensures that the Redux store is accessible to all components within the application. It essentially "provides" the Redux store to the entire component tree.')])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Creating a Redux Slice:")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Purpose:")]),t._v(" A Redux slice is a unit of the Redux state that corresponds to a specific feature or part of the application. In this example, the "),s("code",[t._v("exampleSlice")]),t._v(" manages a list of items with corresponding actions like adding and removing items. It provides a clean and organized way to define the initial state and actions related to a specific feature.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Using Redux in a Component:")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Purpose:")]),t._v(" This section demonstrates how to use the "),s("code",[t._v("useSelector")]),t._v(" hook to access the Redux store's state within a React component. In the example, "),s("code",[t._v("SomeComponent")]),t._v(" uses "),s("code",[t._v("useSelector")]),t._v(" to retrieve a list of items from the Redux store and render them.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Dispatching Actions in Another Component:")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Purpose:")]),t._v(" This section shows how to use the "),s("code",[t._v("useDispatch")]),t._v(" hook to dispatch actions to the Redux store from a React component. In the example, "),s("code",[t._v("AnotherComponent")]),t._v(" allows the user to input a new item, and when a button is clicked, the "),s("code",[t._v("addItem")]),t._v(" action is dispatched to add the new item to the Redux store.")])])])]),t._v(" "),s("h3",{attrs:{id:"process-of-using-redux-toolkit"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#process-of-using-redux-toolkit"}},[t._v("#")]),t._v(" Process of using Redux Toolkit")]),t._v(" "),s("p",[t._v("This setup provides a basic structure for handling state management with Redux in a JavaScript app. Action creators generate actions, reducers specify how the state should change, and the store manages the overall application state. The "),s("code",[t._v("useSelector")]),t._v(" hook is used to access the state, and "),s("code",[t._v("useDispatch")]),t._v(" is used to dispatch actions.")]),t._v(" "),s("p",[t._v("🟦 "),s("strong",[t._v("Create the Redux Store:")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// store.js")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" configureStore "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"@reduxjs/toolkit"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" rootReducer "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./reducers"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Import your combined reducers")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" store "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("configureStore")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("reducer")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" rootReducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" store"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("🟦 "),s("strong",[t._v("Wrap the App with the Redux Provider:")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// index.js or App.js")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" Provider "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-redux"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" store "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./store"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" App "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./App"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("MainApp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Provider store"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("store"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("App "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("Provider"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" MainApp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("🟦 "),s("strong",[t._v("Creating a Redux Slice:")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// exampleSlice.js")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" createSlice "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"@reduxjs/toolkit"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" initialState "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("entities")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ids")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" exampleSlice "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createSlice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"example"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n initialState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("reducers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("addItem")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" action")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("entities"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ids"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("removeItem")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" action")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" idToRemove "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("delete")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("entities"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("idToRemove"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ids "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ids"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!==")]),t._v(" idToRemove"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" addItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" removeItem "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" exampleSlice"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("actions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" exampleSlice"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("🟦 "),s("strong",[t._v("Using Redux in a Component:")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// SomeComponent.js")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useSelector "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-redux"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("SomeComponent")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" items "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useSelector")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("state")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("example"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ids"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("example"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("entities"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("items"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("item")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" SomeComponent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("🟦 "),s("strong",[t._v("Dispatching Actions in Another Component:")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// AnotherComponent.js")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useState "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useDispatch "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-redux"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" addItem "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./exampleSlice"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AnotherComponent")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" dispatch "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useDispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("newItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setNewItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("handleAddItem")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Math"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("random")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("36")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("substring")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Generate a unique ID")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" newItem "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example data structure")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItem")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setNewItem")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("input\n type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),t._v("\n value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("newItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n onChange"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("e")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setNewItem")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleAddItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Add Item"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" AnotherComponent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("🔵 "),s("strong",[t._v("useSelector(): Accessing State")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Purpose:")]),t._v(" "),s("code",[t._v("useSelector")]),t._v(" is a React hook provided by the "),s("code",[t._v("react-redux")]),t._v(" library. Its primary purpose is to select and access the current state from the Redux store. It takes a selector function as an argument, which allows you to extract specific pieces of data from the state. By using "),s("code",[t._v("useSelector")]),t._v(", components can efficiently subscribe to changes in the Redux state and re-render when relevant data is updated.")])]),t._v(" "),s("p",[t._v("🔵 "),s("strong",[t._v("useDispatch(): Modifying State with Actions")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Purpose:")]),t._v(" "),s("code",[t._v("useDispatch")]),t._v(" is another React hook from the "),s("code",[t._v("react-redux")]),t._v(" library. Its primary purpose is to provide a reference to the "),s("code",[t._v("dispatch")]),t._v(" function of the Redux store. This allows components to dispatch actions, which are plain JavaScript objects containing a "),s("code",[t._v("type")]),t._v(" property and, optionally, a "),s("code",[t._v("payload")]),t._v(". By using "),s("code",[t._v("useDispatch")]),t._v(", components can trigger state changes by dispatching actions. These actions are then processed by reducers, modifying the state in a predictable and controlled manner.")])]),t._v(" "),s("p",[t._v("🔵 "),s("strong",[t._v("Summary:")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Redux Store Setup:")]),t._v(" Configured a global store using "),s("code",[t._v("configureStore")]),t._v(" from "),s("code",[t._v("@reduxjs/toolkit")]),t._v(".")]),t._v(" "),s("li",[s("strong",[t._v("Provider Usage:")]),t._v(" Wrapped the main application component with "),s("code",[t._v("Provider")]),t._v(" to make the Redux store accessible throughout the component tree.")]),t._v(" "),s("li",[s("strong",[t._v("Redux Slice Creation:")]),t._v(" Created a Redux slice using "),s("code",[t._v("createSlice")]),t._v(" to manage a list of items in the state.")]),t._v(" "),s("li",[s("strong",[t._v("Component Interaction:")]),t._v(" Used "),s("code",[t._v("useSelector")]),t._v(" to access state data and "),s("code",[t._v("useDispatch")]),t._v(" to dispatch actions from React components.")])]),t._v(" "),s("h2",{attrs:{id:"handling-asynchronous-code"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#handling-asynchronous-code"}},[t._v("#")]),t._v(" Handling Asynchronous Code:")]),t._v(" "),s("blockquote",[s("p",[s("strong",[t._v("Redux Core Principle:")])])]),t._v(" "),s("ul",[s("li",[t._v("Reducer functions in Redux must be pure, without side effects, and synchronous.")]),t._v(" "),s("li",[t._v("Pure functions produce the same output for the same input, ensuring consistency and predictability.")])]),t._v(" "),s("p",[s("strong",[t._v("Handling Asynchronous Code:")])]),t._v(" "),s("ul",[s("li",[t._v("A challenge arises when dealing with asynchronous actions, like HTTP requests, in Redux.")]),t._v(" "),s("li",[t._v("Reducer functions are unsuitable for asynchronous code due to their synchronous nature.")])]),t._v(" "),s("p",[s("strong",[t._v("Options for Handling Asynchronous Code:")])]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("Component-Level Side Effects:")])]),t._v(" "),s("ul",[s("li",[t._v("Place side effect code, including asynchronous operations, directly in the component.")]),t._v(" "),s("li",[t._v("Dispatch actions after the side effect completion to inform Redux.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Custom Action Creators:")])]),t._v(" "),s("ul",[s("li",[t._v("Write custom action creators for handling asynchronous tasks without altering the reducer function.")]),t._v(" "),s("li",[t._v("Allows running asynchronous tasks as part of the action creator.")])])])]),t._v(" "),s("p",[s("strong",[t._v("Redux Toolkit Solution:")])]),t._v(" "),s("ul",[s("li",[t._v("Redux Toolkit provides a solution for handling asynchronous tasks within action creators.")]),t._v(" "),s("li",[t._v("It allows the execution of side effects without violating the synchronous nature of reducer functions.")])]),t._v(" "),s("p",[s("img",{attrs:{src:a(301),alt:"reduxasync"}})]),t._v(" "),s("h2",{attrs:{id:"redux-thunk"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#redux-thunk"}},[t._v("#")]),t._v(" Redux Thunk")]),t._v(" "),s("blockquote",[s("p",[s("strong",[t._v("Redux Thunk:")])])]),t._v(" "),s("ul",[s("li",[t._v("Redux Thunk is a middleware that allows the execution of asynchronous tasks in Redux.")]),t._v(" "),s("li",[t._v("It enables the dispatch of asynchronous actions, such as HTTP requests, in Redux.")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("sendCartData")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("cart")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//instead of return an action object, 如 { type: 'SOME_ACTION', payload: someData }。 我們創建一個一個action creator return another function")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n uiActions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("showNotification")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("status")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pending"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("title")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sending..."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sending cart data!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("sendRequest")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://react-http-6b4a6.firebaseio.com/cart.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PUT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ok"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sending cart data failed."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendRequest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n uiActions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("showNotification")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("status")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"success"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("title")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Success!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sent cart data successfully!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n uiActions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("showNotification")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("status")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"error"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("title")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sending cart data failed!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The provided code demonstrates the use of a Redux thunk as an action creator. In contrast to regular action creators, which directly return an action object (e.g., "),s("code",[t._v("{ type: 'SOME_ACTION', payload: someData }")]),t._v("), this action creator returns a function.")]),t._v(" "),s("p",[t._v("Here are some key differences in this approach:")]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("Returning a Function Instead of a Direct Action Object:")])]),t._v(" "),s("ul",[s("li",[t._v("Regular action creators typically return a plain action object. In this case, the action creator returns a function.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Incorporating Asynchronous Logic:")])]),t._v(" "),s("ul",[s("li",[t._v("The returned function contains asynchronous logic. In this example, it involves sending shopping cart data to a server using "),s("code",[t._v("async/await")]),t._v(" with the "),s("code",[t._v("fetch")]),t._v(" function to make a PUT request.")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Dispatching Actions Before and After Asynchronous Logic:")])]),t._v(" "),s("ul",[s("li",[t._v('Before the asynchronous logic starts, an action is dispatched to indicate that the data is pending ("pending" notification). After the asynchronous logic succeeds or fails, corresponding actions are dispatched to display notifications with success or error messages.')])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Error Handling:")])]),t._v(" "),s("ul",[s("li",[t._v("Errors are handled using a "),s("code",[t._v("try-catch")]),t._v(' block. If an error occurs during the asynchronous logic, an action is dispatched to show an "error" notification along with the appropriate error message.')])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("More Flexible Control Flow:")])]),t._v(" "),s("ul",[s("li",[t._v('Thunks provide a more flexible control flow, allowing you to dispatch different actions at different stages of asynchronous logic. For instance, dispatching a "pending" action at the start, a "success" action upon success, and an "error" action upon failure.')])])])]),t._v(" "),s("p",[t._v("In summary, this approach enables action creators to execute more complex logic, including asynchronous operations, conditional checks, and error handling. Thunks allow you to abstract away this logic from the components, allowing them to focus on user interface interactions without having to deal directly with complex asynchronous or side-effect logic.")])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/21.7f8f7869.js b/assets/js/21.7f8f7869.js new file mode 100644 index 00000000..19bcbaea --- /dev/null +++ b/assets/js/21.7f8f7869.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{240:function(t,e,n){},242:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(243),n(14)),o=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=o.exports},243:function(t,e,n){"use strict";n(240)}}]); \ No newline at end of file diff --git a/assets/js/22.3f20ce36.js b/assets/js/22.3f20ce36.js new file mode 100644 index 00000000..80e350d5 --- /dev/null +++ b/assets/js/22.3f20ce36.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{258:function(t,c,n){},270:function(t,c,n){"use strict";n(258)},283:function(t,c,n){"use strict";n.r(c);n(270);var i=n(14),s=Object(i.a)({},(function(){var t=this,c=t._self._c;return c("div",{staticClass:"sidebar-button",on:{click:function(c){return t.$emit("toggle-sidebar")}}},[c("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[c("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null);c.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/23.40d3f423.js b/assets/js/23.40d3f423.js new file mode 100644 index 00000000..d38b590e --- /dev/null +++ b/assets/js/23.40d3f423.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{294:function(t,a,s){t.exports=s.p+"assets/img/errorobject.51c51d3f.png"},295:function(t,a,s){t.exports=s.p+"assets/img/action.af11efbe.png"},327:function(t,a,s){"use strict";s.r(a);var r=s(14),n=Object(r.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"⚪️-react-router-を基礎から理解する"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-react-router-を基礎から理解する"}},[t._v("#")]),t._v(" ⚪️ React Router を基礎から理解する")]),t._v(" "),a("h2",{attrs:{id:"🔶-basic-purpose"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔶-basic-purpose"}},[t._v("#")]),t._v(" 🔶 Basic Purpose")]),t._v(" "),a("p",[t._v("当我们谈论浏览器中的 URL 以及它如何与前端和后端路由相关时,我们指的是以下概念:")]),t._v(" "),a("blockquote",[a("p",[t._v("瀏覽器地址欄的 URL "),a("code",[t._v("URL => request => backend server")])])]),t._v(" "),a("p",[a("strong",[t._v("前端路由")]),t._v(":")]),t._v(" "),a("blockquote",[a("p",[t._v("攔截不同的 URL, 去渲染不同的組件,服務器是不知道的。 ("),a("strong",[t._v("組件中")]),t._v("可能向後端請求 API 接口數據)")])]),t._v(" "),a("ul",[a("li",[t._v("前端路由主要负责在浏览器端处理不同的 URL 请求。")]),t._v(" "),a("li",[t._v("它通过拦截 URL 的变化来决定渲染哪个组件,而不是将请求发送到服务器。")]),t._v(" "),a("li",[t._v("在前端路由中,页面不会重新加载;相反,它通常会在当前页面动态地替换显示的内容(组件)。")]),t._v(" "),a("li",[t._v("虽然前端路由处理的是 URL,但服务器通常对此无感知。在这种机制下,组件可能会根据需要向后端请求 API 数据。")])]),t._v(" "),a("p",[a("strong",[t._v("后端路由")]),t._v(":")]),t._v(" "),a("blockquote",[a("p",[t._v("接收不同的 URL,執行不同的代碼處理,響應不同的數據(json)")])]),t._v(" "),a("ul",[a("li",[t._v("后端路由处理来自浏览器的请求,并根据不同的 URL 路径执行服务器上的特定代码。")]),t._v(" "),a("li",[t._v("它负责接收请求,并根据请求的 URL 返回相应的数据(如 JSON 格式的数据)。")]),t._v(" "),a("li",[t._v("后端路由是传统网页应用中常见的模式,每个 URL 请求通常对应服务器上的一个特定处理函数或模块。")])]),t._v(" "),a("p",[a("strong",[t._v("总结")]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("前端路由和后端路由共同作用于提供完整的网页应用体验。")]),t._v(" "),a("li",[t._v("前端路由使得单页面应用(SPA)能够动态地更改显示的内容而无需加载新页面,提高用户体验。")]),t._v(" "),a("li",[t._v("后端路由处理实际的数据请求和处理逻辑,为前端提供所需的数据。")]),t._v(" "),a("li",[t._v("这种分离使得应用可以更灵活地响应用户的操作,同时优化性能和用户体验。")])]),t._v(" "),a("p",[a("a",{attrs:{href:"https://reactrouter.com/en/main/start/tutorial",target:"_blank",rel:"noopener noreferrer"}},[t._v("React Router Tutorial"),a("OutboundLink")],1),t._v(" "),a("a",{attrs:{href:"https://github.com/itsyuimorii/--TUTORIAL--React---The-Complete-Guide-2023-incl.-max/tree/main/my-router",target:"_blank",rel:"noopener noreferrer"}},[t._v("代碼例子"),a("OutboundLink")],1)]),t._v(" "),a("blockquote",[a("p",[t._v("main.js")])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" React "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" ReactDOM "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-dom/client"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" createBrowserRouter"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" RouterProvider "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-router-dom"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./index.css"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Root "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./routes/root"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" router "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createBrowserRouter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("path")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("element")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Root "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nReactDOM"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createRoot")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"root"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("render")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("React"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("StrictMode"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 2. 配置使用- 路有對象 */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("RouterProvider router"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("router"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("React"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("StrictMode"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h2",{attrs:{id:"🔶-様々なシーン"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔶-様々なシーン"}},[t._v("#")]),t._v(" 🔶 様々なシーン")]),t._v(" "),a("h3",{attrs:{id:"▫️-takeaway-01-理解匹配失敗的處理-對象userouteerror-和-errorelement"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#▫️-takeaway-01-理解匹配失敗的處理-對象userouteerror-和-errorelement"}},[t._v("#")]),t._v(" ▫️ Takeaway 01: 理解匹配失敗的處理: 對象"),a("code",[t._v("useRouteError()")]),t._v(" 和 "),a("code",[t._v("errorElement")])]),t._v(" "),a("ul",[a("li",[a("p",[t._v("對象"),a("code",[t._v("useRouteError()")]),t._v("可以看到匹配失敗的信息")])]),t._v(" "),a("li",[a("p",[a("code",[t._v("errorElement")]),t._v(": 用於渲染匹配失敗的組件")]),t._v(" "),a("blockquote",[a("p",[a("code",[t._v("touch src/error-page.jsx")])])])])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useRouteError "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-router-dom"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ErrorPage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//創建了一個error對象, 這個對象包含了匹配失敗的信息")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" error "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useRouteError")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//有錯誤才會渲染這個組件,然後在這個裡面獲取錯誤對象,拿到錯誤對象進行打印。")]),t._v("\n\n console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div id"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"error-page"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h1"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Oops"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h1"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Sorry"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" an unexpected error has occurred"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* statusText: 狀態文本 = Not Found */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("error"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("statusText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" error"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("img",{attrs:{src:s(294),alt:"errorobject"}})]),t._v(" "),a("h3",{attrs:{id:"▫️-takeaway-02-理解-nested-routes的概念"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#▫️-takeaway-02-理解-nested-routes的概念"}},[t._v("#")]),t._v(" ▫️ Takeaway 02: 理解 "),a("a",{attrs:{href:"https://reactrouter.com/en/main/start/tutorial#nested-routes",target:"_blank",rel:"noopener noreferrer"}},[t._v("nested-routes"),a("OutboundLink")],1),t._v("的概念")]),t._v(" "),a("ol",[a("li",[t._v("👉 导入联系人组件并创建新路线")])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* existing imports */")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Contact "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./routes/contact"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" router "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createBrowserRouter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("path")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("element")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Root "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errorElement")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ErrorPage "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("path")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"contacts/:contactId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("element")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Contact "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("现在,如果我们单击其中一个链接或访问,"),a("code",[t._v("/contacts/1")]),t._v(" 我们就会得到新组件!但是,它不在我们的"),a("code",[t._v("root")]),t._v("布局内 😠\n我们通过将联系路由设为根路由的子路由来实现这一点。 现在,您将再次看到根布局,但右侧有一个空白页面。我们需要告诉根路由我们希望它在哪里呈现其子路由。我们用 来做到这一点"),a("code",[t._v("")]),t._v("。")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("找到"),a("code",[t._v('
    '};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var c=n.render(!e),u=c.querySelector(r.barSelector),l=r.speed,f=r.easing;return c.offsetWidth,a((function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,l,f)),1===t?(s(c,{transition:"none",opacity:1}),c.offsetWidth,setTimeout((function(){s(c,{transition:"all "+l+"ms linear",opacity:0}),setTimeout((function(){n.remove(),e()}),l)}),l)):setTimeout(e,l)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout((function(){n.status&&(n.trickle(),t())}),r.trickleSpeed)};return r.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always((function(){0==--e?(t=0,n.done()):n.set((t-e)/t)})),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),c=t?"-100":i(n.status||0),l=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+c+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&p(o),l!=document.body&&u(l,"nprogress-custom-parent"),l.appendChild(e),e},n.remove=function(){l(document.documentElement,"nprogress-busy"),l(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&p(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),s=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function c(t,e){return("string"==typeof t?t:f(t)).indexOf(" "+e+" ")>=0}function u(t,e){var n=f(t),r=n+e;c(n,e)||(t.className=r.substring(1))}function l(t,e){var n,r=f(t);c(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function f(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function p(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},function(t,e,n){"use strict";var r=n(1),o=n(45).f,i=n(12),a=n(92),s=n(32),c=n(61),u=n(120);t.exports=function(t,e){var n,l,f,p,d,h=t.target,v=t.global,m=t.stat;if(n=v?r:m?r[h]||s(h,{}):(r[h]||{}).prototype)for(l in e){if(p=e[l],f=t.dontCallGetSet?(d=o(n,l))&&d.value:n[l],!u(v?l:h+(m?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;c(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),a(n,l,p,t)}}},function(t,e,n){"use strict";var r=n(25),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(t,e,n){"use strict";var r=n(3);t.exports=!r((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},function(t,e,n){"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){"use strict";var r=n(46),o=n(47);t.exports=function(t){return r(o(t))}},function(t,e,n){"use strict";var r=n(1),o=n(0),i=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t]):r[t]&&r[t][e]}},function(t,e,n){"use strict";var r=n(0),o=n(102),i=TypeError;t.exports=function(t){if(r(t))return t;throw new i(o(t)+" is not a function")}},function(t,e,n){"use strict";var r=n(1),o=n(56),i=n(7),a=n(58),s=n(54),c=n(53),u=r.Symbol,l=o("wks"),f=c?u.for||u:u&&u.withoutSetter||a;t.exports=function(t){return i(l,t)||(l[t]=s&&i(u,t)?u[t]:f("Symbol."+t)),l[t]}},function(t,e,n){"use strict";var r=n(1),o=n(32),i=r["__core-js_shared__"]||o("__core-js_shared__",{});t.exports=i},function(t,e,n){"use strict";var r=n(1),o=Object.defineProperty;t.exports=function(t,e){try{o(r,t,{value:e,configurable:!0,writable:!0})}catch(n){r[t]=e}return e}},function(t,e,n){"use strict";var r=n(47),o=Object;t.exports=function(t){return o(r(t))}},function(t,e,n){"use strict";var r=n(8),o=String,i=TypeError;t.exports=function(t){if(r(t))return t;throw new i(o(t)+" is not an object")}},function(t,e,n){"use strict";var r=n(117);t.exports=function(t){return r(t.length)}},function(t,e,n){var r=n(143),o=n(10),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,c=r(function(){return arguments}())?r:function(t){return o(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=c},function(t,e,n){var r=n(9)(n(6),"Map");t.exports=r},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e,n){var r=n(163),o=n(170),i=n(172),a=n(173),s=n(174);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t<=9007199254740991}},function(t,e,n){var r=n(4),o=n(43),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;t.exports=function(t,e){if(r(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!o(t))||(a.test(t)||!i.test(t)||null!=e&&t in Object(e))}},function(t,e,n){var r=n(11),o=n(10);t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==r(t)}},function(t,e){t.exports=function(t){return t}},function(t,e,n){"use strict";var r=n(5),o=n(24),i=n(98),a=n(26),s=n(27),c=n(49),u=n(7),l=n(59),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=s(t),e=c(e),l)try{return f(t,e)}catch(t){}if(u(t,e))return a(!o(i.f,t,e),t[e])}},function(t,e,n){"use strict";var r=n(2),o=n(3),i=n(16),a=Object,s=r("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"===i(t)?s(t,""):a(t)}:a},function(t,e,n){"use strict";var r=n(48),o=TypeError;t.exports=function(t){if(r(t))throw new o("Can't call method on "+t);return t}},function(t,e,n){"use strict";t.exports=function(t){return null==t}},function(t,e,n){"use strict";var r=n(99),o=n(51);t.exports=function(t){var e=r(t,"string");return o(e)?e:e+""}},function(t,e,n){"use strict";var r="object"==typeof document&&document.all,o=void 0===r&&void 0!==r;t.exports={all:r,IS_HTMLDDA:o}},function(t,e,n){"use strict";var r=n(28),o=n(0),i=n(52),a=n(53),s=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=r("Symbol");return o(e)&&i(e.prototype,s(t))}},function(t,e,n){"use strict";var r=n(2);t.exports=r({}.isPrototypeOf)},function(t,e,n){"use strict";var r=n(54);t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(t,e,n){"use strict";var r=n(55),o=n(3),i=n(1).String;t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol("symbol detection");return!i(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(t,e,n){"use strict";var r,o,i=n(1),a=n(100),s=i.process,c=i.Deno,u=s&&s.versions||c&&c.version,l=u&&u.v8;l&&(o=(r=l.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=+r[1]),t.exports=o},function(t,e,n){"use strict";var r=n(57),o=n(31);(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.33.3",mode:r?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.33.3/LICENSE",source:"https://github.com/zloirock/core-js"})},function(t,e,n){"use strict";t.exports=!1},function(t,e,n){"use strict";var r=n(2),o=0,i=Math.random(),a=r(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++o+i,36)}},function(t,e,n){"use strict";var r=n(5),o=n(3),i=n(104);t.exports=!r&&!o((function(){return 7!==Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){"use strict";t.exports={}},function(t,e,n){"use strict";var r=n(7),o=n(111),i=n(45),a=n(15);t.exports=function(t,e,n){for(var s=o(e),c=a.f,u=i.f,l=0;ll))return!1;var p=c.get(t),d=c.get(e);if(p&&d)return p==e&&d==t;var h=-1,v=!0,m=2&n?new r:void 0;for(c.set(t,e),c.set(e,t);++h-1&&t%1==0&&t]/;t.exports=function(t){var e,n=""+t,o=r.exec(n);if(!o)return n;var i="",a=0,s=0;for(a=o.index;a=e||n<0||m&&t-u>=i}function x(){var t=d();if(_(t))return w(t);s=setTimeout(x,function(t){var n=e-(t-c);return m?p(n,i-(t-u)):n}(t))}function w(t){return s=void 0,g&&r?y(t):(r=o=void 0,a)}function k(){var t=d(),n=_(t);if(r=arguments,o=this,c=t,n){if(void 0===s)return b(c);if(m)return s=setTimeout(x,e),y(c)}return void 0===s&&(s=setTimeout(x,e)),a}return e=v(e)||0,h(n)&&(l=!!n.leading,i=(m="maxWait"in n)?f(v(n.maxWait)||0,e):i,g="trailing"in n?!!n.trailing:g),k.cancel=function(){void 0!==s&&clearTimeout(s),u=0,r=c=o=s=void 0},k.flush=function(){return void 0===s?a:w(d())},k}},function(t,e,n){"use strict";var r=n(23),o=n(33),i=n(35),a=n(124),s=n(126);r({target:"Array",proto:!0,arity:1,forced:n(3)((function(){return 4294967297!==[].push.call({length:4294967296},1)}))||!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(t){return t instanceof TypeError}}()},{push:function(t){var e=o(this),n=i(e),r=arguments.length;s(n+r);for(var c=0;c79&&a<83||!i("reduce")},{reduce:function(t){var e=arguments.length;return o(this,t,e,e>1?arguments[1]:void 0)}})},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);e.f=i?function(t){var e=o(this,t);return!!e&&e.enumerable}:r},function(t,e,n){"use strict";var r=n(24),o=n(8),i=n(51),a=n(101),s=n(103),c=n(30),u=TypeError,l=c("toPrimitive");t.exports=function(t,e){if(!o(t)||i(t))return t;var n,c=a(t,l);if(c){if(void 0===e&&(e="default"),n=r(c,t,e),!o(n)||i(n))return n;throw new u("Can't convert object to primitive value")}return void 0===e&&(e="number"),s(t,e)}},function(t,e,n){"use strict";t.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},function(t,e,n){"use strict";var r=n(29),o=n(48);t.exports=function(t,e){var n=t[e];return o(n)?void 0:r(n)}},function(t,e,n){"use strict";var r=String;t.exports=function(t){try{return r(t)}catch(t){return"Object"}}},function(t,e,n){"use strict";var r=n(24),o=n(0),i=n(8),a=TypeError;t.exports=function(t,e){var n,s;if("string"===e&&o(n=t.toString)&&!i(s=r(n,t)))return s;if(o(n=t.valueOf)&&!i(s=r(n,t)))return s;if("string"!==e&&o(n=t.toString)&&!i(s=r(n,t)))return s;throw new a("Can't convert object to primitive value")}},function(t,e,n){"use strict";var r=n(1),o=n(8),i=r.document,a=o(i)&&o(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},function(t,e,n){"use strict";var r=n(5),o=n(3);t.exports=r&&o((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},function(t,e,n){"use strict";var r=n(5),o=n(7),i=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,s=o(i,"name"),c=s&&"something"===function(){}.name,u=s&&(!r||r&&a(i,"name").configurable);t.exports={EXISTS:s,PROPER:c,CONFIGURABLE:u}},function(t,e,n){"use strict";var r=n(2),o=n(0),i=n(31),a=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(t){return a(t)}),t.exports=i.inspectSource},function(t,e,n){"use strict";var r,o,i,a=n(109),s=n(1),c=n(8),u=n(12),l=n(7),f=n(31),p=n(110),d=n(60),h=s.TypeError,v=s.WeakMap;if(a||f.state){var m=f.state||(f.state=new v);m.get=m.get,m.has=m.has,m.set=m.set,r=function(t,e){if(m.has(t))throw new h("Object already initialized");return e.facade=t,m.set(t,e),e},o=function(t){return m.get(t)||{}},i=function(t){return m.has(t)}}else{var g=p("state");d[g]=!0,r=function(t,e){if(l(t,g))throw new h("Object already initialized");return e.facade=t,u(t,g,e),e},o=function(t){return l(t,g)?t[g]:{}},i=function(t){return l(t,g)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw new h("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){"use strict";var r=n(1),o=n(0),i=r.WeakMap;t.exports=o(i)&&/native code/.test(String(i))},function(t,e,n){"use strict";var r=n(56),o=n(58),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e,n){"use strict";var r=n(28),o=n(2),i=n(112),a=n(119),s=n(34),c=o([].concat);t.exports=r("Reflect","ownKeys")||function(t){var e=i.f(s(t)),n=a.f;return n?c(e,n(t)):e}},function(t,e,n){"use strict";var r=n(113),o=n(118).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e,n){"use strict";var r=n(2),o=n(7),i=n(27),a=n(114).indexOf,s=n(60),c=r([].push);t.exports=function(t,e){var n,r=i(t),u=0,l=[];for(n in r)!o(s,n)&&o(r,n)&&c(l,n);for(;e.length>u;)o(r,n=e[u++])&&(~a(l,n)||c(l,n));return l}},function(t,e,n){"use strict";var r=n(27),o=n(115),i=n(35),a=function(t){return function(e,n,a){var s,c=r(e),u=i(c),l=o(a,u);if(t&&n!=n){for(;u>l;)if((s=c[l++])!=s)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},function(t,e,n){"use strict";var r=n(62),o=Math.max,i=Math.min;t.exports=function(t,e){var n=r(t);return n<0?o(n+e,0):i(n,e)}},function(t,e,n){"use strict";var r=Math.ceil,o=Math.floor;t.exports=Math.trunc||function(t){var e=+t;return(e>0?o:r)(e)}},function(t,e,n){"use strict";var r=n(62),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){"use strict";t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e,n){"use strict";e.f=Object.getOwnPropertySymbols},function(t,e,n){"use strict";var r=n(3),o=n(0),i=/#|\.prototype\./,a=function(t,e){var n=c[s(t)];return n===l||n!==u&&(o(e)?r(e):!!e)},s=a.normalize=function(t){return String(t).replace(i,".").toLowerCase()},c=a.data={},u=a.NATIVE="N",l=a.POLYFILL="P";t.exports=a},function(t,e,n){"use strict";var r=n(29),o=n(33),i=n(46),a=n(35),s=TypeError,c=function(t){return function(e,n,c,u){r(n);var l=o(e),f=i(l),p=a(l),d=t?p-1:0,h=t?-1:1;if(c<2)for(;;){if(d in f){u=f[d],d+=h;break}if(d+=h,t?d<0:p<=d)throw new s("Reduce of empty array with no initial value")}for(;t?d>=0:p>d;d+=h)d in f&&(u=n(u,f[d],d,l));return u}};t.exports={left:c(!1),right:c(!0)}},function(t,e,n){"use strict";var r=n(3);t.exports=function(t,e){var n=[][t];return!!n&&r((function(){n.call(null,e||function(){return 1},1)}))}},function(t,e,n){"use strict";var r=n(1),o=n(16);t.exports="process"===o(r.process)},function(t,e,n){"use strict";var r=n(5),o=n(125),i=TypeError,a=Object.getOwnPropertyDescriptor,s=r&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=s?function(t,e){if(o(t)&&!a(t,"length").writable)throw new i("Cannot set read only .length");return t.length=e}:function(t,e){return t.length=e}},function(t,e,n){"use strict";var r=n(16);t.exports=Array.isArray||function(t){return"Array"===r(t)}},function(t,e,n){"use strict";var r=TypeError;t.exports=function(t){if(t>9007199254740991)throw r("Maximum allowed index exceeded");return t}},function(t,e,n){"use strict";var r=n(23),o=n(1),i=n(128),a=n(129),s=o.WebAssembly,c=7!==new Error("e",{cause:7}).cause,u=function(t,e){var n={};n[t]=a(t,e,c),r({global:!0,constructor:!0,arity:1,forced:c},n)},l=function(t,e){if(s&&s[t]){var n={};n[t]=a("WebAssembly."+t,e,c),r({target:"WebAssembly",stat:!0,constructor:!0,arity:1,forced:c},n)}};u("Error",(function(t){return function(e){return i(t,this,arguments)}})),u("EvalError",(function(t){return function(e){return i(t,this,arguments)}})),u("RangeError",(function(t){return function(e){return i(t,this,arguments)}})),u("ReferenceError",(function(t){return function(e){return i(t,this,arguments)}})),u("SyntaxError",(function(t){return function(e){return i(t,this,arguments)}})),u("TypeError",(function(t){return function(e){return i(t,this,arguments)}})),u("URIError",(function(t){return function(e){return i(t,this,arguments)}})),l("CompileError",(function(t){return function(e){return i(t,this,arguments)}})),l("LinkError",(function(t){return function(e){return i(t,this,arguments)}})),l("RuntimeError",(function(t){return function(e){return i(t,this,arguments)}}))},function(t,e,n){"use strict";var r=n(25),o=Function.prototype,i=o.apply,a=o.call;t.exports="object"==typeof Reflect&&Reflect.apply||(r?a.bind(i):function(){return a.apply(i,arguments)})},function(t,e,n){"use strict";var r=n(28),o=n(7),i=n(12),a=n(52),s=n(63),c=n(61),u=n(132),l=n(133),f=n(134),p=n(137),d=n(138),h=n(5),v=n(57);t.exports=function(t,e,n,m){var g=m?2:1,y=t.split("."),b=y[y.length-1],_=r.apply(null,y);if(_){var x=_.prototype;if(!v&&o(x,"cause")&&delete x.cause,!n)return _;var w=r("Error"),k=e((function(t,e){var n=f(m?e:t,void 0),r=m?new _(t):new _;return void 0!==n&&i(r,"message",n),d(r,k,r.stack,2),this&&a(x,this)&&l(r,this,k),arguments.length>g&&p(r,arguments[g]),r}));if(k.prototype=x,"Error"!==b?s?s(k,w):c(k,w,{name:!0}):h&&"stackTraceLimit"in _&&(u(k,_,"stackTraceLimit"),u(k,_,"prepareStackTrace")),c(k,_),!v)try{x.name!==b&&i(x,"name",b),x.constructor=k}catch(t){}return k}}},function(t,e,n){"use strict";var r=n(2),o=n(29);t.exports=function(t,e,n){try{return r(o(Object.getOwnPropertyDescriptor(t,e)[n]))}catch(t){}}},function(t,e,n){"use strict";var r=n(0),o=String,i=TypeError;t.exports=function(t){if("object"==typeof t||r(t))return t;throw new i("Can't set "+o(t)+" as a prototype")}},function(t,e,n){"use strict";var r=n(15).f;t.exports=function(t,e,n){n in t||r(t,n,{configurable:!0,get:function(){return e[n]},set:function(t){e[n]=t}})}},function(t,e,n){"use strict";var r=n(0),o=n(8),i=n(63);t.exports=function(t,e,n){var a,s;return i&&r(a=e.constructor)&&a!==n&&o(s=a.prototype)&&s!==n.prototype&&i(t,s),t}},function(t,e,n){"use strict";var r=n(93);t.exports=function(t,e){return void 0===t?arguments.length<2?"":e:r(t)}},function(t,e,n){"use strict";var r=n(136),o=n(0),i=n(16),a=n(30)("toStringTag"),s=Object,c="Arguments"===i(function(){return arguments}());t.exports=r?i:function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=s(t),a))?n:c?i(e):"Object"===(r=i(e))&&o(e.callee)?"Arguments":r}},function(t,e,n){"use strict";var r={};r[n(30)("toStringTag")]="z",t.exports="[object z]"===String(r)},function(t,e,n){"use strict";var r=n(8),o=n(12);t.exports=function(t,e){r(e)&&"cause"in e&&o(t,"cause",e.cause)}},function(t,e,n){"use strict";var r=n(12),o=n(139),i=n(140),a=Error.captureStackTrace;t.exports=function(t,e,n,s){i&&(a?a(t,e):r(t,"stack",o(n,s)))}},function(t,e,n){"use strict";var r=n(2),o=Error,i=r("".replace),a=String(new o("zxcasd").stack),s=/\n\s*at [^:]*:[^\n]*/,c=s.test(a);t.exports=function(t,e){if(c&&"string"==typeof t&&!o.prepareStackTrace)for(;e--;)t=i(t,s,"");return t}},function(t,e,n){"use strict";var r=n(3),o=n(26);t.exports=!r((function(){var t=new Error("a");return!("stack"in t)||(Object.defineProperty(t,"stack",o(1,7)),7!==t.stack)}))},function(t,e,n){var r=n(64),o=n(142);t.exports=function t(e,n,i,a,s){var c=-1,u=e.length;for(i||(i=o),s||(s=[]);++c0&&i(l)?n>1?t(l,n-1,i,a,s):r(s,l):a||(s[s.length]=l)}return s}},function(t,e,n){var r=n(13),o=n(36),i=n(4),a=r?r.isConcatSpreadable:void 0;t.exports=function(t){return i(t)||o(t)||!!(a&&t&&t[a])}},function(t,e,n){var r=n(11),o=n(10);t.exports=function(t){return o(t)&&"[object Arguments]"==r(t)}},function(t,e,n){var r=n(13),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,s=r?r.toStringTag:void 0;t.exports=function(t){var e=i.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(t){}var o=a.call(t);return r&&(e?t[s]=n:delete t[s]),o}},function(t,e){var n=Object.prototype.toString;t.exports=function(t){return n.call(t)}},function(t,e,n){var r=n(147),o=n(203),i=n(44),a=n(4),s=n(213);t.exports=function(t){return"function"==typeof t?t:null==t?i:"object"==typeof t?a(t)?o(t[0],t[1]):r(t):s(t)}},function(t,e,n){var r=n(148),o=n(202),i=n(82);t.exports=function(t){var e=o(t);return 1==e.length&&e[0][2]?i(e[0][0],e[0][1]):function(n){return n===t||r(n,t,e)}}},function(t,e,n){var r=n(66),o=n(70);t.exports=function(t,e,n,i){var a=n.length,s=a,c=!i;if(null==t)return!s;for(t=Object(t);a--;){var u=n[a];if(c&&u[2]?u[1]!==t[u[0]]:!(u[0]in t))return!1}for(;++a-1}},function(t,e,n){var r=n(18);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},function(t,e,n){var r=n(17);t.exports=function(){this.__data__=new r,this.size=0}},function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},function(t,e){t.exports=function(t){return this.__data__.get(t)}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(17),o=n(37),i=n(39);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new i(a)}return n.set(t,e),this.size=n.size,this}},function(t,e,n){var r=n(68),o=n(160),i=n(38),a=n(69),s=/^\[object .+?Constructor\]$/,c=Function.prototype,u=Object.prototype,l=c.toString,f=u.hasOwnProperty,p=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(r(t)?p:s).test(a(t))}},function(t,e,n){var r,o=n(161),i=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!i&&i in t}},function(t,e,n){var r=n(6)["__core-js_shared__"];t.exports=r},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e,n){var r=n(164),o=n(17),i=n(37);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(i||o),string:new r}}},function(t,e,n){var r=n(165),o=n(166),i=n(167),a=n(168),s=n(169);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}},function(t,e,n){var r=n(72),o=n(225),i=n(230),a=n(73),s=n(231),c=n(40);t.exports=function(t,e,n){var u=-1,l=o,f=t.length,p=!0,d=[],h=d;if(n)p=!1,l=i;else if(f>=200){var v=e?null:s(t);if(v)return c(v);p=!1,l=a,h=new r}else h=e?[]:d;t:for(;++u-1}},function(t,e,n){var r=n(227),o=n(228),i=n(229);t.exports=function(t,e,n){return e==e?i(t,e,n):r(t,o,n)}},function(t,e){t.exports=function(t,e,n,r){for(var o=t.length,i=n+(r?1:-1);r?i--:++i=0&&Math.floor(e)===e&&isFinite(t)}function v(t){return a(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function m(t){return null==t?"":Array.isArray(t)||p(t)&&t.toString===f?JSON.stringify(t,null,2):String(t)}function g(t){var e=parseFloat(t);return isNaN(e)?t:e}function y(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(r,1)}}var x=Object.prototype.hasOwnProperty;function w(t,e){return x.call(t,e)}function k(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var j=/-(\w)/g,C=k((function(t){return t.replace(j,(function(t,e){return e?e.toUpperCase():""}))})),O=k((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),S=/\B([A-Z])/g,$=k((function(t){return t.replace(S,"-$1").toLowerCase()}));var P=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function E(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function T(t,e){for(var n in e)t[n]=e[n];return t}function A(t){for(var e={},n=0;n0,Z=J&&J.indexOf("edge/")>0;J&&J.indexOf("android");var Q=J&&/iphone|ipad|ipod|ios/.test(J);J&&/chrome\/\d+/.test(J),J&&/phantomjs/.test(J);var tt,et=J&&J.match(/firefox\/(\d+)/),nt={}.watch,rt=!1;if(K)try{var ot={};Object.defineProperty(ot,"passive",{get:function(){rt=!0}}),window.addEventListener("test-passive",null,ot)}catch(t){}var it=function(){return void 0===tt&&(tt=!K&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),tt},at=K&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function st(t){return"function"==typeof t&&/native code/.test(t.toString())}var ct,ut="undefined"!=typeof Symbol&&st(Symbol)&&"undefined"!=typeof Reflect&&st(Reflect.ownKeys);ct="undefined"!=typeof Set&&st(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var lt=null;function ft(t){void 0===t&&(t=null),t||lt&<._scope.off(),lt=t,t&&t._scope.on()}var pt=function(){function t(t,e,n,r,o,i,a,s){this.tag=t,this.data=e,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),dt=function(t){void 0===t&&(t="");var e=new pt;return e.text=t,e.isComment=!0,e};function ht(t){return new pt(void 0,void 0,void 0,String(t))}function vt(t){var e=new pt(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}var mt=0,gt=[],yt=function(){function t(){this._pending=!1,this.id=mt++,this.subs=[]}return t.prototype.addSub=function(t){this.subs.push(t)},t.prototype.removeSub=function(t){this.subs[this.subs.indexOf(t)]=null,this._pending||(this._pending=!0,gt.push(this))},t.prototype.depend=function(e){t.target&&t.target.addDep(this)},t.prototype.notify=function(t){var e=this.subs.filter((function(t){return t}));for(var n=0,r=e.length;n0&&(Jt((u=t(u,"".concat(n||"","_").concat(r)))[0])&&Jt(f)&&(p[l]=ht(f.text+u[0].text),u.shift()),p.push.apply(p,u)):c(u)?Jt(f)?p[l]=ht(f.text+u):""!==u&&p.push(ht(u)):Jt(u)&&Jt(f)?p[l]=ht(f.text+u.text):(s(e._isVList)&&a(u.tag)&&i(u.key)&&a(n)&&(u.key="__vlist".concat(n,"_").concat(r,"__")),p.push(u)));return p}(t):void 0}function Jt(t){return a(t)&&a(t.text)&&!1===t.isComment}function Xt(t,e){var n,r,i,s,c=null;if(o(t)||"string"==typeof t)for(c=new Array(t.length),n=0,r=t.length;n0,s=e?!!e.$stable:!a,c=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&o&&o!==r&&c===o.$key&&!a&&!o.$hasNormal)return o;for(var u in i={},e)e[u]&&"$"!==u[0]&&(i[u]=ve(t,n,u,e[u]))}else i={};for(var l in n)l in i||(i[l]=me(n,l));return e&&Object.isExtensible(e)&&(e._normalized=i),q(i,"$stable",s),q(i,"$key",c),q(i,"$hasNormal",a),i}function ve(t,e,n,r){var i=function(){var e=lt;ft(t);var n=arguments.length?r.apply(null,arguments):r({}),i=(n=n&&"object"==typeof n&&!o(n)?[n]:Kt(n))&&n[0];return ft(e),n&&(!i||1===n.length&&i.isComment&&!de(i))?void 0:n};return r.proxy&&Object.defineProperty(e,n,{get:i,enumerable:!0,configurable:!0}),i}function me(t,e){return function(){return t[e]}}function ge(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy={};q(e,"_v_attr_proxy",!0),ye(e,t.$attrs,r,t,"$attrs")}return t._attrsProxy},get listeners(){t._listenersProxy||ye(t._listenersProxy={},t.$listeners,r,t,"$listeners");return t._listenersProxy},get slots(){return function(t){t._slotsProxy||_e(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(t)},emit:P(t.$emit,t),expose:function(e){e&&Object.keys(e).forEach((function(n){return Ut(t,e,n)}))}}}function ye(t,e,n,r,o){var i=!1;for(var a in e)a in t?e[a]!==n[a]&&(i=!0):(i=!0,be(t,a,r,o));for(var a in t)a in e||(i=!0,delete t[a]);return i}function be(t,e,n,r){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[r][e]}})}function _e(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}var xe=null;function we(t,e){return(t.__esModule||ut&&"Module"===t[Symbol.toStringTag])&&(t=t.default),l(t)?e.extend(t):t}function ke(t){if(o(t))for(var e=0;edocument.createEvent("Event").timeStamp&&(cn=function(){return un.now()})}var ln=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function fn(){var t,e;for(sn=cn(),on=!0,tn.sort(ln),an=0;anan&&tn[n].id>t.id;)n--;tn.splice(n+1,0,t)}else tn.push(t);rn||(rn=!0,Ne(fn))}}function dn(t,e){if(t){for(var n=Object.create(null),r=ut?Reflect.ownKeys(t):Object.keys(t),o=0;o-1)if(i&&!w(o,"default"))a=!1;else if(""===a||a===$(t)){var c=In(String,o.type);(c<0||s-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!d(t)&&t.test(e)}function Xn(t,e){var n=t.cache,r=t.keys,o=t._vnode;for(var i in n){var a=n[i];if(a){var s=a.name;s&&!e(s)&&Yn(n,i,r,o)}}}function Yn(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,_(n,e)}Wn.prototype._init=function(t){var e=this;e._uid=Vn++,e._isVue=!0,e.__v_skip=!0,e._scope=new Bt(!0),e._scope._vm=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Pn(qn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ke(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=fe(e._renderChildren,o),t.$scopedSlots=n?he(t.$parent,n.data.scopedSlots,t.$slots):r,t._c=function(e,n,r,o){return je(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return je(t,e,n,r,o,!0)};var i=n&&n.data;Tt(t,"$attrs",i&&i.attrs||r,null,!0),Tt(t,"$listeners",e._parentListeners||r,null,!0)}(e),Qe(e,"beforeCreate",void 0,!1),function(t){var e=dn(t.$options.inject,t);e&&(St(!1),Object.keys(e).forEach((function(n){Tt(t,n,e[n])})),St(!0))}(e),Nn(e),function(t){var e=t.$options.provide;if(e){var n=u(e)?e.call(t):e;if(!l(n))return;for(var r=zt(t),o=ut?Reflect.ownKeys(n):Object.keys(n),i=0;i1?E(n):n;for(var r=E(arguments,1),o='event handler for "'.concat(t,'"'),i=0,a=n.length;iparseInt(this.max)&&Yn(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Yn(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Xn(t,(function(t){return Jn(e,t)}))})),this.$watch("exclude",(function(e){Xn(t,(function(t){return!Jn(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=ke(t),n=e&&e.componentOptions;if(n){var r=Kn(n),o=this.include,i=this.exclude;if(o&&(!r||!Jn(o,r))||i&&r&&Jn(i,r))return e;var a=this.cache,s=this.keys,c=null==e.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):e.key;a[c]?(e.componentInstance=a[c].componentInstance,_(s,c),s.push(c)):(this.vnodeToCache=e,this.keyToCache=c),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return z}};Object.defineProperty(t,"config",e),t.util={warn:wn,extend:T,mergeOptions:Pn,defineReactive:Tt},t.set=At,t.delete=Rt,t.nextTick=Ne,t.observable=function(t){return Et(t),t},t.options=Object.create(null),F.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,T(t.options.components,Qn),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=E(arguments,1);return n.unshift(this),u(t.install)?t.install.apply(t,n):u(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Pn(this.options,t),this}}(t),Gn(t),function(t){F.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&p(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&u(n)&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(Wn),Object.defineProperty(Wn.prototype,"$isServer",{get:it}),Object.defineProperty(Wn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Wn,"FunctionalRenderContext",{value:hn}),Wn.version="2.7.15";var tr=y("style,class"),er=y("input,textarea,option,select,progress"),nr=y("contenteditable,draggable,spellcheck"),rr=y("events,caret,typing,plaintext-only"),or=y("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),ir="http://www.w3.org/1999/xlink",ar=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},sr=function(t){return ar(t)?t.slice(6,t.length):""},cr=function(t){return null==t||!1===t};function ur(t){for(var e=t.data,n=t,r=t;a(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=lr(r.data,e));for(;a(n=n.parent);)n&&n.data&&(e=lr(e,n.data));return function(t,e){if(a(t)||a(e))return fr(t,pr(e));return""}(e.staticClass,e.class)}function lr(t,e){return{staticClass:fr(t.staticClass,e.staticClass),class:a(t.class)?[t.class,e.class]:e.class}}function fr(t,e){return t?e?t+" "+e:t:e||""}function pr(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?Dr(t,e,n):or(e)?cr(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):nr(e)?t.setAttribute(e,function(t,e){return cr(e)||"false"===e?"false":"contenteditable"===t&&rr(e)?e:"true"}(e,n)):ar(e)?cr(n)?t.removeAttributeNS(ir,sr(e)):t.setAttributeNS(ir,e,n):Dr(t,e,n)}function Dr(t,e,n){if(cr(n))t.removeAttribute(e);else{if(X&&!Y&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var Mr={create:Lr,update:Lr};function Nr(t,e){var n=e.elm,r=e.data,o=t.data;if(!(i(r.staticClass)&&i(r.class)&&(i(o)||i(o.staticClass)&&i(o.class)))){var s=ur(e),c=n._transitionClasses;a(c)&&(s=fr(s,pr(c))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Ur,Fr={create:Nr,update:Nr};function Br(t,e,n){var r=Ur;return function o(){var i=e.apply(null,arguments);null!==i&&Vr(t,o,n,r)}}var zr=Ee&&!(et&&Number(et[1])<=53);function Hr(t,e,n,r){if(zr){var o=sn,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}Ur.addEventListener(t,e,rt?{capture:n,passive:r}:n)}function Vr(t,e,n,r){(r||Ur).removeEventListener(t,e._wrapper||e,n)}function qr(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=t.data.on||{};Ur=e.elm||t.elm,function(t){if(a(t.__r)){var e=X?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}a(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),qt(n,r,Hr,Vr,Br,e.context),Ur=void 0}}var Wr,Gr={create:qr,update:qr,destroy:function(t){return qr(t,kr)}};function Kr(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var n,r,o=e.elm,c=t.data.domProps||{},u=e.data.domProps||{};for(n in(a(u.__ob__)||s(u._v_attr_proxy))&&(u=e.data.domProps=T({},u)),c)n in u||(o[n]="");for(n in u){if(r=u[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===c[n])continue;1===o.childNodes.length&&o.removeChild(o.childNodes[0])}if("value"===n&&"PROGRESS"!==o.tagName){o._value=r;var l=i(r)?"":String(r);Jr(o,l)&&(o.value=l)}else if("innerHTML"===n&&vr(o.tagName)&&i(o.innerHTML)){(Wr=Wr||document.createElement("div")).innerHTML="".concat(r,"");for(var f=Wr.firstChild;o.firstChild;)o.removeChild(o.firstChild);for(;f.firstChild;)o.appendChild(f.firstChild)}else if(r!==c[n])try{o[n]=r}catch(t){}}}}function Jr(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(a(r)){if(r.number)return g(n)!==g(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var Xr={create:Kr,update:Kr},Yr=k((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function Zr(t){var e=Qr(t.style);return t.staticStyle?T(t.staticStyle,e):e}function Qr(t){return Array.isArray(t)?A(t):"string"==typeof t?Yr(t):t}var to,eo=/^--/,no=/\s*!important$/,ro=function(t,e,n){if(eo.test(e))t.style.setProperty(e,n);else if(no.test(n))t.style.setProperty($(e),n.replace(no,""),"important");else{var r=io(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(co).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" ".concat(t.getAttribute("class")||""," ");n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function lo(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(co).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" ".concat(t.getAttribute("class")||""," "),r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function fo(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&T(e,po(t.name||"v")),T(e,t),e}return"string"==typeof t?po(t):void 0}}var po=k((function(t){return{enterClass:"".concat(t,"-enter"),enterToClass:"".concat(t,"-enter-to"),enterActiveClass:"".concat(t,"-enter-active"),leaveClass:"".concat(t,"-leave"),leaveToClass:"".concat(t,"-leave-to"),leaveActiveClass:"".concat(t,"-leave-active")}})),ho=K&&!Y,vo="transition",mo="transitionend",go="animation",yo="animationend";ho&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(vo="WebkitTransition",mo="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(go="WebkitAnimation",yo="webkitAnimationEnd"));var bo=K?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function _o(t){bo((function(){bo(t)}))}function xo(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),uo(t,e))}function wo(t,e){t._transitionClasses&&_(t._transitionClasses,e),lo(t,e)}function ko(t,e,n){var r=Co(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?mo:yo,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout((function(){c0&&(n="transition",l=a,f=i.length):"animation"===e?u>0&&(n="animation",l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?"transition":"animation":null)?"transition"===n?i.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:"transition"===n&&jo.test(r[vo+"Property"])}}function Oo(t,e){for(;t.length1}function Ao(t,e){!0!==e.data.show&&$o(e)}var Ro=function(t){var e,n,r={},u=t.modules,l=t.nodeOps;for(e=0;eh?_(t,i(n[g+1])?null:n[g+1].elm,n,d,g,r):d>g&&w(e,f,h)}(f,v,g,n,u):a(g)?(a(t.text)&&l.setTextContent(f,""),_(f,null,g,0,g.length-1,n)):a(v)?w(v,0,v.length-1):a(t.text)&&l.setTextContent(f,""):t.text!==e.text&&l.setTextContent(f,e.text),a(h)&&a(d=h.hook)&&a(d=d.postpatch)&&d(t,e)}}}function O(t,e,n){if(s(n)&&a(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(D(No(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function Mo(t,e){return e.every((function(e){return!D(e,t)}))}function No(t){return"_value"in t?t._value:t.value}function Uo(t){t.target.composing=!0}function Fo(t){t.target.composing&&(t.target.composing=!1,Bo(t.target,"input"))}function Bo(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function zo(t){return!t.componentInstance||t.data&&t.data.transition?t:zo(t.componentInstance._vnode)}var Ho={model:Lo,show:{bind:function(t,e,n){var r=e.value,o=(n=zo(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,$o(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=zo(n)).data&&n.data.transition?(n.data.show=!0,r?$o(n,(function(){t.style.display=t.__vOriginalDisplay})):Po(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}}},Vo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function qo(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?qo(ke(e.children)):t}function Wo(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var r in o)e[C(r)]=o[r];return e}function Go(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var Ko=function(t){return t.tag||de(t)},Jo=function(t){return"show"===t.name},Xo={name:"transition",props:Vo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(Ko)).length){0;var r=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var i=qo(o);if(!i)return o;if(this._leaving)return Go(t,o);var a="__transition-".concat(this._uid,"-");i.key=null==i.key?i.isComment?a+"comment":a+i.tag:c(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var s=(i.data||(i.data={})).transition=Wo(this),u=this._vnode,l=qo(u);if(i.data.directives&&i.data.directives.some(Jo)&&(i.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(i,l)&&!de(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=T({},s);if("out-in"===r)return this._leaving=!0,Wt(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),Go(t,o);if("in-out"===r){if(de(i))return u;var p,d=function(){p()};Wt(s,"afterEnter",d),Wt(s,"enterCancelled",d),Wt(f,"delayLeave",(function(t){p=t}))}}return o}}},Yo=T({tag:String,moveClass:String},Vo);function Zo(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function Qo(t){t.data.newPos=t.elm.getBoundingClientRect()}function ti(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform="translate(".concat(r,"px,").concat(o,"px)"),i.transitionDuration="0s"}}delete Yo.mode;var ei={Transition:Xo,TransitionGroup:{props:Yo,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=Xe(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=Wo(this),s=0;s-1?gr[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:gr[t]=/HTMLUnknownElement/.test(e.toString())},T(Wn.options.directives,Ho),T(Wn.options.components,ei),Wn.prototype.__patch__=K?Ro:R,Wn.prototype.$mount=function(t,e){return function(t,e,n){var r;t.$el=e,t.$options.render||(t.$options.render=dt),Qe(t,"beforeMount"),r=function(){t._update(t._render(),n)},new Ve(t,r,R,{before:function(){t._isMounted&&!t._isDestroyed&&Qe(t,"beforeUpdate")}},!0),n=!1;var o=t._preWatchers;if(o)for(var i=0;i=0&&(e=t.slice(r),t=t.slice(0,r));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}(o.path||""),u=e&&e.path||"/",l=c.path?wi(c.path,u,n||o.append):u,f=function(t,e,n){void 0===e&&(e={});var r,o=n||ui;try{r=o(t||"")}catch(t){r={}}for(var i in e){var a=e[i];r[i]=Array.isArray(a)?a.map(ci):ci(a)}return r}(c.query,o.query,r&&r.options.parseQuery),p=o.hash||c.hash;return p&&"#"!==p.charAt(0)&&(p="#"+p),{_normalized:!0,path:l,query:f,hash:p}}var Hi,Vi=function(){},qi={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),i=o.location,a=o.route,s=o.href,c={},u=n.options.linkActiveClass,l=n.options.linkExactActiveClass,f=null==u?"router-link-active":u,p=null==l?"router-link-exact-active":l,d=null==this.activeClass?f:this.activeClass,h=null==this.exactActiveClass?p:this.exactActiveClass,v=a.redirectedFrom?pi(null,zi(a.redirectedFrom),null,n):a;c[h]=gi(r,v,this.exactPath),c[d]=this.exact||this.exactPath?c[h]:function(t,e){return 0===t.path.replace(fi,"/").indexOf(e.path.replace(fi,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,v);var m=c[h]?this.ariaCurrentValue:null,g=function(t){Wi(t)&&(e.replace?n.replace(i,Vi):n.push(i,Vi))},y={click:Wi};Array.isArray(this.event)?this.event.forEach((function(t){y[t]=g})):y[this.event]=g;var b={class:c},_=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:s,route:a,navigate:g,isActive:c[d],isExactActive:c[h]});if(_){if(1===_.length)return _[0];if(_.length>1||!_.length)return 0===_.length?t():t("span",{},_)}if("a"===this.tag)b.on=y,b.attrs={href:s,"aria-current":m};else{var x=function t(e){var n;if(e)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=Bi(l.path,s.params),c(l,s,a)}if(s.path){s.params={};for(var d=0;d-1}function ka(t,e){return wa(t)&&t._isRouter&&(null==e||t.type===e)}function ja(t,e,n){var r=function(o){o>=t.length?n():t[o]?e(t[o],(function(){r(o+1)})):r(o+1)};r(0)}function Ca(t){return function(e,n,r){var o=!1,i=0,a=null;Oa(t,(function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){o=!0,i++;var c,u=Pa((function(e){var o;((o=e).__esModule||$a&&"Module"===o[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:Hi.extend(e),n.components[s]=e,--i<=0&&r()})),l=Pa((function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=wa(t)?t:new Error(e),r(a))}));try{c=t(u,l)}catch(t){l(t)}if(c)if("function"==typeof c.then)c.then(u,l);else{var f=c.component;f&&"function"==typeof f.then&&f.then(u,l)}}})),o||r()}}function Oa(t,e){return Sa(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function Sa(t){return Array.prototype.concat.apply([],t)}var $a="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Pa(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var Ea=function(t,e){this.router=t,this.base=function(t){if(!t)if(Gi){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=hi,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Ta(t,e,n,r){var o=Oa(t,(function(t,r,o,i){var a=function(t,e){"function"!=typeof t&&(t=Hi.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map((function(t){return n(t,r,o,i)})):n(a,r,o,i)}));return Sa(r?o.reverse():o)}function Aa(t,e){if(e)return function(){return t.apply(e,arguments)}}Ea.prototype.listen=function(t){this.cb=t},Ea.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Ea.prototype.onError=function(t){this.errorCbs.push(t)},Ea.prototype.transitionTo=function(t,e,n){var r,o=this;try{r=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var i=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),e&&e(r),o.ensureURL(),o.router.afterHooks.forEach((function(t){t&&t(r,i)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(t){t(r)})))}),(function(t){n&&n(t),t&&!o.ready&&(ka(t,ga.redirected)&&i===hi||(o.ready=!0,o.readyErrorCbs.forEach((function(e){e(t)}))))}))},Ea.prototype.confirmTransition=function(t,e,n){var r=this,o=this.current;this.pending=t;var i,a,s=function(t){!ka(t)&&wa(t)&&(r.errorCbs.length?r.errorCbs.forEach((function(e){e(t)})):console.error(t)),n&&n(t)},c=t.matched.length-1,u=o.matched.length-1;if(gi(t,o)&&c===u&&t.matched[c]===o.matched[u])return this.ensureURL(),t.hash&&ia(this.router,o,t,!1),s(((a=_a(i=o,t,ga.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",a));var l=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,r=ha&&n;r&&this.listeners.push(oa());var o=function(){var n=t.current,o=La(t.base);t.current===hi&&o===t._startLocation||t.transitionTo(o,(function(t){r&&ia(e,t,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){va(ki(r.base+t.fullPath)),ia(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){ma(ki(r.base+t.fullPath)),ia(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if(La(this.base)!==this.current.fullPath){var e=ki(this.base+this.current.fullPath);t?va(e):ma(e)}},e.prototype.getCurrentLocation=function(){return La(this.base)},e}(Ea);function La(t){var e=window.location.pathname,n=e.toLowerCase(),r=t.toLowerCase();return!t||n!==r&&0!==n.indexOf(ki(r+"/"))||(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var Ia=function(t){function e(e,n,r){t.call(this,e,n),r&&function(t){var e=La(t);if(!/^\/#/.test(e))return window.location.replace(ki(t+"/#"+e)),!0}(this.base)||Da()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=ha&&e;n&&this.listeners.push(oa());var r=function(){var e=t.current;Da()&&t.transitionTo(Ma(),(function(r){n&&ia(t.router,r,e,!0),ha||Fa(r.fullPath)}))},o=ha?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Ua(t.fullPath),ia(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Fa(t.fullPath),ia(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Ma()!==e&&(t?Ua(e):Fa(e))},e.prototype.getCurrentLocation=function(){return Ma()},e}(Ea);function Da(){var t=Ma();return"/"===t.charAt(0)||(Fa("/"+t),!1)}function Ma(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Na(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Ua(t){ha?va(Na(t)):window.location.hash=t}function Fa(t){ha?ma(Na(t)):window.location.replace(Na(t))}var Ba=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var t=e.current;e.index=n,e.updateRoute(r),e.router.afterHooks.forEach((function(e){e&&e(r,t)}))}),(function(t){ka(t,ga.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Ea),za=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Xi(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!ha&&!1!==t.fallback,this.fallback&&(e="hash"),Gi||(e="abstract"),this.mode=e,e){case"history":this.history=new Ra(this,t.base);break;case"hash":this.history=new Ia(this,t.base,this.fallback);break;case"abstract":this.history=new Ba(this,t.base);break;default:0}},Ha={currentRoute:{configurable:!0}};za.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},Ha.currentRoute.get=function(){return this.history&&this.history.current},za.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof Ra||n instanceof Ia){var r=function(t){n.setupListeners(),function(t){var r=n.current,o=e.options.scrollBehavior;ha&&o&&"fullPath"in t&&ia(e,t,r,!1)}(t)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},za.prototype.beforeEach=function(t){return qa(this.beforeHooks,t)},za.prototype.beforeResolve=function(t){return qa(this.resolveHooks,t)},za.prototype.afterEach=function(t){return qa(this.afterHooks,t)},za.prototype.onReady=function(t,e){this.history.onReady(t,e)},za.prototype.onError=function(t){this.history.onError(t)},za.prototype.push=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.push(t,e,n)}));this.history.push(t,e,n)},za.prototype.replace=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.replace(t,e,n)}));this.history.replace(t,e,n)},za.prototype.go=function(t){this.history.go(t)},za.prototype.back=function(){this.go(-1)},za.prototype.forward=function(){this.go(1)},za.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},za.prototype.resolve=function(t,e,n){var r=zi(t,e=e||this.history.current,n,this),o=this.match(r,e),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?ki(t+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},za.prototype.getRoutes=function(){return this.matcher.getRoutes()},za.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==hi&&this.history.transitionTo(this.history.getCurrentLocation())},za.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==hi&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(za.prototype,Ha);var Va=za;function qa(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}za.install=function t(e){if(!t.installed||Hi!==e){t.installed=!0,Hi=e;var n=function(t){return void 0!==t},r=function(t,e){var r=t.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",_i),e.component("RouterLink",qi);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},za.version="3.6.5",za.isNavigationFailure=ka,za.NavigationFailureType=ga,za.START_LOCATION=hi,Gi&&window.Vue&&window.Vue.use(za);n(97);n(90),n(127);var Wa={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(13)]).then(n.bind(null,308)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(14)]).then(n.bind(null,254)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(21)]).then(n.bind(null,242)),"components/Home":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,280)),"components/NavLink":()=>n.e(25).then(n.bind(null,241)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(12)]).then(n.bind(null,265)),"components/Navbar":()=>Promise.all([n.e(0),n.e(1)]).then(n.bind(null,305)),"components/Page":()=>Promise.all([n.e(0),n.e(11)]).then(n.bind(null,281)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,267)),"components/PageNav":()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,268)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,282)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(22)]).then(n.bind(null,283)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,266)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(18)]).then(n.bind(null,255)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,253)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,313)),"global-components/CodeBlock":()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,309)),"global-components/CodeGroup":()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,310)),"layouts/404":()=>n.e(7).then(n.bind(null,311)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,312)),NotFound:()=>n.e(7).then(n.bind(null,311)),Layout:()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,312))},Ga={"v-fcaee82c":()=>n.e(27).then(n.bind(null,314)),"v-521d0df1":()=>n.e(30).then(n.bind(null,315)),"v-417fbacc":()=>n.e(28).then(n.bind(null,316)),"v-5f150af1":()=>n.e(29).then(n.bind(null,317)),"v-7d8bc471":()=>n.e(33).then(n.bind(null,318)),"v-2eb50c51":()=>n.e(32).then(n.bind(null,319)),"v-19acc40c":()=>n.e(31).then(n.bind(null,320)),"v-34e510f1":()=>n.e(35).then(n.bind(null,321)),"v-4353dfb0":()=>n.e(34).then(n.bind(null,322)),"v-1ade78de":()=>n.e(36).then(n.bind(null,323)),"v-8414eba6":()=>n.e(38).then(n.bind(null,324)),"v-43d9719a":()=>n.e(39).then(n.bind(null,325)),"v-3c301296":()=>n.e(37).then(n.bind(null,326)),"v-1cbb5e11":()=>n.e(23).then(n.bind(null,327)),"v-1fdc454c":()=>n.e(43).then(n.bind(null,328)),"v-8f639d5e":()=>n.e(42).then(n.bind(null,329)),"v-2d6a36d1":()=>n.e(40).then(n.bind(null,330)),"v-57ec701e":()=>n.e(26).then(n.bind(null,331)),"v-730240d1":()=>n.e(46).then(n.bind(null,332)),"v-60c0654a":()=>n.e(45).then(n.bind(null,333)),"v-06c44011":()=>n.e(44).then(n.bind(null,334)),"v-3c8cc3b1":()=>n.e(24).then(n.bind(null,335)),"v-05d756b1":()=>n.e(47).then(n.bind(null,336)),"v-664433ef":()=>n.e(41).then(n.bind(null,337)),"v-d502c95a":()=>n.e(48).then(n.bind(null,338)),"v-9cfb8b42":()=>n.e(20).then(n.bind(null,339)),"v-11d7f331":()=>n.e(49).then(n.bind(null,340)),"v-0dcba126":()=>n.e(50).then(n.bind(null,341)),"v-7ea63fb1":()=>n.e(19).then(n.bind(null,342)),"v-2c134f7a":()=>n.e(51).then(n.bind(null,343)),"v-8ac9de1e":()=>n.e(52).then(n.bind(null,344)),"v-5b6a3f1e":()=>n.e(53).then(n.bind(null,345))};function Ka(t){const e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}const Ja=/-(\w)/g,Xa=Ka(t=>t.replace(Ja,(t,e)=>e?e.toUpperCase():"")),Ya=/\B([A-Z])/g,Za=Ka(t=>t.replace(Ya,"-$1").toLowerCase()),Qa=Ka(t=>t.charAt(0).toUpperCase()+t.slice(1));function ts(t,e){if(!e)return;if(t(e))return t(e);return e.includes("-")?t(Qa(Xa(e))):t(Qa(e))||t(Za(e))}const es=Object.assign({},Wa,Ga),ns=t=>es[t],rs=t=>Ga[t],os=t=>Wa[t],is=t=>Wn.component(t);function as(t){return ts(rs,t)}function ss(t){return ts(os,t)}function cs(t){return ts(ns,t)}function us(t){return ts(is,t)}function ls(...t){return Promise.all(t.filter(t=>t).map(async t=>{if(!us(t)&&cs(t)){const e=await cs(t)();Wn.component(t,e.default)}}))}function fs(t,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[t]=e)}var ps=n(87),ds=n.n(ps),hs=n(88),vs=n.n(hs),ms={created(){if(this.siteMeta=this.$site.headTags.filter(([t])=>"meta"===t).map(([t,e])=>e),this.$ssrContext){const e=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(t=e)?t.map(t=>{let e="{e+=` ${n}="${vs()(t[n])}"`}),e+">"}).join("\n "):"",this.$ssrContext.canonicalLink=ys(this.$canonicalUrl)}var t},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const t=this.getMergedMetaTags();this.currentMetaTags=bs(t,this.currentMetaTags)},getMergedMetaTags(){const t=this.$page.frontmatter.meta||[];return ds()([{name:"description",content:this.$description}],t,this.siteMeta,_s)},updateCanonicalLink(){gs(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",ys(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){bs(null,this.currentMetaTags),gs()}};function gs(){const t=document.querySelector("link[rel='canonical']");t&&t.remove()}function ys(t=""){return t?``:""}function bs(t,e){if(e&&[...e].filter(t=>t.parentNode===document.head).forEach(t=>document.head.removeChild(t)),t)return t.map(t=>{const e=document.createElement("meta");return Object.keys(t).forEach(n=>{e.setAttribute(n,t[n])}),document.head.appendChild(e),e})}function _s(t){for(const e of["name","property","itemprop"])if(t.hasOwnProperty(e))return t[e]+e;return JSON.stringify(t)}var xs=n(89),ws={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(xs)()((function(){this.setActiveHash()}),300),setActiveHash(){const t=[].slice.call(document.querySelectorAll(".sidebar-link")),e=[].slice.call(document.querySelectorAll(".header-anchor")).filter(e=>t.some(t=>t.hash===e.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let t=0;t=i.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},ks=n(22),js=n.n(ks),Cs=[ms,ws,{mounted(){js.a.configure({showSpinner:!1}),this.$router.beforeEach((t,e,n)=>{t.path===e.path||Wn.component(t.name)||js.a.start(),n()}),this.$router.afterEach(()=>{js.a.done(),this.isSidebarOpen=!1})}}],Os={name:"GlobalLayout",computed:{layout(){const t=this.getLayout();return fs("layout",t),Wn.component(t)}},methods:{getLayout(){if(this.$page.path){const t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}}},Ss=n(14),$s=Object(Ss.a)(Os,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(t,e,n){switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),t[e].push(...n);break;default:throw new Error("Unknown option name.")}}($s,"mixins",Cs);const Ps=[{name:"v-fcaee82c",path:"/",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-fcaee82c").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-521d0df1",path:"/guide/javascript/js-study-notes.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-521d0df1").then(n)}},{name:"v-417fbacc",path:"/guide/javascript/",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-417fbacc").then(n)}},{path:"/guide/javascript/index.html",redirect:"/guide/javascript/"},{name:"v-5f150af1",path:"/guide/javascript/js-array.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-5f150af1").then(n)}},{name:"v-7d8bc471",path:"/guide/nextjs/nextjs-study-notes.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-7d8bc471").then(n)}},{name:"v-2eb50c51",path:"/guide/nextjs/nextjs-basic.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-2eb50c51").then(n)}},{name:"v-19acc40c",path:"/guide/nextjs/",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-19acc40c").then(n)}},{path:"/guide/nextjs/index.html",redirect:"/guide/nextjs/"},{name:"v-34e510f1",path:"/guide/react/react-study-notes.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-34e510f1").then(n)}},{name:"v-4353dfb0",path:"/guide/react/",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-4353dfb0").then(n)}},{path:"/guide/react/index.html",redirect:"/guide/react/"},{name:"v-1ade78de",path:"/guide/react/reactBasics.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-1ade78de").then(n)}},{name:"v-8414eba6",path:"/guide/react/reactRedux.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-8414eba6").then(n)}},{name:"v-43d9719a",path:"/guide/typescript/",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-43d9719a").then(n)}},{path:"/guide/typescript/index.html",redirect:"/guide/typescript/"},{name:"v-3c301296",path:"/guide/react/reactHooks.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-3c301296").then(n)}},{name:"v-1cbb5e11",path:"/guide/react/reactRouter.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-1cbb5e11").then(n)}},{name:"v-1fdc454c",path:"/memo/",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-1fdc454c").then(n)}},{path:"/memo/index.html",redirect:"/memo/"},{name:"v-8f639d5e",path:"/memo/Formik.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-8f639d5e").then(n)}},{name:"v-2d6a36d1",path:"/guide/typescript/advanced.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-2d6a36d1").then(n)}},{name:"v-57ec701e",path:"/memo/gitRealted.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-57ec701e").then(n)}},{name:"v-730240d1",path:"/memo/config.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-730240d1").then(n)}},{name:"v-60c0654a",path:"/memo/axios.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-60c0654a").then(n)}},{name:"v-06c44011",path:"/memo/arrayusage.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-06c44011").then(n)}},{name:"v-3c8cc3b1",path:"/memo/strapi.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-3c8cc3b1").then(n)}},{name:"v-05d756b1",path:"/memo/reacthooks.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-05d756b1").then(n)}},{name:"v-664433ef",path:"/guide/typescript/basic.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-664433ef").then(n)}},{name:"v-d502c95a",path:"/memo/tswithreact.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-d502c95a").then(n)}},{name:"v-9cfb8b42",path:"/memo/redux.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-9cfb8b42").then(n)}},{name:"v-11d7f331",path:"/memo/typescript.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-11d7f331").then(n)}},{name:"v-0dcba126",path:"/memo/webpack.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-0dcba126").then(n)}},{name:"v-7ea63fb1",path:"/memo/jsreview.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-7ea63fb1").then(n)}},{name:"v-2c134f7a",path:"/practice/",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-2c134f7a").then(n)}},{path:"/practice/index.html",redirect:"/practice/"},{name:"v-8ac9de1e",path:"/practice/shoppingcart.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-8ac9de1e").then(n)}},{name:"v-5b6a3f1e",path:"/practice/todolist.html",component:$s,beforeEnter:(t,e,n)=>{ls("Layout","v-5b6a3f1e").then(n)}},{path:"*",component:$s}],Es={title:"☻ itsyuimorii.space",description:" ",base:"/",headTags:[],pages:[{title:"Home",frontmatter:{home:!0,heroImage:"./logo.jpg",heroText:"itsyuimoriispace〰️",tagline:"私の技術ブログ - for sharing personal learning notes from 📚学び、💢知識、🪴成長する。",actionText:"Read more →",actionLink:"/zh/guide/",features:[{title:"📚 読書メモ",details:"Reading is a discount ticket to everywhere. - Mary Schmich"},{title:"📩 知識を共有する",details:"In the process of letting go you will lose many things from the past, but you will find yourself. - Deepak Chopra"},{title:"🪴 成長する",details:"The key to growth is the introduction of higher dimensions of consciousness into our awareness. - Lao Tzu"}],footer:"MIT Licensed | Copyright © 2022-present ♥ itsyuimoriispace"},regularPath:"/",relativePath:"README.md",key:"v-fcaee82c",path:"/"},{title:"⚪️ Javascript -articles の研究例をいくつか",frontmatter:{sidebarDepth:3},regularPath:"/guide/javascript/js-study-notes.html",relativePath:"guide/javascript/js-study-notes.md",key:"v-521d0df1",path:"/guide/javascript/js-study-notes.html"},{title:"Javascript guide",frontmatter:{},regularPath:"/guide/javascript/",relativePath:"guide/javascript/README.md",key:"v-417fbacc",path:"/guide/javascript/"},{title:"⚪️ 【JavaScript 入門】 配列の使い方と操作まとめ(初期化・追加・結合・検索・削除)",frontmatter:{sidebarDepth:3},regularPath:"/guide/javascript/js-array.html",relativePath:"guide/javascript/js-array.md",key:"v-5f150af1",path:"/guide/javascript/js-array.html",headers:[{level:2,title:"🔶 【実践】「配列」の活用技",slug:"🔶-【実践】「配列」の活用技"},{level:2,title:"🔶 方法详解",slug:"🔶-方法详解"},{level:3,title:"🔸 1. push()",slug:"🔸-1-push"},{level:3,title:"🔸 2. unshift()",slug:"🔸-2-unshift"},{level:3,title:"🔸 3. pop()",slug:"🔸-3-pop"},{level:3,title:"🔸 4. shift()",slug:"🔸-4-shift"},{level:3,title:"🔸 5. reverse()",slug:"🔸-5-reverse"},{level:3,title:"🔸 6. sort()",slug:"🔸-6-sort"},{level:3,title:"🔸 7. splice()",slug:"🔸-7-splice"},{level:3,title:"为什么需要深拷贝?",slug:"为什么需要深拷贝"},{level:3,title:"正确的做法",slug:"正确的做法"},{level:3,title:"🔸 8. concat()",slug:"🔸-8-concat"},{level:3,title:"🔸 9. join()",slug:"🔸-9-join"},{level:3,title:"🔸 10. slice()",slug:"🔸-10-slice"},{level:3,title:"🔸 11. toString()",slug:"🔸-11-tostring"},{level:3,title:"🔸 12. valueOf()",slug:"🔸-12-valueof"},{level:3,title:"🔸 13. indexOf()",slug:"🔸-13-indexof"},{level:3,title:"🔸 14. lastIndexOf()",slug:"🔸-14-lastindexof"},{level:3,title:"🔸 15. forEach()",slug:"🔸-15-foreach"},{level:3,title:"🔸 16. map()",slug:"🔸-16-map"},{level:3,title:"🔸 17. filter()",slug:"🔸-17-filter"},{level:3,title:"🔸 18. every()",slug:"🔸-18-every"},{level:3,title:"🔸 19. some()",slug:"🔸-19-some"},{level:3,title:"🔸 20. reduce()",slug:"🔸-20-reduce"},{level:3,title:"🔸 21. reduceRight()",slug:"🔸-21-reduceright"},{level:3,title:"🔸 22. includes()",slug:"🔸-22-includes"},{level:3,title:"23.🔸 from()",slug:"_23-🔸-from"},{level:3,title:"24. 🔸 find()",slug:"_24-🔸-find"},{level:3,title:"25. 🔸 findIndex()",slug:"_25-🔸-findindex"},{level:3,title:"26. 🔸 fill()",slug:"_26-🔸-fill"},{level:3,title:"27. 🔸 flat()",slug:"_27-🔸-flat"},{level:3,title:"28. 🔸 flatMap()",slug:"_28-🔸-flatmap"}]},{title:"⚪️ Next.js-articles の研究例をいくつか",frontmatter:{sidebarDepth:3},regularPath:"/guide/nextjs/nextjs-study-notes.html",relativePath:"guide/nextjs/nextjs-study-notes.md",key:"v-7d8bc471",path:"/guide/nextjs/nextjs-study-notes.html",headers:[{level:2,title:"🔸 ext.js 13 的 app 目录模式功能梳理 文章連結",slug:"🔸-ext-js-13-的-app-目录模式功能梳理-文章連結"},{level:3,title:"约定页面相关内容",slug:"约定页面相关内容"},{level:3,title:"平行路由和插槽功能",slug:"平行路由和插槽功能"},{level:2,title:"🔹 Next.js 中的渲染模式文章連結",slug:"🔹-next-js-中的渲染模式文章連結"},{level:2,title:"🔸 理解前端基础渲染模式| CSR、SSR、同构、静态化文章連結",slug:"🔸-理解前端基础渲染模式-csr、ssr、同构、静态化文章連結"},{level:3,title:"什麼是渲染?",slug:"什麼是渲染"},{level:3,title:"客户端渲染(CSR)",slug:"客户端渲染-csr"},{level:3,title:"服务端渲染(SSR)",slug:"服务端渲染-ssr"},{level:3,title:"同构渲染(SSR + CSR)",slug:"同构渲染-ssr-csr"},{level:2,title:"快速理解 Next.js 中各种渲染方式的作用及区别(SSG、SSR、ISR、CSR文章連結",slug:"快速理解-next-js-中各种渲染方式的作用及区别-ssg、ssr、isr、csr文章連結"},{level:2,title:"🔸 快速理解 Next.js 中数据获取方式的作用及区别(getInitialProps、getSer verSideProps、getStaticProps文章連結",slug:"🔸-快速理解-next-js-中数据获取方式的作用及区别-getinitialprops、getser-versideprops、getstaticprops文章連結"},{level:2,title:"🔸 一起来学 next.js - API 路由篇文章連結",slug:"🔸-一起来学-next-js-api-路由篇文章連結"}]},{title:"⚪️ Next.js を基礎から理解する",frontmatter:{sidebarDepth:3},regularPath:"/guide/nextjs/nextjs-basic.html",relativePath:"guide/nextjs/nextjs-basic.md",key:"v-2eb50c51",path:"/guide/nextjs/nextjs-basic.html"},{title:"Next.js",frontmatter:{},regularPath:"/guide/nextjs/",relativePath:"guide/nextjs/README.md",key:"v-19acc40c",path:"/guide/nextjs/"},{title:"⚪️ React.js -articles の研究例をいくつか",frontmatter:{sidebarDepth:3},regularPath:"/guide/react/react-study-notes.html",relativePath:"guide/react/react-study-notes.md",key:"v-34e510f1",path:"/guide/react/react-study-notes.html",headers:[{level:2,title:"🔸 React SSR 原理解析和实践",slug:"🔸-react-ssr-原理解析和实践"},{level:2,title:"🔸 从零开始 React 服务器渲染(SSR)同构 😏(基于 Koa",slug:"🔸-从零开始-react-服务器渲染-ssr-同构-😏-基于-koa"},{level:2,title:"🔸 React 服务端渲染从入门到精通",slug:"🔸-react-服务端渲染从入门到精通"}]},{title:"React",frontmatter:{},regularPath:"/guide/react/",relativePath:"guide/react/README.md",key:"v-4353dfb0",path:"/guide/react/",headers:[{level:2,title:"References",slug:"references"}]},{title:"⚪️React を基礎から理解する",frontmatter:{sidebarDepth:3},regularPath:"/guide/react/reactBasics.html",relativePath:"guide/react/reactBasics.md",key:"v-1ade78de",path:"/guide/react/reactBasics.html",headers:[{level:2,title:"🔶 React API とは",slug:"🔶-react-api-とは"},{level:2,title:"🔶 React API の種類",slug:"🔶-react-api-の種類"},{level:3,title:"▫️ React.createElement",slug:"▫️-react-createelement"},{level:3,title:"▫️ReactDOM.createRoot",slug:"▫️reactdom-createroot"},{level:3,title:"▫️ReactDOM.render",slug:"▫️reactdom-render"}]},{title:"React Redux を基礎から理解する",frontmatter:{sidebarDepth:3},regularPath:"/guide/react/reactRedux.html",relativePath:"guide/react/reactRedux.md",key:"v-8414eba6",path:"/guide/react/reactRedux.html"},{title:"Typescript Reference Guide",frontmatter:{},regularPath:"/guide/typescript/",relativePath:"guide/typescript/README.md",key:"v-43d9719a",path:"/guide/typescript/",headers:[{level:2,title:"Shortcut Reference",slug:"shortcut-reference"},{level:2,title:"Table of Contents",slug:"table-of-contents"}]},{title:"⚪️ React Hooks を基礎から理解する",frontmatter:{sidebarDepth:3},regularPath:"/guide/react/reactHooks.html",relativePath:"guide/react/reactHooks.md",key:"v-3c301296",path:"/guide/react/reactHooks.html",headers:[{level:2,title:"🔷 useState とは",slug:"🔷-usestate-とは"},{level:3,title:"▫️ useState の注意点",slug:"▫️-usestate-の注意点"},{level:2,title:"🔶 useReducer とは",slug:"🔶-usereducer-とは"},{level:3,title:"▫️ useReducer の注意点",slug:"▫️-usereducer-の注意点"},{level:2,title:"🔷 useContext とは",slug:"🔷-usecontext-とは"},{level:2,title:"🔷 useEffect とは",slug:"🔷-useeffect-とは"},{level:3,title:"▫️ 副作用を実行、制御するために useEffect を利用する",slug:"▫️-副作用を実行、制御するために-useeffect-を利用する"},{level:3,title:"▫️ 執行時機",slug:"▫️-執行時機"},{level:3,title:"▫️ useEffect の使い方",slug:"▫️-useeffect-の使い方"},{level:3,title:"▫️ useEffect 依賴項",slug:"▫️-useeffect-依賴項"},{level:2,title:"🔷 useRef とは",slug:"🔷-useref-とは"},{level:2,title:"🔷 useCallback とは",slug:"🔷-usecallback-とは"},{level:3,title:"🔺 Example",slug:"🔺-example"},{level:2,title:"🔷 useMemo とは",slug:"🔷-usememo-とは"},{level:2,title:"🔶 Hooks compare",slug:"🔶-hooks-compare"},{level:3,title:"▫️ useCallback vs useMemo",slug:"▫️-usecallback-vs-usememo"}]},{title:"⚪️ React Router を基礎から理解する",frontmatter:{sidebarDepth:3},regularPath:"/guide/react/reactRouter.html",relativePath:"guide/react/reactRouter.md",key:"v-1cbb5e11",path:"/guide/react/reactRouter.html",headers:[{level:2,title:"🔶 Basic Purpose",slug:"🔶-basic-purpose"},{level:2,title:"🔶 様々なシーン",slug:"🔶-様々なシーン"},{level:3,title:"▫️ Takeaway 01: 理解匹配失敗的處理: 對象useRouteError() 和 errorElement",slug:"▫️-takeaway-01-理解匹配失敗的處理-對象userouteerror-和-errorelement"},{level:3,title:"▫️ Takeaway 02: 理解 nested-routes的概念",slug:"▫️-takeaway-02-理解-nested-routes的概念"},{level:3,title:"▫️ Takeaway 03: 👉 将侧边栏更改",slug:"▫️-takeaway-03-👉-将侧边栏更改-a-href-为-link-to"},{level:2,title:"🔶 loader and action",slug:"🔶-loader-and-action"},{level:3,title:"▫️ Takeaway 01: 傳統式 form 表單的提交",slug:"▫️-takeaway-01-傳統式-form-表單的提交"},{level:3,title:"▫️ Takeaway 02: 理解 loader and actionß",slug:"▫️-takeaway-02-理解-loader-and-actionß"},{level:2,title:"🔶 URL params in Loader",slug:"🔶-url-params-in-loader"},{level:2,title:"🔶 Updating data",slug:"🔶-updating-data"}]},{title:"🔺 MEMO メモ",frontmatter:{},regularPath:"/memo/",relativePath:"memo/README.md",key:"v-1fdc454c",path:"/memo/",headers:[{level:3,title:"🔺 react",slug:"🔺-react"},{level:3,title:"🔺 reactHooks",slug:"🔺-reacthooks"},{level:3,title:"🔺 typescript",slug:"🔺-typescript"}]},{title:"Formik & Yup",frontmatter:{},regularPath:"/memo/Formik.html",relativePath:"memo/Formik.md",key:"v-8f639d5e",path:"/memo/Formik.html"},{title:"⚪️ TypeScript Advanced Knowledge",frontmatter:{sidebarDepth:3},regularPath:"/guide/typescript/advanced.html",relativePath:"guide/typescript/advanced.md",key:"v-2d6a36d1",path:"/guide/typescript/advanced.html",headers:[{level:2,title:"Type Aliases",slug:"type-aliases"},{level:2,title:"String Literal Types",slug:"string-literal-types"},{level:2,title:"Tuples",slug:"tuples"},{level:3,title:"Accessing Tuple Elements",slug:"accessing-tuple-elements"},{level:3,title:"Tuple Overflow",slug:"tuple-overflow"},{level:2,title:"Enum",slug:"enum"},{level:3,title:"Incremental Enum:",slug:"incremental-enum"},{level:3,title:"String Enum:",slug:"string-enum"},{level:3,title:"heterogeneous enum",slug:"heterogeneous-enum"},{level:3,title:"interface enum",slug:"interface-enum"},{level:3,title:"const enum",slug:"const-enum"},{level:3,title:"Reverse mapping",slug:"reverse-mapping"},{level:2,title:"Classes",slug:"classes"},{level:3,title:"readonly",slug:"readonly"},{level:3,title:"Instance Properties",slug:"instance-properties"},{level:3,title:"Static Properties",slug:"static-properties"},{level:3,title:"Access Modifiers",slug:"access-modifiers"},{level:3,title:"Getters and Setters",slug:"getters-and-setters"},{level:3,title:"Abstract Classes",slug:"abstract-classes"},{level:3,title:"Here are a few common scenarios where abstract classes are beneficial in TypeScript:",slug:"here-are-a-few-common-scenarios-where-abstract-classes-are-beneficial-in-typescript"},{level:2,title:"Class and Interface Interactions",slug:"class-and-interface-interactions"},{level:3,title:"Class Implements Interface",slug:"class-implements-interface"},{level:2,title:"generators and iterators",slug:"generators-and-iterators"},{level:3,title:"Iterators",slug:"iterators"},{level:3,title:"Generators",slug:"generators"},{level:3,title:"Using Generators and Iterators",slug:"using-generators-and-iterators"},{level:2,title:"Generics",slug:"generics"},{level:3,title:"Basic Usage",slug:"basic-usage"},{level:3,title:"Multiple Type Parameters",slug:"multiple-type-parameters"},{level:3,title:"Generic Constraints",slug:"generic-constraints"},{level:3,title:"Generic Interface",slug:"generic-interface"},{level:3,title:"Generic Class",slug:"generic-class"},{level:3,title:"Default Generic Types",slug:"default-generic-types"},{level:3,title:"More Generics",slug:"more-generics"},{level:2,title:"Common Techniques",slug:"common-techniques"},{level:3,title:"Extracting Variable Types",slug:"extracting-variable-types"},{level:3,title:"Binding Function this",slug:"binding-function-this"},{level:3,title:"Index Variables",slug:"index-variables"},{level:3,title:"Built-in Types",slug:"built-in-types"},{level:3,title:"🔹 index signature",slug:"🔹-index-signature"},{level:3,title:"Accessing object properties dynamically in TypeScript",slug:"accessing-object-properties-dynamically-in-typescript"},{level:2,title:"Reference Articles",slug:"reference-articles"}]},{title:"⚪️ git and github への深い理解",frontmatter:{},regularPath:"/memo/gitRealted.html",relativePath:"memo/gitRealted.md",key:"v-57ec701e",path:"/memo/gitRealted.html",headers:[{level:2,title:"git branch",slug:"git-branch"},{level:2,title:"git rebase fix old commit",slug:"git-rebase-fix-old-commit"},{level:2,title:"Fix the most recent commit message",slug:"fix-the-most-recent-commit-message"}]},{title:"コンフィギュレーション",frontmatter:{},regularPath:"/memo/config.html",relativePath:"memo/config.md",key:"v-730240d1",path:"/memo/config.html",headers:[{level:2,title:"Install & Update nvm",slug:"install-update-nvm"}]},{title:"Axios",frontmatter:{},regularPath:"/memo/axios.html",relativePath:"memo/axios.md",key:"v-60c0654a",path:"/memo/axios.html"},{title:"🔻 使用される場面",frontmatter:{sidebarDepth:3},regularPath:"/memo/arrayusage.html",relativePath:"memo/arrayusage.md",key:"v-06c44011",path:"/memo/arrayusage.html",headers:[{level:2,title:"🔻 使用される場面",slug:"🔻-使用される場面"},{level:3,title:"例子 1: JavaScript Data Transformation Using `Object.values` and `map`",slug:"例子-1-javascript-data-transformation-using-object-values-and-map"},{level:3,title:"例子 2: 用`Array.prototype.reduce` 把 `array` 轉換成 `object`",slug:"例子-2-用array-prototype-reduce-把-array-轉換成-object"},{level:3,title:"称为“属性访问器语法”",slug:"称为-属性访问器语法"},{level:2,title:"🔻 Dan tutorial チュートリアル",slug:"🔻-dan-tutorial-チュートリアル"}]},{title:"⚪️ Strapi への深い理解",frontmatter:{},regularPath:"/memo/strapi.html",relativePath:"memo/strapi.md",key:"v-3c8cc3b1",path:"/memo/strapi.html",headers:[{level:2,title:"project structure",slug:"project-structure"},{level:2,title:"API",slug:"api"},{level:2,title:"headless CMS とは?",slug:"headless-cms-とは"},{level:2,title:"Content Type Builder",slug:"content-type-builder"},{level:3,title:"Understanding Content Type Builder:",slug:"understanding-content-type-builder"},{level:3,title:"Example Use Case:",slug:"example-use-case"},{level:3,title:"Conclusion:",slug:"conclusion"},{level:3,title:"Understanding Content Type Builder:",slug:"understanding-content-type-builder-2"},{level:3,title:"Example Use Case:",slug:"example-use-case-2"},{level:3,title:"Conclusion:",slug:"conclusion-2"}]},{title:"⚪️ ReactHooks を深く理解する",frontmatter:{sidebarDepth:3},regularPath:"/memo/reacthooks.html",relativePath:"memo/reacthooks.md",key:"v-05d756b1",path:"/memo/reacthooks.html",headers:[{level:2,title:"🔷 useEffect",slug:"🔷-useeffect"},{level:3,title:"▫️ what is useEffect",slug:"▫️-what-is-useeffect"},{level:3,title:"▫️ Basic Purpose",slug:"▫️-basic-purpose"},{level:3,title:"▫️ Second Argument - Dependency Array",slug:"▫️-second-argument-dependency-array"},{level:3,title:"▫️ Return of Cleanup Function",slug:"▫️-return-of-cleanup-function"},{level:3,title:"▫️ Execution Timing",slug:"▫️-execution-timing"},{level:3,title:"▫️ Usage Limitation - Cannot Use async Functions Directly",slug:"▫️-usage-limitation-cannot-use-async-functions-directly"},{level:2,title:"🔷 useRef",slug:"🔷-useref"},{level:3,title:"▫️ what is useRef",slug:"▫️-what-is-useref"},{level:3,title:"▫️ Basic Purpose",slug:"▫️-basic-purpose-2"},{level:3,title:"▫️ Usage Limitation - Cannot Use useRef to Update State",slug:"▫️-usage-limitation-cannot-use-useref-to-update-state"}]},{title:"🔶 TypeScript Basic Knowledge",frontmatter:{sidebarDepth:3},regularPath:"/guide/typescript/basic.html",relativePath:"guide/typescript/basic.md",key:"v-664433ef",path:"/guide/typescript/basic.html",headers:[{level:2,title:"🔸 Primitive Types",slug:"🔸-primitive-types"},{level:2,title:"Any Type",slug:"any-type"},{level:2,title:"🔸 Never",slug:"🔸-never"},{level:2,title:"型アノテーション(Type Annotation)",slug:"型アノテーション-type-annotation"},{level:2,title:"型推論(Type Inference)",slug:"型推論-type-inference"},{level:2,title:"Union Types",slug:"union-types"},{level:2,title:"Object Types - Interface",slug:"object-types-interface"},{level:2,title:"Array Types",slug:"array-types"},{level:2,title:"Function Types",slug:"function-types"},{level:2,title:"Type Assertion",slug:"type-assertion"},{level:2,title:"Declaration Files",slug:"declaration-files"},{level:3,title:"Declaration Merging",slug:"declaration-merging"}]},{title:"⚪️ Typescript and React",frontmatter:{sidebarDepth:3},regularPath:"/memo/tswithreact.html",relativePath:"memo/tswithreact.md",key:"v-d502c95a",path:"/memo/tswithreact.html"},{title:"React Redux を基礎から理解する",frontmatter:{},regularPath:"/memo/redux.html",relativePath:"memo/redux.md",key:"v-9cfb8b42",path:"/memo/redux.html",headers:[{level:2,title:"Redux の基本概念",slug:"redux-の基本概念"},{level:2,title:"Redux's Core API:",slug:"redux-s-core-api"},{level:3,title:"createStore",slug:"createstore"},{level:3,title:"useSelector",slug:"useselector"},{level:3,title:"dispatch",slug:"dispatch"},{level:2,title:"Redux Toolkit",slug:"redux-toolkit"},{level:2,title:"Redux Toolkit's Core APIs:",slug:"redux-toolkit-s-core-apis"},{level:3,title:"State management with Redux",slug:"state-management-with-redux"},{level:3,title:"Process of using Redux Toolkit",slug:"process-of-using-redux-toolkit"},{level:2,title:"Handling Asynchronous Code:",slug:"handling-asynchronous-code"},{level:2,title:"Redux Thunk",slug:"redux-thunk"}]},{title:"Typescript 深い理解と実践",frontmatter:{sidebarDepth:3},regularPath:"/memo/typescript.html",relativePath:"memo/typescript.md",key:"v-11d7f331",path:"/memo/typescript.html",headers:[{level:2,title:"🔸 Chapter 1: Start Here",slug:"🔸-chapter-1-start-here"},{level:2,title:"🔸 Chapter 2: Basic Types",slug:"🔸-chapter-2-basic-types"},{level:2,title:"🔸 Chapter 3: Arrays & Objects",slug:"🔸-chapter-3-arrays-objects"},{level:2,title:"🔸 Chapter 4: Functions",slug:"🔸-chapter-4-functions"},{level:2,title:"🔸 Chapter 5: Assertions",slug:"🔸-chapter-5-assertions"},{level:2,title:"🔸 Chapter 6: Classes",slug:"🔸-chapter-6-classes"},{level:2,title:"🔸 Chapter 7: Index Signatures & keyof Assertions",slug:"🔸-chapter-7-index-signatures-keyof-assertions"},{level:2,title:"🔸 Chapter 8: Generics",slug:"🔸-chapter-8-generics"},{level:2,title:"🔸 Chapter 9: Utility Types",slug:"🔸-chapter-9-utility-types"}]},{title:"⚪️ Webpack について理解を深める",frontmatter:{sidebarDepth:3},regularPath:"/memo/webpack.html",relativePath:"memo/webpack.md",key:"v-0dcba126",path:"/memo/webpack.html",headers:[{level:2,title:"🔶 Webpack とは?",slug:"🔶-webpack-とは"},{level:2,title:"🔶 なぜ Webpack を使うのか?",slug:"🔶-なぜ-webpack-を使うのか"},{level:2,title:"🔶 Webpack の詳細?",slug:"🔶-webpack-の詳細"},{level:3,title:"▫️ Loader for Different Resource Types",slug:"▫️-loader-for-different-resource-types"},{level:3,title:"▫️ Basic Functions of Webpack (Using Loaders)",slug:"▫️-basic-functions-of-webpack-using-loaders"},{level:3,title:"▫️ Two Key Features of Webpack",slug:"▫️-two-key-features-of-webpack"},{level:3,title:"▫️ Webpack Configuration",slug:"▫️-webpack-configuration"},{level:3,title:"▫️ Webpack Build Process",slug:"▫️-webpack-build-process"},{level:3,title:"▫️ Common Plugins",slug:"▫️-common-plugins"},{level:3,title:"▫️ Difference Between Loader and Plugin",slug:"▫️-difference-between-loader-and-plugin"},{level:3,title:"▫️ Webpack Hot Module Replacement (HMR) Principle",slug:"▫️-webpack-hot-module-replacement-hmr-principle"},{level:3,title:"▫️ Webpack Build Speed Optimization",slug:"▫️-webpack-build-speed-optimization"},{level:3,title:"▫️ webpack-bundle-analyzer",slug:"▫️-webpack-bundle-analyzer"},{level:3,title:"Basic Steps for Configuring and Using webpack-bundle-analyzer:",slug:"basic-steps-for-configuring-and-using-webpack-bundle-analyzer"},{level:3,title:"▫️ Conditional Usage in Development Environment:",slug:"▫️-conditional-usage-in-development-environment"},{level:3,title:"▫️ Detailed Configuration Options for BundleAnalyzerPlugin:",slug:"▫️-detailed-configuration-options-for-bundleanalyzerplugin"},{level:3,title:"▫️ Reference Links:",slug:"▫️-reference-links"}]},{title:"⚪️ JavaScript 深い理解と実践",frontmatter:{sidebarDepth:3},regularPath:"/memo/jsreview.html",relativePath:"memo/jsreview.md",key:"v-7ea63fb1",path:"/memo/jsreview.html",headers:[{level:2,title:"🔶 Reference vs Primitive",slug:"🔶-reference-vs-primitive"},{level:3,title:"▫️ Reference Types in JavaScript:",slug:"▫️-reference-types-in-javascript"},{level:3,title:'▫️ Strange Behavior of "Reference Types"',slug:"▫️-strange-behavior-of-reference-types"},{level:3,title:"▫️ How to Copy Objects and Arrays:",slug:"▫️-how-to-copy-objects-and-arrays"},{level:2,title:"🔶 Deconstruction Assignment",slug:"🔶-deconstruction-assignment"},{level:3,title:"▫️ Deconstructing Objects",slug:"▫️-deconstructing-objects"},{level:3,title:"▫️ Deconstructing Arrays",slug:"▫️-deconstructing-arrays"},{level:2,title:"🔶 Arrow function の理解",slug:"🔶-arrow-function-の理解"},{level:2,title:'🔶 キーワード "this "の理解',slug:"🔶-キーワード-this-の理解"},{level:3,title:"アロー関数で書く理由 ① 関数を短く書きたい",slug:"アロー関数で書く理由-1-関数を短く書きたい"},{level:3,title:"アロー関数で書く理由 ② this を束縛しない",slug:"アロー関数で書く理由-2-this-を束縛しない"},{level:3,title:"メソッド呼び出しパターン",slug:"メソッド呼び出しパターン"},{level:2,title:'🔶 キーワード "class"の理解',slug:"🔶-キーワード-class-の理解"},{level:3,title:"Class の 基本概念",slug:"class-の-基本概念"},{level:3,title:"Strict mode && Class",slug:"strict-mode-class"},{level:3,title:"箭頭函數在 Class 中的影響",slug:"箭頭函數在-class-中的影響"},{level:3,title:"クラスの継承",slug:"クラスの継承"},{level:2,title:"🔶 Static Properties and Static Methods in Classes",slug:"🔶-static-properties-and-static-methods-in-classes"},{level:2,title:"🔷 Array 主なメソッド",slug:"🔷-array-主なメソッド"},{level:3,title:"▫️ Array.prototype.push()",slug:"▫️-array-prototype-push"},{level:3,title:"▫️Array.prototype.from()",slug:"▫️array-prototype-from"},{level:3,title:"▫️Array.prototype.fill()",slug:"▫️array-prototype-fill"},{level:3,title:"填充唯一對象",slug:"填充唯一對象"},{level:3,title:"使用 for 循環",slug:"使用-for-循環"},{level:3,title:"使用展開語法 (...)",slug:"使用展開語法"},{level:3,title:"🔸 Array.prototype.map()",slug:"🔸-array-prototype-map"},{level:3,title:"▫️ Array.prototype.filter()",slug:"▫️-array-prototype-filter"},{level:3,title:"▫️ Array.prototype.find()",slug:"▫️-array-prototype-find"},{level:3,title:"▫️ Array.prototype.reduce()",slug:"▫️-array-prototype-reduce"},{level:3,title:"▫️ Array.prototype.forEach()",slug:"▫️-array-prototype-foreach"},{level:2,title:"🔷 Object method",slug:"🔷-object-method"},{level:3,title:"▫️Object.defineProperties",slug:"▫️object-defineproperties"},{level:3,title:"▫️ Object.entries()",slug:"▫️-object-entries"},{level:3,title:"▫️ Object.fromEntries()",slug:"▫️-object-fromentries"},{level:3,title:"▫️ Object.assign()",slug:"▫️-object-assign"},{level:3,title:"▫️ Object.create()",slug:"▫️-object-create"},{level:2,title:"Data Structure",slug:"data-structure"},{level:3,title:"Object 和 Map 區別",slug:"object-和-map-區別"},{level:3,title:"Set 和 Map 區別",slug:"set-和-map-區別"}]},{title:"プラクティス",frontmatter:{},regularPath:"/practice/",relativePath:"practice/README.md",key:"v-2c134f7a",path:"/practice/"},{title:"React and TypeScript Shopping Cart Application",frontmatter:{sidebarDepth:3},regularPath:"/practice/shoppingcart.html",relativePath:"practice/shoppingcart.md",key:"v-8ac9de1e",path:"/practice/shoppingcart.html",headers:[{level:2,title:"🔷 CartProvider Component",slug:"🔷-cartprovider-component"},{level:3,title:"1. Type Definitions",slug:"_1-type-definitions"},{level:3,title:"2. Action Types Definition",slug:"_2-action-types-definition"},{level:3,title:"3. Reducer Function",slug:"_3-reducer-function"},{level:3,title:"4. Custom Hook: useCartContext",slug:"_4-custom-hook-usecartcontext"},{level:3,title:"5. React Context and Provider",slug:"_5-react-context-and-provider"},{level:3,title:"Usage Instructions",slug:"usage-instructions"},{level:3,title:"🔻 CartProvider Code review",slug:"🔻-cartprovider-code-review"},{level:2,title:"🔷 ProductsProvider Component",slug:"🔷-productsprovider-component"},{level:3,title:"1. Type Definitions",slug:"_1-type-definitions-2"},{level:3,title:"2. Initial State",slug:"_2-initial-state"},{level:3,title:"3. Context Type Definition",slug:"_3-context-type-definition"},{level:3,title:"4. React Context and Provider",slug:"_4-react-context-and-provider"},{level:3,title:"5. Fetching and Updating Product Data",slug:"_5-fetching-and-updating-product-data"},{level:3,title:"Usage Instructions",slug:"usage-instructions-2"},{level:3,title:"🔻 ProductsProvider Code review",slug:"🔻-productsprovider-code-review"},{level:2,title:"🔷 Hooks/useProducts Hook",slug:"🔷-hooks-useproducts-hook"},{level:2,title:"🔷 Hooks/useCart Hook",slug:"🔷-hooks-usecart-hook"},{level:2,title:"🔷 components/ProductList",slug:"🔷-components-productlist"},{level:2,title:"🔷 components/Product",slug:"🔷-components-product"},{level:2,title:"トラブルシューティング",slug:"トラブルシューティング"},{level:3,title:"▫️ useCartContext hooks",slug:"▫️-usecartcontext-hooks"},{level:3,title:"▫️ UseCartContextType",slug:"▫️-usecartcontexttype"}]},{title:"TodoList App",frontmatter:{sidebarDepth:3},regularPath:"/practice/todolist.html",relativePath:"practice/todolist.md",key:"v-5b6a3f1e",path:"/practice/todolist.html",headers:[{level:2,title:"プロジェクトの構成",slug:"プロジェクトの構成"},{level:2,title:"TdInput Component",slug:"tdinput-component"},{level:2,title:"TdList Component",slug:"tdlist-component"},{level:2,title:"TdItem Component",slug:"tditem-component"},{level:3,title:"定義 inputRef",slug:"定義-inputref"},{level:3,title:"定義 Itodo 接口",slug:"定義-itodo-接口"},{level:3,title:"定義 Iprops src/components/TodoList/Input/index.tsx",slug:"定義-iprops-src-components-todolist-input-index-tsx"},{level:2,title:"TodoList 父組件",slug:"todolist-父組件"},{level:3,title:"使用 useReducer 替代 useState",slug:"使用-usereducer-替代-usestate"},{level:3,title:"分析 1:親コンポーネントが子コンポーネントに提供する addTodo 関数を理解するには?",slug:"分析-1-親コンポーネントが子コンポーネントに提供する-addtodo-関数を理解するには"},{level:3,title:"分析 3 什麼是 action creator? 返回純函數的意思是?",slug:"分析-3-什麼是-action-creator-返回純函數的意思是"},{level:3,title:"分析 4: Iprops",slug:"分析-4-iprops"},{level:3,title:"IProps Interface for TdInput Component:",slug:"iprops-interface-for-tdinput-component"},{level:3,title:"IProps Interface for TdList Component:",slug:"iprops-interface-for-tdlist-component"},{level:3,title:"Common Aspects:",slug:"common-aspects"},{level:3,title:"IProps in the TodoList>input>index.tsx",slug:"iprops-in-the-todolist-input-index-tsx"}]}],themeConfig:{displayAllHeaders:!0,lastUpdated:"Last Updated",isDarkMode:!1,nav:[{text:"Home",link:"/"},{text:"✸ノート",items:[{text:"「学習ノート」",items:[{text:"▫️ React.js",link:"/guide/react/"},{text:"▫️ Typescript",link:"/guide/typescript/"},{text:"▫️ Javascript",link:"/guide/javascript/"},{text:"▫️ Next.js",link:"/guide/nextjs/"}]},{text:"「メモ帳」",items:[{text:"▫️ memoメモ",link:"/memo/"},{text:"▫️ プラクティス",link:"/practice/"}]}]},{text:"✸すべてを記録する",items:[{text:"ライフ",items:[{text:"読書メモ",link:"/life/reading/"},{text:"モーメント",link:"/life/moment/"}]}]},{text:"github",link:"https://github.com/itsyuimorii"}],sidebar:{"/guide/react/":["","reactBasics","reactHooks","reactRouter","reactRedux"],"/guide/typescript/":["","basic","advanced"],"/guide/javascript/":["","js-array","js-study-notes"],"/guide/nextjs/":["","nextjs-basic","nextjs-study-notes"],"/memo/":["","jsreview","typescript","reacthooks","tswithreact","redux","strapi","Formik","axios","webpack","config","gitRealted"],"/practice/":["","todolist","shoppingcart"],"/life/reading/":["","The48LawsofPower","101EssaysThatWillChangeTheWayYouThink","ThinkandGrowRich"],"/life/moment/":[""],"/":[""]}}};n(234);Wn.component("Badge",()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,313))),Wn.component("CodeBlock",()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,309))),Wn.component("CodeGroup",()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,310)));n(235);var Ts=[{},({Vue:t})=>{t.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{}],As=[];class Rs extends class{constructor(){this.store=new Wn({data:{state:{}}})}$get(t){return this.store.state[t]}$set(t,e){Wn.set(this.store.state,t,e)}$emit(...t){this.store.$emit(...t)}$on(...t){this.store.$on(...t)}}{}Object.assign(Rs.prototype,{getPageAsyncComponent:as,getLayoutAsyncComponent:ss,getAsyncComponent:cs,getVueComponent:us});var Ls={install(t){const e=new Rs;t.$vuepress=e,t.prototype.$vuepress=e}};function Is(t,e){const n=e.toLowerCase();return t.options.routes.some(t=>t.path.toLowerCase()===n)}var Ds={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(t){const e=this.pageKey||this.$parent.$page.key;return fs("pageKey",e),Wn.component(e)||Wn.component(e,as(e)),Wn.component(e)?t(e):t("")}},Ms={functional:!0,props:{slotKey:String,required:!0},render:(t,{props:e,slots:n})=>t("div",{class:["content__"+e.slotKey]},n()[e.slotKey])},Ns={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},Us=(n(236),n(237),Object(Ss.a)(Ns,(function(){var t=this._self._c;return t("span",[t("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[t("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),t("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),t("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),Fs={functional:!0,render(t,{parent:e,children:n}){if(e._isMounted)return n;e.$once("hook:mounted",()=>{e.$forceUpdate()})}};Wn.config.productionTip=!1,Wn.use(Va),Wn.use(Ls),Wn.mixin(function(t,e,n=Wn){!function(t){t.locales&&Object.keys(t.locales).forEach(e=>{t.locales[e].path=e});Object.freeze(t)}(e),n.$vuepress.$set("siteData",e);const r=new(t(n.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(r)),i={};return Object.keys(o).reduce((t,e)=>(e.startsWith("$")&&(t[e]=o[e].get),t),i),{computed:i}}(t=>class{setPage(t){this.__page=t}get $site(){return t}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:t={}}=this.$site;let e,n;for(const r in t)"/"===r?n=t[r]:0===this.$page.path.indexOf(r)&&(e=t[r]);return e||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:t}=this.$page.frontmatter;return"string"==typeof t&&t}get $title(){const t=this.$page,{metaTitle:e}=this.$page.frontmatter;if("string"==typeof e)return e;const n=this.$siteTitle,r=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const t=function(t){if(t){const e=t.filter(t=>"description"===t.name)[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(t,e){for(let n=0;nn||(t.hash?!Wn.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(t.hash)}:{x:0,y:0})});!function(t){t.beforeEach((e,n,r)=>{if(Is(t,e.path))r();else if(/(\/|\.html)$/.test(e.path))if(/\/$/.test(e.path)){const n=e.path.replace(/\/$/,"")+".html";Is(t,n)?r(n):r()}else r();else{const n=e.path+"/",o=e.path+".html";Is(t,o)?r(o):Is(t,n)?r(n):r()}})}(n);const r={};try{await Promise.all(Ts.filter(t=>"function"==typeof t).map(e=>e({Vue:Wn,options:r,router:n,siteData:Es,isServer:t})))}catch(t){console.error(t)}return{app:new Wn(Object.assign(r,{router:n,render:t=>t("div",{attrs:{id:"app"}},[t("RouterView",{ref:"layout"}),t("div",{class:"global-ui"},As.map(e=>t(e)))])})),router:n}}(!1).then(({app:t,router:e})=>{e.onReady(()=>{t.$mount("#app")})})}]); \ No newline at end of file diff --git a/assets/js/vendors~docsearch.8ee43d73.js b/assets/js/vendors~docsearch.8ee43d73.js new file mode 100644 index 00000000..0decfd48 --- /dev/null +++ b/assets/js/vendors~docsearch.8ee43d73.js @@ -0,0 +1,3 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{306:function(t,e,n){ +/*! docsearch 2.6.3 | © Algolia | github.com/algolia/docsearch */ +var r;"undefined"!=typeof self&&self,r=function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=22)}([function(t,e,n){"use strict";var r,i=n(1);function s(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}t.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(t){if(void 0===t&&(t=navigator.userAgent),/(msie|trident)/i.test(t)){var e=t.match(/(msie |rv:)(\d+(.\d+)?)/i);if(e)return e[2]}return!1},escapeRegExChars:function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(t){return"number"==typeof t},toStr:function(t){return null==t?"":t+""},cloneDeep:function(t){var e=this.mixin({},t),n=this;return this.each(e,(function(t,r){t&&(n.isArray(t)?e[r]=[].concat(t):n.isObject(t)&&(e[r]=n.cloneDeep(t)))})),e},error:function(t){throw new Error(t)},every:function(t,e){var n=!0;return t?(this.each(t,(function(r,i){n&&(n=e.call(null,r,i,t)&&n)})),!!n):n},any:function(t,e){var n=!1;return t?(this.each(t,(function(r,i){if(e.call(null,r,i,t))return n=!0,!1})),n):n},getUniqueId:(r=0,function(){return r++}),templatify:function(t){if(this.isFunction(t))return t;var e=i.element(t);return"SCRIPT"===e.prop("tagName")?function(){return e.text()}:function(){return String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return(n?"":".")+t+e},escapeHighlightedString:function(t,e,n){e=e||"";var r=document.createElement("div");r.appendChild(document.createTextNode(e)),n=n||"";var i=document.createElement("div");i.appendChild(document.createTextNode(n));var o=document.createElement("div");return o.appendChild(document.createTextNode(t)),o.innerHTML.replace(RegExp(s(r.innerHTML),"g"),e).replace(RegExp(s(i.innerHTML),"g"),n)}}},function(t,e,n){"use strict";t.exports={element:null}},function(t,e){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;t.exports=function(t,e,i){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var s=t.length;if(s===+s)for(var o=0;o was loaded but did not call our provided callback"),JSONPScriptError:s("JSONPScriptError"," + + diff --git a/guide/javascript/js-array.html b/guide/javascript/js-array.html new file mode 100644 index 00000000..b63a9399 --- /dev/null +++ b/guide/javascript/js-array.html @@ -0,0 +1,782 @@ + + + + + + ⚪️ 【JavaScript 入門】 配列の使い方と操作まとめ(初期化・追加・結合・検索・削除) | ☻ itsyuimorii.space + + + + + + + + +

    # ⚪️ 【JavaScript 入門】 配列の使い方と操作まとめ(初期化・追加・結合・検索・削除)

    # 🔶 【実践】「配列」の活用技

    当然可以。下面是一个表格,展示了各个 JavaScript 数组方法的功能、返回值、是否改变原数组以及它们被引入的 ECMAScript 版本。

    顺序 方法名 功能 返回值 是否改变原数组 版本
    1 push() 向数组添加一个或多个元素(在数组尾部) 新数组的长度 ES5-
    2 unshift() 向数组添加一个或多个元素(在数组头部) 新数组的长度 ES5-
    3 pop() 删除数组的最后一个元素 被删除的元素 ES5-
    4 shift() 删除数组的第一个元素 被删除的元素 ES5-
    5 reverse() 反转数组中的元素 反转后的数组 ES5-
    6 sort() 对数组进行排序(默认按字符串 Unicode 码点) 排序后的数组 ES5-
    7 splice() 在指定位置删除或添加元素(可用于数组的增删改) 被删除的元素组成的数组 ES5-
    8 concat() 合并多个数组,返回新数组 合并后的数组 ES5-
    9 join() 将数组元素用特定字符连接成字符串 拼接后的字符串 ES5-
    10 slice() 从数组中提取一段元素,返回新数组 提取的元素组成的新数组 ES5-
    11 toString() 将数组转换为字符串 字符串表示的数组 ES5-
    12 valueOf() 返回数组的原始值 数组的原始值 ES5-
    13 indexOf() 查询数组中某元素首次出现的位置 元素位置,若不存在则返回-1 ES5-
    14 lastIndexOf() 反向查询数组中某元素首次出现的位置 元素位置,若不存在则返回-1 ES5-
    15 forEach() 遍历数组,对每个元素执行回调函数 无(undefined ES5-
    16 map() 遍历数组,使用回调函数处理每个元素,并返回新数组 新数组 ES5-
    17 filter() 遍历数组,筛选符合条件的元素,返回新数组 符合条件的元素组成的新数组 ES5-
    18 every() 检测数组所有元素是否都满足条件 所有元素满足返回true,否则false ES5-
    19 some() 检测数组中是否存在满足条件的元素 存在满足条件的元素返回true,否则false ES5-
    20 reduce() 从左到右应用一个函数对数组元素进行累计/归约 操作结果 ES5-
    21 reduceRight() 从右到左应用一个函数对数组元素进行累计/归约 操作结果 ES5-
    22 includes()

    判断数组是否包含特定值 | 包含则返回true,否则false | 否 | ES6 | +| 23 | Array.from() | 从类数组或可迭代对象创建新数组 | 新数组 | 否 | ES6 | +| 24 | find() | 查找数组中满足条件的第一个元素 | 满足条件的元素,否则undefined | 否 | ES6 | +| 25 | findIndex() | 查找数组中满足条件元素的索引 | 满足条件元素的索引,否则-1 | 否 | ES6 | +| 26 | fill() | 使用给定值填充数组 | 填充后的数组 | 是 | ES6 | +| 27 | flat() | 将嵌套数组"拉平"成一维数组 | 新数组 | 否 | ES6 | +| 28 | flatMap() | 先映射每个元素,然后将结果压平成一维数组 | 新数组 | 否 | ES6 |

    # 🔶 方法详解

    # 🔸 1. push()

    • 功能:在数组最后一位添加一个或多个元素,并返回新数组的长度。会改变原数组。
    • 示例:
      var arr = [1, 2, "c"];
      +var rel = arr.push("A", "B");
      +console.log(arr); // [1, 2, "c", "A", "B"]
      +console.log(rel); // 5 (数组长度)
      +

    # 🔸 2. unshift()

    • 功能:在数组第一位添加一个或多个元素,并返回新数组的长度。会改变原数组。
    • 示例:
      var arr = [1, 2, "c"];
      +var rel = arr.unshift("A", "B");
      +console.log(arr); // ["A", "B", 1, 2, "c"]
      +console.log(rel); // 5 (数组长度)
      +

    # 🔸 3. pop()

    • 功能:删除数组的最后一个元素,并返回被删除的元素。会改变原数组。
    • 示例:
      var arr = [1, 2, "c"];
      +var rel = arr.pop();
      +console.log(arr); // [1, 2]
      +console.log(rel); // c
      +

    # 🔸 4. shift()

    • 功能:删除数组的第一个元素,并返回被删除的元素。会改变原数组。
    • 示例:
      var arr = ["a", "b", "c"];
      +var rel = arr.shift();
      +console.log(arr); // ["b", "c"]
      +console.log(rel); // a
      +

    # 🔸 5. reverse()

    • 功能:反转数组中的元素。会改变原数组。
    • 示例:
      var arr = [1, 2, 3, "a", "b", "c"];
      +var rel = arr.reverse();
      +console.log(arr); // ["c", "b", "a", 3, 2, 1]
      +console.log(rel); // ["c", "b", "a", 3, 2, 1]
      +

    # 🔸 6. sort()

    • 功能:对数组的元素进行排序。默认排序顺序是根据字符串 Unicode 码点。
    • 示例:
      var arr1 = [10, 1, 5, 2, 3];
      +arr1.sort();
      +console.log(arr1); // 默认排序结果
      +// 使用自定义排序函数
      +arr1.sort(function (a, b) {
      +  return a - b;
      +});
      +console.log(arr1); // 从小到大排序
      +

    # 🔸 7. splice()

    # 功能:

    • 在指定位置添加或删除数组中的元素,或替换数组中的元素。会改变原数组。
    • splice 方法可以用于数组的增删改操作。
    • splice 方法的第一个参数是修改的起始位置(索引),第二个参数是删除的个数(如果是 0,则表示不删除元素),后面的参数是要添加进数组的元素。

    # 语法:

    • array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
    • start:指定修改的开始位置(从 0 计数)。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位(从-1 计数,这意味着-n 是倒数第 n 个元素并且等价于 array.length-n),如果负数的绝对值大于数组的长度,则表示开始位置为第 0 位。
    • deleteCount:整数,表示要移除的数组元素的个数。如果deleteCount大于start之后的元素的总数,则从start后面的元素都将被删除(含第start位)。
    • item1, item2, ...:要添加进数组的元素,从start位置开始。如果不指定,则只删除数组元素。
    • 返回值:由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。
    • 注意:splice 方法会改变原始数组。

    # 示例:

    var arr = ["a", "b", "c", 2, 3, 6];
    +var rel = arr.splice(2, 1, "add1", "add2");
    +console.log(arr); // 修改后的数组
    +console.log(rel); // 被删除的元素组成的数组
    +

    # 使用場景:

    在 React 中,通常推荐使用不可变数据模式来更新状态,尤其是当处理数组和对象时。splice 方法会直接修改原数组,这可能导致 React 的状态更新行为表现得不如预期。

    const remove = (index) => {
    +  const newGoods = [...goods];
    +  newGoods.splice(index, 1); // 删除 splice 方法, 会改变原数组, 返回被删除的元素
    +  setGoods(newGoods);
    +};
    +

    newGoods.splice(index, 1); 这行代码中,splice 被用于从 newGoods 数组中移除特定索引的元素。尽管这里使用了 newGoods 作为 goods 数组的副本,但由于数组是引用类型,在使用 splice 之前,应该创建 goods 的深拷贝。

    # 为什么需要深拷贝?

    当你使用 newGoods = [...goods] 这样的语句时,实际上创建的是原数组的浅拷贝。这意味着 newGoodsgoods 都指向相同的元素对象。当你在 newGoods 上使用 splice 时,虽然 goods 数组本身没有被直接修改,但数组中的对象可能会受到影响,这可能导致 React 的不预期行为。

    # 正确的做法

    为了避免这种问题,可以使用不会改变原数组的方法来处理数组。例如,可以使用 filter 方法来创建一个不包含特定索引元素的新数组,而不是使用 splice

    const remove = (index) => {
    +  const newGoods = goods.filter((_, i) => i !== index);
    +  setGoods(newGoods);
    +};
    +

    在这个修改后的 remove 函数中,filter 方法被用来创建一个新的数组,其中不包含指定索引的元素。这种方法不会修改原数组,符合 React 的不可变数据原则,能够确保状态更新的可预测性。

    # 🔸 8. concat()

    • 功能:连接两个或更多数组,并返回结果。不改变原数组。
    • 示例:
      var arr1 = [1, 2, 3];
      +var arr2 = ["a", "b", "c"];
      +var rel = arr1.concat(arr2);
      +console.log(rel); // 合并后的数组
      +

    # 🔸 9. join()

    • 功能:将数组的所有元素连接成一个字符串。
    • 示例:
      var list = ["a", "b", "c", "d"];
      +var result = list.join("-");
      +console.log(result); // "a-b-c-d"
      +

    # 🔸 10. slice()

    • 功能:返回数组的一个片段或子数组。不改变原数组。
    • 示例:
      var list = ["a", "b", "c", "d"];
      +var result = list.slice(1, 3);
      +console.log(result); // ["b", "c"]
      +

    # 🔸 11. toString()

    • 功能:将数组转换为字符串。不改变原数组。
    • 示例:
      var list = ["a", "b", "c", "d"];
      +var rel = list.toString();
      +console.log(rel); // "a,b,c,d"
      +

    # 🔸 12. valueOf()

    • 功能:返回数组的原始值。
    • 示例:
      var list = [1, 2, 3, 4];
      +var rel = list.valueOf();
      +console.log(rel); // [1, 2, 3, 4]
      +

    # 🔸 13. indexOf()

    • 功能:返回指定元素在数组中首次出现的索引。不存在则返回-1。

    • 示例:

      var list = [1, 2, 3, 4];
      +var index = list.indexOf(4);
      +
      +console.log(index); // 3
      +

    # 🔸 14. lastIndexOf()

    • 功能:返回指定元素在数组中最后一次出现的索引。不存在则返回-1。
    • 示例:
      var list = [1, 2, 3, 4];
      +var index = list.lastIndexOf(4);
      +console.log(index); // 3
      +

    # 🔸 15. forEach()

    # 功能:

    • 对数组的每个元素执行一次提供的函数, 不改变原数组

      • forEach cannot directly handle asynchronous operations with await.(forEach `doesn't wait for promises to resolve before moving on to the next iteration.)
    • forEach()方法需要一个回调函数(这种函数,是由我们创建但是不由我们调用的)作为参数

      arr.forEach(function (item, index, array) {
      +  console.log(item, index, array);
      +});
      +
    • 回调函数中传递三个参数:

      • 第一个参数,就是当前正在遍历的元素
      • 第二个参数,就是当前正在遍历的元素的索引
      • 第三个参数,就是正在遍历的数组
    • forEach本身是没有中断机制的。内部是遍历执行回调的。

      • 在回调中增加判断条件,满足条件就抛出异常。(通常是不建议这么跳出循环的)
      • 使用 for(let item in arr) {}这样的遍历方式,可以提前跳出循环
      • 使用.some 方法,一些场景判断,满足条件可以提前结束

    # 示例:

    //基本for 循環支持 await, 但是效率會很低.
    +async function fetaData() {
    +  let arrs = Array.from({ length: 3 }, (_, index) => index + 1);
    +  let datas = [];
    +  for (let i = 0; i < arrs.length; i++) {
    +    let data = await fetch(
    +      `https://jsonplaceholder.typicode.com/todos/${arrs[i]}`
    +    )
    +      .then((res) => res.json())
    +      .then((res) => res);
    +    datas.push(data);
    +  }
    +
    +  return datas;
    +}
    +fetaData().then((res) => console.log(res));
    +

    # 使用場景:

    当您需要对数组中的每个元素执行异步操作,例如逐个上传图片,但不需要收集这些异步操作的返回值时,您可以使用 forEach 方法结合 async/await。请注意,虽然 forEach 不能直接处理 await,但您可以在 forEach 的回调函数中定义一个立即执行的异步函数来实现这一点。

    以下是一个例子,演示了如何使用 forEach 方法逐个上传图片:

    async function uploadImage(image) {
    +  // 这里是一个假设的上传函数,实际情况下应替换为实际的上传逻辑
    +  // 假设这个函数返回一个 Promise
    +  return fetch("https://example.com/upload", {
    +    method: "POST",
    +    body: image,
    +  }).then((response) => response.json());
    +}
    +
    +function uploadImages(images) {
    +  images.forEach(async (image) => {
    +    try {
    +      const result = await uploadImage(image);
    +      console.log("Image uploaded:", result);
    +    } catch (error) {
    +      console.error("Error uploading image:", error);
    +    }
    +  });
    +}
    +
    +// 假设这个数组包含了要上传的图片
    +const imageArray = ["image1.png", "image2.png", "image3.png"];
    +
    +uploadImages(imageArray);
    +

    在这个例子中:

    1. uploadImage 函数是一个异步函数,用于上传单个图片,并返回一个 Promise 对象。
    2. uploadImages 函数接受一个图片数组,使用 forEach 遍历这个数组。
    3. forEach 的回调函数中,我们定义了一个立即执行的异步函数来处理图片上传。
    4. 每个图片上传的结果将会被打印出来,但整个 uploadImages 函数本身不会返回任何结果。

    请注意,由于 forEach 并不等待异步操作完成,所有的上传操作将会几乎同时开始,这可能会对服务器造成压力。如果需要控制上传速度,比如一次只上传一个图片,您可能需要使用基本的 for 循环或其他方法来顺序执行异步操作。

    # 其他可能場景:

    1. 处理菜单项

      • 如果您有一个菜单项数组,您可能需要使用 forEach 来遍历每个菜单项,以生成展示在网页上的菜单列表。
      • 对于每个菜单项,可能还需要根据特定属性(如类别、价格区间、是否为素食等)进行进一步处理或分类。
    2. 处理顾客评论

      • 如果您的网站有顾客评论功能,您可以使用 forEach 遍历评论数组,展示每个顾客的评分和评论。
    3. 订单处理

      • 在订单确认页面,您可能需要遍历订单中的每个项目,计算总价或应用折扣。
      • 如果需要将订单中的每个项目发送到后端处理(如库存检查、订单入库等),也可以使用 forEach
    4. 图片或媒体内容展示

      • 如果餐厅网站有图库展示餐厅内部、菜品等,您可以使用 forEach 来遍历图片数组,为每张图片创建相应的 HTML 元素。
    5. 员工管理

      • 在员工管理界面,forEach 可用于遍历员工列表,显示员工信息,或进行特定操作,如计算工资、安排班次等。
    6. 库存管理

      • 对于库存管理,forEach 可以用于遍历库存列表,更新库存状态或进行库存预警。
    7. 特殊活动或促销信息展示

      • 如果餐厅有特殊活动或促销,您可以使用 forEach 遍历活动数组,动态生成展示这些活动的界面元素。

    在这些场景中,forEach 循环提供了一种简洁的方式来处理数组中的每个元素,尤其是当您不需要返回新数组时。这有助于编写更加清晰和可维护的代码。


    # 🔸 16. map()

    # 功能:

    • 數組原型是一個函數,對數組遍歷不破壞原數組, 返回一個新數組, 按照原是數組元素順序依次執行給定的函數, 並將每一次函數執行的結果作為新數組的元素返回

    • map 方法会遍历数组中的每个元素,并使用回调函数处理每个元素,最终返回一个新数组。

    • 參數: map 方法的回调函数接受三个参数:

      • element:就是当前正在遍历的元素
      • index, 就是当前正在遍历的元素的索引
      • array,就是正在遍历的数组, 調用了 map()的數組本身
    • 語法:

      • arr.map(callback(currentValue[, index[, array]])[, thisArg])
      • arr.map(callback(currentValue[, index[, array]])
        • thisArg 可选参数。执行 callback 函数时使用的 this 值。

    # 示例:

    1. 将数组中的每个对象都添加一个新属性,并设置为相同的值。
    let users = [{ name: "Alice" }, { name: "Bob" }, { name: "Charlie" }];
    +let updatedUsers = users.map((user) => ({
    +  ...user,
    +  isActive: true,
    +}));
    +
    +console.log(updatedUsers); // [{ name: "Alice", isActive: true }, { name: "Bob", isActive: true }, { name: "Charlie", isActive: true }]
    +
    const numbers: number[] = [1, 2, 3, 4, 5];
    +const doubled: number[] = numbers.map((number: number) => number * 2);
    +
    1. 從數組對象裡提取特定屬性
    type User = {
    +  name: string;
    +  age: number;
    +};
    +
    +const users: User[] = [
    +  { name: "Alice", age: 20 },
    +  { name: "Bob", age: 21 },
    +  { name: "Charlie", age: 22 },
    +];
    +
    +const names: string[] = users.map((user: User) => user.name);
    +
    1. 将字符串数组转换为对象数组
    const fruits: string[] = ["apple", "banana", "cherry"];
    +
    +type FruitObject = {
    +  name: string;
    +};
    +
    +const fruitObjects: FruitObject[] = fruits.map((fruit: string) => ({
    +  name: fruit,
    +}));
    +
    +console.log(fruitObjects); // [{ name: "apple" }, { name: "banana" }, { name: "cherry" }]
    +
    1. 对象数组中的数字属性进行转换
    type Product = {
    +  name: string;
    +  price: number;
    +  };
    +
    +const products: Product[] = [
    +{ name: 'Book', price: 15 },
    +{ name: 'Pen', price: 5 },
    +{ name: 'Pencil', price: 2 }
    +];
    +
    +const discountedProducts: Product[] = products.map((product: Product) => ({
    +...product,
    +price: product.price \* 0.9
    +}));
    +

    # 使用場景:

    在 TypeScript 结合 React 开发的外卖应用(Web Restaurant App)中,使用.map方法来渲染列表是非常常见的。这里我将提供一些示例,展示如何在 TypeScript 环境下使用.map方法处理和渲染餐厅应用中的数据。

    1. 渲染菜单列表: 假设你有一个菜单项的数组,你想渲染这些菜单项到页面上。
    interface MenuItem {
    +  id: number;
    +  name: string;
    +  price: number;
    +  description: string;
    +}
    +
    +const menuItems: MenuItem[] = [
    +  { id: 1, name: "Burger", price: 5.99, description: "A classic burger" },
    +  { id: 2, name: "Pizza", price: 7.99, description: "Cheesy pizza" },
    +  // more menu items...
    +];
    +
    +const MenuList: React.FC = () => (
    +  <div>
    +    {menuItems.map((item) => (
    +      <div key={item.id}>
    +        <h3>
    +          {item.name} - ${item.price}
    +        </h3>
    +        <p>{item.description}</p>
    +      </div>
    +    ))}
    +  </div>
    +);
    +
    1. 订单详情: 在订单详情页,你可能需要列出用户所选的菜品及其价格。
    interface OrderItem {
    +  id: number;
    +  name: string;
    +  quantity: number;
    +  price: number;
    +}
    +
    +const orderItems: OrderItem[] = [
    +  // 假设这些数据是用户选择的菜品
    +];
    +
    +const OrderDetails: React.FC = () => (
    +  <ul>
    +    {orderItems.map((item) => (
    +      <li key={item.id}>
    +        {item.name} x {item.quantity} - ${item.quantity * item.price}
    +      </li>
    +    ))}
    +  </ul>
    +);
    +
    1. 评分和评论, 显示用户对菜品的评分和评论。
    interface Review {
    +  id: number;
    +  user: string;
    +  rating: number;
    +  comment: string;
    +}
    +
    +const reviews: Review[] = [
    +  // 用户评论数据
    +];
    +
    +const ReviewsList: React.FC = () => (
    +  <div>
    +    {reviews.map((review) => (
    +      <div key={review.id}>
    +        <h4>{review.user}</h4>
    +        <p>Rating: {review.rating} / 5</p>
    +        <p>{review.comment}</p>
    +      </div>
    +    ))}
    +  </div>
    +);
    +
    1. 如果你需要同时处理多个异步操作并等待它们全部完成,你可以使用 Promise.all 结合 map 方法,而不是 forEach。当您需要同时处理多个异步操作并等待它们全部完成时,可以使用 Promise.all 结合 map 方法。这种方法特别适用于需要并行执行多个异步请求并等待所有请求完成的情况。

    示例:并行获取多个资源: 假设您有一个 URL 数组,您需要从每个 URL 获取数据。

    const urls: string[] = [
    +  "https://api.example.com/data1",
    +  "https://api.example.com/data2",
    +  "https://api.example.com/data3",
    +  // 更多URLs...
    +];
    +
    +// 定义一个异步函数来获取每个URL的数据
    +async function fetchData(url: string): Promise<any> {
    +  const response = await fetch(url);
    +  return response.json();
    +}
    +
    +// 使用Promise.all和map来并行获取所有数据
    +async function getAllData() {
    +  try {
    +    const allData = await Promise.all(urls.map((url) => fetchData(url)));
    +    console.log(allData); // 打印所有获取到的数据
    +  } catch (error) {
    +    console.error("Error fetching data:", error);
    +  }
    +}
    +
    +getAllData();
    +

    在这个示例中,urls.map(url => fetchData(url)) 会为每个 URL 创建一个 fetch 请求的 Promise。然后,Promise.all 接收这个 Promise 数组,并等待所有的 fetch 请求都完成。一旦所有请求完成,allData 变量将包含所有 URL 返回的数据。如果任何一个请求失败,catch 块将捕获错误。

    注意事项:

    • 当使用 Promise.all 时,如果任何一个 Promise 失败,整个 Promise.all 调用会立即失败。这意味着如果您有多个请求,一个请求失败,其他成功的请求的结果也会被丢弃。如果您需要不同的行为(例如,处理每个请求的单独成功或失败),您可能需要考虑使用 Promise.allSettled 或单独处理每个 Promise 的错误。
    • 使用 Promise.all 可以显著提高性能,因为它允许异步操作并行执行,而不是按顺序一个接一个执行。 +当然可以。在 TypeScript 和 React 结合使用的场景中,我们可以遇到更复杂的使用 map 方法的例子,特别是在处理嵌套数据结构或进行更高级的数据转换时。以下是一些复杂的使用场景示例:
    1. 渲染嵌套评论

    假设你有一个嵌套评论的数据结构,你需要递归地渲染每个评论及其子评论。

    interface Comment {
    +  id: number;
    +  text: string;
    +  user: string;
    +  replies: Comment[];
    +}
    +
    +const comments: Comment[] = [
    +  // 假设的评论数据,每个评论可能有回复(也是Comment类型)
    +];
    +
    +const renderComments = (comments: Comment[]): JSX.Element[] => {
    +  return comments.map((comment) => (
    +    <div key={comment.id}>
    +      <h4>{comment.user}</h4>
    +      <p>{comment.text}</p>
    +      {comment.replies && (
    +        <div className="replies">{renderComments(comment.replies)}</div>
    +      )}
    +    </div>
    +  ));
    +};
    +
    +const CommentsList: React.FC = () => <div>{renderComments(comments)}</div>;
    +
    1. 动态生成表格列

    在一个数据驱动的应用中,你可能需要根据数据对象的属性动态生成表格列。

    interface Product {
    +  id: number;
    +  name: string;
    +  price: number;
    +  stock: number;
    +}
    +
    +const products: Product[] = [
    +  // 产品数据
    +];
    +
    +const ProductTable: React.FC = () => (
    +  <table>
    +    <thead>
    +      <tr>
    +        {Object.keys(products[0]).map((key) => (
    +          <th key={key}>{key.toUpperCase()}</th>
    +        ))}
    +      </tr>
    +    </thead>
    +    <tbody>
    +      {products.map((product) => (
    +        <tr key={product.id}>
    +          {Object.values(product).map((value, index) => (
    +            <td key={index}>{value}</td>
    +          ))}
    +        </tr>
    +      ))}
    +    </tbody>
    +  </table>
    +);
    +
    1. 使用 map 处理 TypeScript 枚举

    当你有一个 TypeScript 枚举,并希望基于枚举的值生成一组元素时。

    enum OrderStatus {
    +  Pending = "pending",
    +  InProgress = "in_progress",
    +  Completed = "completed",
    +  Cancelled = "cancelled",
    +}
    +
    +const StatusSelector: React.FC = () => (
    +  <select>
    +    {Object.values(OrderStatus).map((status) => (
    +      <option key={status} value={status}>
    +        {status}
    +      </option>
    +    ))}
    +  </select>
    +);
    +
    1. 使用 Promise.all 与类型保护

    在处理多个异步请求时,你可能还需要进行类型保护,以确保每个响应都符合预期的类型。

    type ApiResponse = DataResponse | ErrorResponse;
    +
    +interface DataResponse {
    +  status: "ok";
    +  data: any;
    +}
    +
    +interface ErrorResponse {
    +  status: "error";
    +  message: string;
    +}
    +
    +const fetchData = async (url: string): Promise<ApiResponse> => {
    +  try {
    +    const response = await fetch(url);
    +    const data = await response.json();
    +    return { status: "ok", data };
    +  } catch (error) {
    +    return { status: "error", message: error.message };
    +  }
    +};
    +
    +async function getAllData(urls: string[]) {
    +  const responses = await Promise.all(urls.map(fetchData));
    +  responses.forEach((response) => {
    +    if (response.status === "ok") {
    +      console.log("Data:", response.data);
    +    } else {
    +      console.error("Error:", response.message);
    +    }
    +  });
    +}
    +

    在这个示例中,ApiResponse 类型是一个联合类型,包括 DataResponseErrorResponse。当处理 Promise.all 的结果时,使用类型保护来确定每个响应是成功的数据响应还是错误响应。

    这些例子展示了在更复杂的场景中使用 .map 方法的多样性,尤其是在 TypeScript 环境中处理类型安全和异步操作时。


    # 🔸 17. filter()

    # 功能:

    • filter 方法会遍历数组中的每个元素,并使用回调函数处理每个元素,最终返回一个新数组。

    • 在回调函数中,返回值为 true 的元素将会被保留,返回值为 false 的元素将会被过滤掉。

    • filter 方法不会改变原数组。

    • filter 方法的回调函数接受三个参数:

      • element:就是当前正在遍历的元素
      • index, 就是当前正在遍历的元素的索引
      • array,就是正在遍历的数组, 調用了 filter()的數組本身
      • thisArg 可选参数。执行 callback 函数时使用的 this 值。
    • 語法:

      • arr.filter(callback(currentValue[, index[, array]])[, thisArg])
      • arr.filter(callback(currentValue[, index[, array]])

    # 示例:

    当然可以。下面是一些使用 filter 方法的 TypeScript 示例,包括处理数组对象,并在某些情况下利用索引。

    1. 过滤特定条件的对象
    interface Product {
    +  id: number;
    +  name: string;
    +  price: number;
    +  inStock: boolean;
    +}
    +
    +const products: Product[] = [
    +  { id: 1, name: "Apple", price: 1.2, inStock: true },
    +  { id: 2, name: "Banana", price: 0.5, inStock: false },
    +  { id: 3, name: "Cherry", price: 2.5, inStock: true },
    +];
    +
    +// 过滤出库存中的产品
    +const inStockProducts: Product[] = products.filter(
    +  (product) => product.inStock
    +);
    +
    1. 使用索引过滤
    const data: number[] = [10, 20, 30, 40, 50];
    +
    +// 只保留偶数索引的元素
    +const filteredData: number[] = data.filter((_, index) => index % 2 === 0);
    +
    1. 结合对象和索引过滤
    interface User {
    +  id: number;
    +  name: string;
    +  age: number;
    +}
    +
    +const users: User[] = [
    +  { id: 1, name: "Alice", age: 24 },
    +  { id: 2, name: "Bob", age: 30 },
    +  { id: 3, name: "Carol", age: 22 },
    +];
    +
    +// 过滤出年龄大于25的用户,并且只保留偶数索引的用户
    +const selectedUsers: User[] = users.filter(
    +  (user, index) => user.age > 25 && index % 2 === 0
    +);
    +
    1. 移除数组中的重复元素
    const numbers: number[] = [1, 2, 3, 2, 3, 4, 5, 4];
    +
    +const uniqueNumbers: number[] = numbers.filter(
    +  (value, index, arr) => arr.indexOf(value) === index
    +);
    +
    1. 根据多个条件过滤
    interface Book {
    +  id: number;
    +  title: string;
    +  author: string;
    +  year: number;
    +}
    +
    +const books: Book[] = [
    +  { id: 1, title: "1984", author: "George Orwell", year: 1949 },
    +  {
    +    id: 2,
    +    title: "The Great Gatsby",
    +    author: "F. Scott Fitzgerald",
    +    year: 1925,
    +  },
    +  { id: 3, title: "Brave New World", author: "Aldous Huxley", year: 1932 },
    +];
    +
    +// 过滤出在1930年之后出版的书籍,并且作者为 "Aldous Huxley"
    +const filteredBooks: Book[] = books.filter(
    +  (book) => book.year > 1930 && book.author === "Aldous Huxley"
    +);
    +
    1. mapfilter 鏈式調用,數組對象裡提取特定屬性
    type User = {
    +  id: number;
    +  name: string;
    +  age: number;
    +};
    +
    +const users: User[] = [
    +  { id: 1, name: "Alice" },
    +  { id: null, name: "Bob" },
    +  { id: 2, name: "Bob" },
    +  { id: 3, name: "Charlie" },
    +];
    +
    +const newUsers = users
    +  .filter((item) => item.id)
    +  .map((item) => ({ ...item, isMember: true }));
    +
    +console.log(newUsers); // [{ id: 1, name: "Alice", isMember: true }, { id: 2, name: "Bob", isMember: true }, { id: 3, name: "Charlie", isMember: true }]
    +

    # 其他使用場景:

    在一个复杂的餐厅程序中,我们可以设想几个更复杂的 filter 使用场景,这些场景涉及多条件筛选、嵌套数据结构以及和其他数组方法的结合使用。以下是一些 TypeScript 示例:

    1. 根据多个条件筛选菜单项

    假设你的餐厅应用需要根据多个条件(如价格范围、食物类型、客户评分)筛选菜单项。

    interface MenuItem {
    +  id: number;
    +  name: string;
    +  type: "starter" | "main" | "dessert";
    +  price: number;
    +  averageRating: number;
    +}
    +
    +const menuItems: MenuItem[] = [
    +  // 菜单项数据...
    +];
    +
    +const filterCriteria = {
    +  type: "main",
    +  priceRange: { min: 10, max: 20 },
    +  minRating: 4,
    +};
    +
    +const filteredMenuItems = menuItems.filter(
    +  (item) =>
    +    item.type === filterCriteria.type &&
    +    item.price >= filterCriteria.priceRange.min &&
    +    item.price <= filterCriteria.priceRange.max &&
    +    item.averageRating >= filterCriteria.minRating
    +);
    +
    1. 筛选包含特定配料的菜品及其变体

    考虑一个复杂的场景,其中菜品可能有多个变体(如不同的调味方式或配料)。你需要找到包含或排除特定配料的所有菜品及其变体。

    interface MenuItemVariant {
    +  variantId: number;
    +  ingredients: string[];
    +}
    +
    +interface MenuItem {
    +  id: number;
    +  name: string;
    +  variants: MenuItemVariant[];
    +}
    +
    +const menuItems: MenuItem[] = [
    +  // 菜单项及变体数据...
    +];
    +
    +const ingredientFilter = "cheese";
    +
    +const itemsWithIngredient = menuItems.filter((item) =>
    +  item.variants.some((variant) =>
    +    variant.ingredients.includes(ingredientFilter)
    +  )
    +);
    +
    1. 结合 filtermap 筛选并转换数据

    在某些情况下,你可能需要先筛选出符合条件的数据,然后转换这些数据以用于显示。

    const menuItemsWithRatings: MenuItem[] = [
    +  // 含评分的菜单项数据...
    +];
    +
    +const highRatedDishes = menuItemsWithRatings
    +  .filter((item) => item.averageRating >= 4)
    +  .map((item) => ({
    +    name: item.name,
    +    rating: item.averageRating,
    +    priceRange: item.price >= 20 ? "High" : "Medium",
    +  }));
    +
    1. 复杂订单过滤

    考虑到餐厅可能需要处理大量的订单数据,你可能需要根据订单的多个属性来筛选它们,如订单状态、金额、下单时间等。

    interface Order {
    +  id: number;
    +  totalAmount: number;
    +  status: "new" | "processing" | "delivered" | "cancelled";
    +  orderDate: Date;
    +}
    +
    +const orders: Order[] = [
    +  // 订单数据...
    +];
    +
    +const filteredOrders = orders.filter(
    +  (order) =>
    +    order.status === "delivered" &&
    +    order.totalAmount > 50 &&
    +    order.orderDate > new Date("2021-01-01")
    +);
    +

    # 🔸 18. every()

    # 功能:

    • 检测数组所有元素是否都满足指定条件。
    • every 方法会遍历数组中的每个元素,并使用回调函数处理每个元素,最终返回一个布尔值。
    • 在回调函数中,如果所有元素都满足条件every 方法将返回 true,否则返回 false

    # 示例:

    var list = [32, 93, 77, 53, 38, 87];
    +var result = list.every(function (item) {
    +  return item >= 50;
    +});
    +console.log(result); // false
    +

    # 使用場景

    当您需要检测数组中的所有元素是否满足指定条件时,可以使用 every 方法。以下是一些 TypeScript 示例:

    1. 检测订单中的所有商品是否都有库存
    interface OrderItem {
    +  productId: number;
    +  quantity: number;
    +  price: number;
    +}
    +
    +const orderItems: OrderItem[] = [
    +  { productId: 1, quantity: 2, price: 10 },
    +  { productId: 2, quantity: 1, price: 20 },
    +  // 更多商品...
    +];
    +
    +const allItemsInStock = orderItems.every((item) => item.quantity > 0);
    +

    # 🔸 19. some()

    # 功能:

    • 检测数组中是否有元素满足指定条件。
    • some 方法会遍历数组中的每个元素,并使用回调函数处理每个元素,最终返回一个布尔值。
    • 在回调函数中,如果有一个元素满足条件some 方法将返回 true,否则返回 false

    # 示例:

    var list = [32, 93, 77, 53, 38, 87];
    +var result = list.some(function (item) {
    +  return item >= 50;
    +});
    +console.log(result); // true
    +

    every 方法类似,some 方法也可以用于检测数组中是否有元素满足指定条件。但是,some 方法只要有一个元素满足条件,就会返回 true,而不是所有元素都满足条件。

    # 🔸 20. reduce()

    # 功能:

    • 对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行),将其结果汇总为单个返回值。

    • reduce 方法對數組中每一個元素按序執行一個指定方法, 每一次允許reducer 會將先前元素的計算結果作為參數傳入, 最後返回一個累積的結果

    • reduce 方法接受两个参数:

      • reducer 函数:用于处理数组中的每个元素,并将其结果汇总为单个返回值。
      • initialValue:作为第一次调用 reducer 函数时的第一个参数使用的值。第一次回調函數的初始值,如果指定初始值,則會作為第一次調用 callback 函數時的第一個參數使用。如果沒有提供初始值,則將使用數組中的第一個元素。在沒有初始值的空數組上調用 reduce 將報錯。
    • reducer 函数接受四个参数:

      • accumulator:累加器累计回调的返回值; 它是上一次调用回调时返回的累积值,或 initialValue
      • currentValue:数组中正在处理的元素。
      • currentIndex:数组中正在处理的元素的索引。如果提供了 initialValue,则索引号为 0,否则索引为 1。
      • array:调用 reduce 的数组。
      • thisArg 可选参数。执行 callback 函数时使用的 this 值。

    # 示例:

    1. 计算订单总金额: 假设你有一个表示订单中各个商品及其数量的数组,你需要计算订单的总金额。
    interface OrderItem {
    +  productId: number;
    +  quantity: number;
    +  price: number;
    +}
    +
    +const orderItems: OrderItem[] = [
    +  { productId: 1, quantity: 2, price: 10 },
    +  { productId: 2, quantity: 1, price: 20 },
    +  // 更多商品...
    +];
    +
    +const totalAmount = orderItems.reduce((total, item) => {
    +  return total + item.quantity * item.price;
    +}, 0);
    +
    1. 将数组转换为对象 使用reduce 方法可以将数组转换为更复杂的数据结构,比如对象。
    interface User {
    +  id: number;
    +  name: string;
    +}
    +
    +const users: User[] = [
    +  { id: 1, name: "Alice" },
    +  { id: 2, name: "Bob" },
    +  // 更多用户...
    +];
    +//累加器:reduce 方法的第一个参数是一个回调函数,这个回调函数接收两个参数:当前的累加器(obj)和当前正在处理的数组元素(user)。
    +const usersById = users.reduce((obj, user) => {
    +  obj[user.id] = user; // *将用户对象添加到以用户ID为键的对象中*
    +  return obj;
    +
    +  console.log(obj); // { 1: { id: 1, name: "Alice" }, 2: { id: 2, name: "Bob" } }
    +}, {} as { [key: number]: User }); // 以空对象作为初始值
    +
    +console.log(usersById); // { 1: { id: 1, name: "Alice" }, 2: { id: 2, name: "Bob" } }
    +

    当你看到这种写法 obj[user.id] = user;,它是一种在 JavaScript 和 TypeScript 中常用的方式,用于将数组中的元素映射到一个对象的属性上。具体来说,这种写法是在构造一个以 user.id 作为键(key),user 对象本身作为值(value)的对象。

    在这个表达式中:

    • obj 是一个对象,通常是一个空对象 {},它在 reduce 函数的迭代过程中不断被更新。
    • user 是当前正在迭代的数组元素。
    • user.iduser 对象的一个属性,这里用作新对象的键。
    • obj[user.id] 表示在 obj 对象中创建或更新一个以 user.id 的值为键的属性。
    • obj[user.id] = user; 表示将当前的 user 对象赋值给这个键。
    1. 分类汇总数据: 对数组中的项目进行分类,并计算每个类别中的项目数量。
    interface Product {
    +  id: number;
    +  category: string;
    +}
    +
    +const products: Product[] = [
    +  { id: 1, category: "Electronics" },
    +  { id: 2, category: "Books" },
    +  // 更多产品...
    +];
    +
    +const categoryCount = products.reduce((count, product) => {
    +  count[product.category] = (count[product.category] || 0) + 1;
    +  return count;
    +}, {} as { [key: string]: number });
    +

    {} as { [key: string]: number }); 是一種 type assertion, 用來告訴編譯器, 這個空對象的類型是 { [key: string]: number }{ [key: string]: number }:这是一个索引签名类型。它描述了一个对象,这个对象可以拥有任意数量的属性,但所有属性的键(key)都是字符串类型,而对应的值(value)都是数字类型。

    [key: string]: 表示对象的键是字符串类型。key 在这里只是一个占位符,你可以使用任何名称。 +number: 表示属性值的类型必须是数字。

    1. 创建值的累积数组: 创建一个新数组,其中每个元素是原始数组中对应元素及其之前所有元素的累积和。
    const numbers = [1, 2, 3, 4, 5];
    +
    +const cumulativeSum = numbers.reduce((acc, value) => {
    +  if (acc.length > 0) {
    +    acc.push(value + acc[acc.length - 1]);
    +  } else {
    +    acc.push(value);
    +  }
    +  return acc;
    +}, [] as number[]);
    +

    # 使用場景:

    在餐厅应用程序(Restaurant App)的开发中,reduce 方法可以在许多场景中发挥重要作用,尤其是在处理数据汇总、统计分析以及复杂的数组转换时。以下是一些针对餐厅应用的 TypeScript 示例,展示了 reduce 方法的不同用途:

    1. 统计不同类型菜品的数量

    假设你的餐厅应用需要对菜单中不同类型的菜品进行统计。

    interface MenuItem {
    +  id: number;
    +  name: string;
    +  type: "starter" | "main" | "dessert";
    +}
    +
    +const menuItems: MenuItem[] = [
    +  // 菜单数据...
    +];
    +
    +const itemCountByType = menuItems.reduce((count, item) => {
    +  count[item.type] = (count[item.type] || 0) + 1;
    +  return count;
    +}, {} as { [key: string]: number });
    +
    1. 计算每日总销售额

    计算一天内所有订单的总销售额。

    interface Order {
    +  id: number;
    +  totalAmount: number;
    +  date: Date;
    +}
    +
    +const orders: Order[] = [
    +  // 当日订单数据...
    +];
    +
    +const totalSales = orders.reduce(
    +  (total, order) => total + order.totalAmount,
    +  0
    +);
    +
    1. 汇总顾客反馈

    将所有顾客的评论汇总成一个字符串。

    interface Review {
    +  id: number;
    +  comment: string;
    +}
    +
    +const reviews: Review[] = [
    +  // 顾客评论数据...
    +];
    +
    +const allComments = reviews.reduce(
    +  (comments, review) => comments + review.comment + " ",
    +  ""
    +);
    +
    1. 创建菜品成分列表

    假设你需要从所有菜品中创建一个包含所有独特成分的列表。

    interface Dish {
    +  id: number;
    +  ingredients: string[];
    +}
    +
    +const dishes: Dish[] = [
    +  // 菜品数据...
    +];
    +
    +const allIngredients = dishes
    +  .reduce(
    +    (ingredients, dish) => ingredients.concat(dish.ingredients),
    +    [] as string[]
    +  )
    +  .filter((value, index, self) => self.indexOf(value) === index); // 移除重复项
    +
    1. 分类订单并计算每类的总金额

    假设你需要按顾客类型(比如会员和非会员)分类订单,并计算每一类的总金额。

    interface CustomerOrder {
    +  id: number;
    +  customerId: number;
    +  totalAmount: number;
    +  isMember: boolean;
    +}
    +
    +const customerOrders: CustomerOrder[] = [
    +  // 顾客订单数据...
    +];
    +
    +const totalAmountByCustomerType = customerOrders.reduce((totals, order) => {
    +  const key = order.isMember ? "members" : "nonMembers";
    +  totals[key] = (totals[key] || 0) + order.totalAmount;
    +  return totals;
    +}, {} as { members: number; nonMembers: number });
    +

    # 🔸 21. reduceRight()

    • 功能:类似于reduce(),但从右到左执行。
    • 示例:
      // 示例与`reduce()`类似,仅改变迭代方向
      +

    # 🔸 22. includes()

    # 功能:

    • 判断数组是否包含指定的值, 返回布尔值。

    • 只能檢測基本類型的值, 不能檢測引用類型的值

    • includes 方法接受两个参数:

      • searchElement:要查找的元素。
      • fromIndex:可选参数。开始查找的位置。如果省略,则从数组的第一个元素(索引位置 0)开始查找。如果该值为负数,则按升序从 array.length + fromIndex 的索引开始搜索。如果 fromIndex 大于或等于数组的长度,则 includes 不会查找数组,返回 false

    # 示例:

    let site = ["facebook", "google", "youtube"];
    +console.log(site.includes("youtube")); // true
    +console.log(site.includes("yahoo")); // false
    +

    # 23.🔸 from()

    • 功能:从类数组或可迭代对象创建一个新数组。
    • 示例:
      var all = {
      +  0: "张飞",
      +  1: "28",
      +  2: "男",
      +  3: ["率土", "鸿图", "三战"],
      +  length: 4,
      +};
      +var list = Array.from(all);
      +console.log(list);
      +

    # 24. 🔸 find()

    • 功能:返回数组中满足提供的测试函数的第一个元素的值。否则返回undefined
    • 示例:
      var list = [55, 66, 77, 88, 99, 100];
      +var res = list.find(function (item) {
      +  return item > 60;
      +});
      +console.log(res); // 66
      +

    # 25. 🔸 findIndex()

    • 功能:返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。
    • 示例:
      var list = [55, 66, 77, 88, 99, 100];
      +var index = list.findIndex(function (item) {
      +  return item > 60;
      +});
      +console.log(index); // 1
      +

    # 26. 🔸 fill()

    • 功能:用一个固定值填充数组中从起始索引到终止索引内的全部元素。
    • 示例:
      var result = ["a", "b", "c"].fill("填充", 1, 2);
      +console.log(result); // ["a", "填充", "c"]
      +

    # 27. 🔸 flat()

    • 功能:创建一个新数组,其中所有子数组元素递归地连接到指定深度。

    • 示例:

      var list = [1, 2, [3, 4, [5]]];
      +var arr = list.flat();
      +console.log("拉平一次", arr); // [1, 2, 3, 4, [5]]
      +
      +var arr2 = list.flat(2); // 拉平两次
      +console.log("拉平两次", arr2); // [1, 2, 3, 4, 5]
      +

    # 28. 🔸 flatMap()

    • 功能:首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。
    • 示例:
      var list = [55, 66, 77, 88, 99, 100];
      +var newArr = list.flatMap(function (item, index) {
      +  return [item, index];
      +});
      +console.log("flatMap方法:", newArr);
      +// 结果: [[55, 0], [66, 1], [77, 2], [88, 3], [99, 4], [100, 5]]
      +
    + + + diff --git a/guide/javascript/js-study-notes.html b/guide/javascript/js-study-notes.html new file mode 100644 index 00000000..32a8c943 --- /dev/null +++ b/guide/javascript/js-study-notes.html @@ -0,0 +1,74 @@ + + + + + + ⚪️ Javascript -articles の研究例をいくつか | ☻ itsyuimorii.space + + + + + + + + +

    # ⚪️ Javascript -articles の研究例をいくつか

    + + + diff --git a/guide/nextjs/index.html b/guide/nextjs/index.html new file mode 100644 index 00000000..9ef0689d --- /dev/null +++ b/guide/nextjs/index.html @@ -0,0 +1,74 @@ + + + + + + Next.js | ☻ itsyuimorii.space + + + + + + + + +
    + + + diff --git a/guide/nextjs/nextjs-basic.html b/guide/nextjs/nextjs-basic.html new file mode 100644 index 00000000..8d7985ac --- /dev/null +++ b/guide/nextjs/nextjs-basic.html @@ -0,0 +1,78 @@ + + + + + + ⚪️ Next.js を基礎から理解する | ☻ itsyuimorii.space + + + + + + + + +

    # ⚪️ Next.js を基礎から理解する

    + + + diff --git a/guide/nextjs/nextjs-study-notes.html b/guide/nextjs/nextjs-study-notes.html new file mode 100644 index 00000000..0e4f1423 --- /dev/null +++ b/guide/nextjs/nextjs-study-notes.html @@ -0,0 +1,113 @@ + + + + + + ⚪️ Next.js-articles の研究例をいくつか | ☻ itsyuimorii.space + + + + + + + + +

    # ⚪️ Next.js-articles の研究例をいくつか

    # 🔸 ext.js 13 的 app 目录模式功能梳理 文章連結 (opens new window)

    # 约定页面相关内容

    指约定一个页面需要有一个单独的目录,目录下约定以下文件:

    page.js - 页面组件(app/page.js 代表路由为 / 的页面,其实就类似于取代 index.js),有 page.js才能表明该约定文件路由是一个页面 +layout.js - 布局组件,切换路由时保留状态,不重新渲染。 +template.js - 模版组件,和 layout 类似,但切换路由时会重新渲染,不保留状态。 +loading.js - 加载组件,就是使用 Suspense 组件包裹 Page 组件,在 Page 组件渲染返回内容之前显示加载组件。 +error.js - 错误文件,页面渲染异常的时候显示的组件。 +not-found.js- 页面 404 组件,只在 app 目录下第一级目录生效,存在时只有根 layout 生效。

    除了 not-found.js ,其他的约定组件则对 app 下所有目录生效。

    app
    +├── features
    +│ ├── metadata
    +│ │ └── page.tsx
    +│ ├── layout.tsx
    +│ ├── template.tsx
    +│ ├── loading.tsx
    +│ └── error.tsx
    +├── page.tsx
    +├── layout.tsx
    +├── template.tsx
    +├── loading.tsx
    +├── error.tsx
    +└── not-found.tsx
    +

    # 平行路由和插槽功能

    也就是多个平行的路由可以在同一个页面当成组件来显示,提升代码的组织能力。 使用方式为:使用 @ 开头的目录名下面的文件,将会自动注入到 Layout 组件的 props 中。比如: 数据面板页面,页面分为了两个模块:用户数据模块、性能数据模块

    app
    +├── dashboard
    +│   ├── @userInfo  // 用户行为数据模块
    +│   │   ├── devices  // 用户设备信息
    +│   │   │   └── page.tsx
    +│   │   ├── locations  // 用户地理位置分布
    +│   │   │   └── page.tsx
    +│   │   ├── default.tsx
    +│   │   └── page.tsx
    +│   ├── @performance  // 性能数据模块
    +│   │   ├── app  // app 性能数据
    +│   │   │   └── page.tsx
    +│   │   ├── web  // web性能数据
    +│   │   │   └── page.tsx
    +│   │   ├── default.tsx
    +│   │   ├── page.tsx
    +│   │   └── default.tsx
    +│   └── layout.tsx
    +├── page.tsx
    +└── layout.tsx
    +

    # Nextjs 渲染方式

    # 🔹 Next.js 中的渲染模式文章連結 (opens new window)

    # 🔸 理解前端基础渲染模式| CSR、SSR、同构、静态化文章連結 (opens new window)

    # 什麼是渲染?

    渲染可理解為將頁面數據和頁面模板組裝成 html 的過程, 也就是 data+template = html, data可以是為 null, null 也是一種數據, template可以是為 null, null 也是一種模板, 這樣就可以得到一個空的 html, 這個 html 也是一個頁面, 只是沒有任何內容而已.

    # 客户端渲染(CSR)

    • CSR(Client Side Rendering)就是 data + template = html 过程在客户端进行,服務端直接返回一個空的 html, 然後客戶端再去請求數據, 然後再將數據和模板組裝成 html, 這樣的好處是服務端只需要返回一個空的 html, 這樣可以減輕服務端的壓力, 但是客戶端需要等待數據請求完成, 然後再將數據和模板組裝成 html, 這樣的好處是可以減輕服務端的壓力, 但是客戶端需要等待數據請求完成, 然後再將數據和模板組裝成 html

    • CSR(Client Side Rendering)就是在浏览器从服务器中获取到的只是一个带有空 div 标签的 html 文件,然后执行 js 文件生成 dom 和操作 dom,日常中开发的后台管理类的系统大多都是 CSR 的模式。

    打包的时候生成只有cssjs等外链标签的空白页面,客户端在请求时,服务端不做任何处理,直接以原文件的形式返回给客户端客户端,客户端获取到页面后,在加载完 js 后才通过 js 来渲染页面内容。

    # 服务端渲染(SSR)

    • SSR(Server Side Rendering)是在服务端已经完成渲染工作,浏览器从服务器获得的是完整的网页的 dom 字符串。不同于以前通过后端模板等方案生成页面,现在的 React、Vue、Svelte 等优秀框架都有 SSR 的解决方案。

    • 具体解释就是:服务端渲染的模式下,当用户第一次请求页面时,由服务器把需要的组件或页面渲染成 HTML 字符串,然后把它返回给客户端。客户端拿到手的,是可以直接渲染然后呈现给用户的 HTML 内容,不需要为了生成 DOM 内容自己再去跑一遍 JS 代码。使用服务端渲染的网站,可以说是“所见即所得”,页面上呈现的内容,我们在 html 源文件里也能找到。

    # 同构渲染(SSR + CSR)

    以上產生的問題思考: 渲染本質上就職字符串的拼接 ,將數據渲染進一些固定格式的 html 代碼中形成最終的 html 展示在用戶頁面上, 因为字符串的拼接必然会损耗一些性能资源。

    • 服务器端渲染消耗 server 端的性能
    • 客户端渲染,常见的手段,比如是直接生成 DOM 插入到 html 中,或者是使用一些前端的模板引擎等。他们初次渲染的原理大多是将原 html 中的数据标记(例如)替换。消耗的是 client 端的性能

    什麼是同構?

    同构应用(Isomorphic Application)是一种能够在服务器端和客户端同时运行的应用程序。

    在服务端先进行渲染一次(SSR,组装页面 html 内容),客户端拿到代码后,再进行渲染一次(CSH(client-side hydration),也就是 hydrate,主要对 html 进行事件绑定和内容校验,如果 hydrate 发现内容不一致的话,会在开发环境提示警告),后续页面的所有操作和渲染行为都和 CSR 一致(didMount 后的更新页面内容都属于正常的 CSR 了)。

    虚拟DOM(Virtual DOM)是用于构建同构应用的关键概念之一。虚拟 DOM 是一个抽象的 JavaScript 对象树,它模拟了真实的 DOM 结构,但不会直接与浏览器的 DOM 树进行交互。 相反,虚拟 DOM 用于在服务器端和客户端之间共享页面渲染逻辑。

    1. 性能优化: 直接操作浏览器的真实 DOM 树是一项昂贵的操作,因为每次修改都会导致浏览器重新布局和绘制。虚拟 DOM 允许应用程序在内存中构建和修改虚拟 DOM 树,然后通过比较虚拟 DOM 树的变化来找到最小的更新,从而减少对真实 DOM 的操作,提高性能。

    2. 跨平台渲染: 虚拟 DOM 不仅可以用于客户端浏览器,还可以在服务器端渲染(Server-Side Rendering,SSR)中使用。这意味着同一份虚拟 DOM 代码可以用于服务器端渲染,将 HTML 直接发送给客户端,以加快首次加载速度和提高 SEO。

    3. 可扩展性: 虚拟 DOM 允许应用程序将页面的渲染逻辑与具体的渲染目标(如浏览器、服务器、移动应用等)分离开来。这使得应用程序更容易在不同的环境中运行和扩展。

    **构建同构应用的最终目的是通过一份源代码构建出两份 JavaScript 代码,一份用于在服务器端运行渲染出 HTML,另一份用于在客户端运行并接管页面的交互。**这样,用户在访问同构应用时,首次加载页面时可以获得服务器端渲染的内容,而后续交互则由客户端接管,提供更好的用户体验和性能。

    # 快速理解 Next.js 中各种渲染方式的作用及区别(SSG、SSR、ISR、CSR文章連結 (opens new window)

    # 🔸 快速理解 Next.js 中数据获取方式的作用及区别(getInitialProps、getSer verSideProps、getStaticProps文章連結 (opens new window)

    # Nextjs 路由相關

    # 🔸 一起来学 next.js - API 路由篇文章連結 (opens new window)

    + + + diff --git a/guide/react/index.html b/guide/react/index.html new file mode 100644 index 00000000..d0097912 --- /dev/null +++ b/guide/react/index.html @@ -0,0 +1,76 @@ + + + + + + React | ☻ itsyuimorii.space + + + + + + + + +

    # React

    React は、インタラクティブなユーザインターフェイスの作成にともなう苦痛を取り除きます。アプリケーションの各状態に対応するシンプルな View を設計するだけで、React はデータの変更を検知し、関連するコンポーネントだけを効率的に更新、描画します。

    宣言的な View を用いてアプリケーションを構築することで、コードはより見通しが立ちやすく、デバッグのしやすいものになります。

    # References

    React 公式文書 (opens new window)

    ユーザインターフェース構築のための JavaScript ライブラリ (opens new window) React を学びましょう。

    Tao of React - Software Design, Architecture & Best Practices (opens new window)

    The new wave of React state management (opens new window) (Excellent read!)

    A Visual Guide to React Rendering - useMemo (opens new window)

    React as a UI Runtime (opens new window) (By Dan Abramov from the React team) +You Might Not Need an Effect (opens new window) (Official React docs)

    A Complete Guide to useEffect (opens new window) (By Dan Abramov) +useEffect sometimes fires before paint (opens new window)

    Making setInterval Declarative with React Hooks (opens new window) (By Dan Abramov)

    Redux - Not Dead Yet! (opens new window) (By Mark Erikson from the Redux team)

    Why React Context is Not a "State Management" Tool (opens new window) (By Mark Erikson)

    + + + diff --git a/guide/react/react-study-notes.html b/guide/react/react-study-notes.html new file mode 100644 index 00000000..ffeedb95 --- /dev/null +++ b/guide/react/react-study-notes.html @@ -0,0 +1,70 @@ + + + + + + ⚪️ React.js -articles の研究例をいくつか | ☻ itsyuimorii.space + + + + + + + + +
    + + + diff --git a/guide/react/reactBasics.html b/guide/react/reactBasics.html new file mode 100644 index 00000000..4c0fdcb7 --- /dev/null +++ b/guide/react/reactBasics.html @@ -0,0 +1,99 @@ + + + + + + ⚪️React を基礎から理解する | ☻ itsyuimorii.space + + + + + + + + +

    # ⚪️React を基礎から理解する

    # 🔶 React API とは

    React API とは、React が提供する機能のことです。React API は、React のコンポーネントを作成するために必要な機能を提供します。

    # 🔶 React API の種類

    React API には、以下の種類があります。

    • React.createElement() +React.createElement(type, [props], [...children])

      • 用来创建 React 元素
      • React の要素は、一度作成すると変更することができず、新しい要素を作成してレンダリングすることしかできない。
    • ReactDOM.createRoot() +createRoot(container[, options])

      • 用来创建 React 的根容器,容器用来放置 React 元素
    • ReactDOM.render() +root.render(element)

      • 用来将 React 元素渲染到根元素中
      • 根元素中所有的内容都会被删除,被 React 元素所替换
      • 当重复调用 render()时,React 会将两次的渲染结果进行比较,
      • 它会确保只修改那些发生变化的元素,对 DOM 做最少的修改

    # ▫️ React.createElement

    • React 要素を作成するためのメソッドで、DOM 要素ではなく React 要素を生成します。

    • DOM 要素は最終的にページに表示される要素であり、React 要素は実際に操作する要素です。

    • 両者は仮想 DOM を介して操作され、相互に関連しています。

    • 原則として、React 要素を操作する際には、原生の DOM 要素を直接操作せず、React の仮想 DOM 構造を壊さないように心がけるべきです。

    • React.createElement 関数の戻り値は React 要素であり、React 内の仮想 DOM 構造において操作されます。

    • React でのイベントはキャメルケースで表記されるべきであり、例えば、onClick、onMouseOver、onMouseOut などがあります。

    • React 要素は、type、props、children の 3 つのプロパティを持つオブジェクトである。

      • type: string | function
      • props: object
      • children: ReactElement | string | number
      • return: ReactElement
    • 要素の命名規則:

      • 要素の名前: HTML タグは小文字である必要があり、React では大文字はコンポーネントとして解釈されます。
      • 要素のプロパティ: オブジェクトで、キーがプロパティの名前、値がプロパティの値です。
      • 要素の子要素: 1 つ以上の子要素で、テキスト、または要素、または要素の配列が可能です。

      注意:React において、イベントの設定と属性の設定は異なります。イベントの設定時には、属性名をキャメルケースに変更する必要があります。例えば、onClickonclickではなくonClickとなります。これは、ネイティブイベントと React イベントを区別するためであり、そのため React イベントの属性名はキャメルケースである必要があります。

      React において、onClickはコードを受け取るのではなく、関数を受け取ります。これは、onClickがトリガーされたときに関数が実行されることを意味します。onClick={() => alert("click me")}のように書くと、レンダリング時に即座に実行されず、クリック時にのみ実行されます。onClick={() => alert("click me")}のように直接書くと、onClickにはalert("click me")の戻り値が代入され、レンダリング時に実行されてしまいます。これを避け、クリック時に実行されるようにするためには、アロー関数を使用することが適切です。

      • const div = React.createElement('div', {}, button) 可以在子元素裡直接放 button 進去
    <div id="root"></div>;
    +
    +.....
    +
    +//create a react element
    +const button = react.createElement("button", {
    +    id: "btn",
    +    type:'button',
    +    className:'btn',
    +    onClick=()=>{alert('clicked')}
    +}, "Click me");
    +
    +//get the root element, 就是把dom元素轉換成react裏的根元素, 這樣才能render,  這裏的rootElement就是一個dom元素
    +
    +const rootElement = document.getElementById("root");
    +
    +//render the react element into the root element
    +ReactDOM.render(button, rootElement);
    +

    # ▫️ReactDOM.createRoot

    • ReactDOM.createRoot 関数は、React の根要素を作成するための関数です。

    # ▫️ReactDOM.render

    • ReactDOM.render 関数は、React 要素をレンダリングするための関数です。
    + + + diff --git a/guide/react/reactHooks.html b/guide/react/reactHooks.html new file mode 100644 index 00000000..d73d7821 --- /dev/null +++ b/guide/react/reactHooks.html @@ -0,0 +1,546 @@ + + + + + + ⚪️ React Hooks を基礎から理解する | ☻ itsyuimorii.space + + + + + + + + +

    # ⚪️ React Hooks を基礎から理解する

    # 🔷 useState とは

    useState()は、関数コンポーネントで state を管理(state の保持と更新)するための React フックであり、最も利用されるフックです。

    state とはコンポーネントが内部で保持する「状態」のことで、画面上に表示されるデータ等、アプリケーションが保持している状態を指しています。state は props と違い後から変更することができます

    # ▫️ useState の注意点

    1. Accepts a single parameter, the initial state value, which can be any data type:

    唯一のパラメータを受け取り、それが状態の初期値であり、初期値は任意のデータ型であることができます。

    // Example with a string initial state
    +const [text, setText] = useState("Hello");
    +
    +// Example with a number initial state
    +const [count, setCount] = useState(0);
    +
    +// Example with an object initial state
    +const [person, setPerson] = useState({ name: "John", age: 25 });
    +
    +return (
    +  <div>
    +    <p>{text}</p>
    +    <p>{count}</p>
    +    <p>{person.name}</p>
    +    <p>{person.age}</p>
    +    <button onClick={() => setText("Bye")}>Change Text</button>
    +  </div>
    +);
    +

    2. Returns an array containing the state value and a method to update the state:

    戻り値は、状態値と状態を更新するためのメソッドが含まれた配列で、メソッド名は "set" で始まり、後に状態名が続きます。

    // Example using a boolean state
    +const [isActive, setIsActive] = useState(false);
    +

    3. useState() can be used multiple times to store multiple states:

    useState()は複数回使用でき、異なる状態値を保存できます。

    // Example with two different states
    +const [name, setName] = useState("John");
    +const [age, setAge] = useState(25);
    +

    4. Parameter can be a function, and the initial state is determined by the function's return value. The function is only called once, it used when the initial value is dynamic.:

    パラメータは関数であることができ、関数が返すものが初期状態になります。関数は一度だけ呼び出され、初期の動的値の場合に使用されます。

    // Example with a function as the initial state
    +function App(props) {
    +  // 從外部 props 中取得 count 的值,如果不存在,預設為 0
    +  const propsCount = props.count || 0;
    +
    +  // 使用 useState,將初始值設置為一個函數,這個函數會在初始化時被調用一次
    +  const [count, setCount] = useState(() => {
    +    // 這裡可以進行一些邏輯處理,例如動態計算初始值
    +    return propsCount;
    +  });
    +}
    +
    +//這樣寫是有錯誤的 ❌,因為每次渲染都會調用 useState,這樣會導致每次渲染都會調用函數,這樣就不是只調用一次了。 正確寫法如下:
    +function App(props) {
    +    const [count , setCount] = useState(() => {
    +        return props.count || 0;
    +    });
    +    //這樣,這個函數就只會在渲染的時候執行。
    +
    +

    5.状態の設定メソッドの引数は値または関数にすることができます(つまり、値を渡すことも、関数を渡すこともできます。関数の戻り値によって新しい状態が設定されます。

    setCount() の引数は値であるか、あるいは関数であるか選択できます。関数の場合、その関数の引数は現在の状態値であり、関数の戻り値が新しい状態値となります。

    // 値を渡す
    +setCount(新しい値);
    +
    +// 関数を渡す
    +setCount((現在のCount) => {
    +  // ここで計算やロジックを行います
    +  // 戻り値が新しい状態値になります
    +  return 何らかの計算(現在のCount);
    +});
    +
    // Example with a function as the parameter
    +function App() {
    +  const [count, setCount] = useState(0);
    +
    +  function handleCountChange() {
    +    // setCount(count + 1);
    +    setCount((prevCount) => prevCount + 1);
    +  }
    +
    +  return (
    +    <div>
    +      <p>{count}</p>
    +      <button onClick={handleCountChange}>Change Count</button>
    +    </div>
    +  );
    +}
    +

    6. 状態の設定メソッド自体が非同期です

    状態の更新は非同期で行われるため、setCount を即座に呼び出しても、React はすぐに状態を更新しません。状態更新後に何らかの操作を実行する必要がある場合は、useEffect を使用するか、関数式の更新で前の状態値を使用します。

    // useEffect を使用する例
    +useEffect(() => {
    +  // ここで何らかの操作を実行します。これは状態が更新された後に実行されます
    +  console.log("Count updated:", count);
    +}, [count]); // count を useEffect の依存リストに追加することを忘れずに
    +
    +// あるいは関数式の更新で前の状態値を使用する例
    +setCount((前のCount) => {
    +  // ここで前の状態値(前のCount)を使用します
    +  return 前のCount + 1;
    +});
    +

    7. useState() can be used in a custom hook:

    useState()はカスタムフックで使用できます。

    // Custom hook
    +function useCounter(initialCount) {
    +  const [count, setCount] = useState(initialCount);
    +
    +  function increment() {
    +    setCount((prevCount) => prevCount + 1);
    +  }
    +
    +  function decrement() {
    +    setCount((prevCount) => prevCount - 1);
    +  }
    +
    +  return [count, increment, decrement];
    +}
    +
    +// Component using the custom hook
    +function App() {
    +  const [count, increment, decrement] = useCounter(0);
    +
    +  return (
    +    <div>
    +      <p>{count}</p>
    +      <button onClick={increment}>Increment</button>
    +      <button onClick={decrement}>Decrement</button>
    +    </div>
    +  );
    +}
    +

    # 🔶 useReducer とは

    React hooks を基礎から理解する (useReducer 編) (opens new window)

    状態管理のためのフックで、useState と似たような機能。useStateuseReducer に内部実装されています。

    (state, action) => newState という型の reducer を受け取り、現在の statedispatch 関数の両方を返します。

    const [state, dispatch] = useReducer(reducer, "初期値");
    +

    reducerstate を更新するための関数で、dispatch は、reducer を実行するための呼び出し関数です。 (変数を宣言するときに、state の更新方法をあらかじめ設定しておくことが出来る。) +dispatch(action)で実行 +action は何をするのかを示すオブジェクト  +{type: increment, payload: 0}のように、type プロパティ(action の識別子)と値のプロパティで構成されている。

    # ▫️ useReducer の注意点

    1. useReduceruseState の代替ではない

    useState と useReducer の比較

    特性 useState useReducer
    扱える state 的 type 数値、文字列、オブジェクト、論理値 オブジェクト、配列
    関連する state 的取り扱い 複数を同時に取り扱うことが出来る
    ローカル or グローバル ローカル グローバル useContext() と一緒に取り扱う

    # 🔷 useContext とは

    React コンポーネントのツリーに対して「グローバル」とみなすデータについて利用するように設計されています。 +コンポーネントの再利用をより難しくする為、慎重に利用しなくてはなりません。

    Context によってコンポーネントツリー間におけるデータの橋渡しについて、すべての階層ごとに渡す必要性がなくなり、props バケツリレーをしなくても下の階層で Context に収容されているデータにアクセスできるようになりました。

    useContext とは、Context 機能をよりシンプルに使えるようになった機能。 +親から Props で渡されていないのに、Context に収容されているデータへよりシンプルにアクセスできるというものです。

    [React] useContextの使い方を改めて確認してみた


    • without useReducer
    const { useState } = React;
    +
    +function Child(props) {
    +  const { count, setCount } = props;
    +  return (
    +    <>
    +      <h2>Child - {count}</h2>
    +      <button onClick={() => setCount(count + 1)}>add</button>
    +    </>
    +  );
    +}
    +
    +function Parent(props) {
    +  const { count, setCount } = props;
    +  return (
    +    <>
    +      <h2>Parent - {count}</h2>
    +      <Child count={count} setCount={setCount} />
    +    </>
    +  );
    +}
    +
    +function MyApp() {
    +  const [count, setCount] = useState(0);
    +  return (
    +    <>
    +      <h2>Root - {count}</h2>
    +      <Parent count={count} setCount={setCount} />
    +    </>
    +  );
    +}
    +
    +const container = document.getElementById("root");
    +const root = ReactDOM.createRoot(container);
    +root.render(<MyApp />);
    +

    The above code leads to the problem that the more nested levels are, the more props are passed, and the more difficult the code is to maintain.

    • useReducer 使わない場合
    const { useState, createContext, useContext } = React;
    +
    +// 1. Create a context object
    +const MyContext = createContext();
    +
    +function Child() {
    +  // 3. Retrieve values from the context object using useContext and destructure the object
    +  const { count, setCount } = useContext(MyContext);
    +  return (
    +    <>
    +      <h2>Child - {count}</h2>
    +      <button onClick={() => setCount(count + 1)}>add</button>
    +    </>
    +  );
    +}
    +
    +function Parent() {
    +  // const { count, setCount } = props;
    +  // 4. Retrieve values from the context object using useContext and destructure the object
    +  const { count } = useContext(MyContext);
    +  return (
    +    <>
    +      <h2>Parent - {count}</h2>
    +      {/* <Child count={count} setCount={setCount} />
    +          Child component can access context values directly */}
    +
    +      <Child/>
    +    </Child>
    +  );
    +}
    +
    +function MyApp() {
    +  const [count, setCount] = useState(0);
    +  return (
    +    <>
    +        {/* 2. Configure the context provider and pass the value.
    +           The 'value' prop contains the data to be passed, and all child components,
    +           including nested ones, can access it using useContext. */}
    +      <MyContext.Provider value={{ count, setCount }}>
    +        <h2>Root - {count}</h2>
    +        {/* Parent component can access context values directly */}
    +        <Parent />
    +      </MyContext.Provider>
    +    </>
    +  );
    +}
    +
    +const container = document.getElementById("root");
    +const root = ReactDOM.createRoot(container);
    +root.render(<MyApp />);
    +
    • useReducer と useContext を使わない場合
    const { useState, createContext, useContext, useReducer } = React;
    +
    +// Define the initial state and reducer function
    +const initialState = { count: 0 };
    +
    +function reducer(state, action) {
    +  switch (action.type) {
    +    case "increment":
    +      return { count: state.count + 1 };
    +    default:
    +      return state;
    +  }
    +}
    +
    +// Create a context object
    +const MyContext = createContext();
    +
    +function Child() {
    +  // Retrieve values from the context object using useContext and destructure the object
    +  const { state, dispatch } = useContext(MyContext);
    +  return (
    +    <>
    +      <h2>Child - {state.count}</h2>
    +      <button onClick={() => dispatch({ type: "increment" })}>add</button>
    +    </>
    +  );
    +}
    +
    +function Parent() {
    +  // Retrieve values from the context object using useContext and destructure the object
    +  const { state } = useContext(MyContext);
    +  return (
    +    <>
    +      <h2>Parent - {state.count}</h2>
    +      {/* Child component can access context values directly */}
    +      <Child />
    +    </>
    +  );
    +}
    +
    +function MyApp() {
    +  // Use useReducer to manage state
    +  const [state, dispatch] = useReducer(reducer, initialState);
    +
    +  return (
    +    <>
    +      {/* Configure the context provider and pass the value */}
    +      <MyContext.Provider value={{ state, dispatch }}>
    +        <h2>Root - {state.count}</h2>
    +        {/* Parent component can access context values directly */}
    +        <Parent />
    +      </MyContext.Provider>
    +    </>
    +  );
    +}
    +
    +const container = document.getElementById("root");
    +const root = ReactDOM.createRoot(container);
    +root.render(<MyApp />);
    +

    # 🔷 useEffect とは

    'useEffect' を使うと、'useEffect' に渡された関数はレンダーの結果が画面に反映された後に動作します。 +つまり 'useEffect' とは、「関数の実行タイミングを React のレンダリング後まで遅らせる 'hook'」です。

    副作用の処理(DOM の書き換え、変数代入、API 通信など UI 構築以外の処理)を関数コンポーネントで扱えます。 +クラスコンポーネントでのライフサイクルメソッドに当たります。

    'componentDidMount' +'componentDidUpdate' +'componentWillUnmount'

    副作用フックの利用法 + (opens new window)

    # ▫️ 副作用を実行、制御するために useEffect を利用する

    useEffect()の基本構文は以下の通りです。関数コンポーネントのトップレベルで宣言します。

    useEffect(() => {
    +  /_ 第 1 引数には実行させたい副作用関数を記述_/;
    +  console.log("副作用関数が実行されました!");
    +}, [依存する変数の配列]); // 第 2 引数には副作用関数の実行タイミングを制御する依存データを記述
    +

    第 2 引数を指定することにより、第 1 引数に渡された副作用関数の実行タイミングを制御することができます。React は第 2 引数の依存配列の中身の値を比較して、副作用関数をスキップするかどうかを判断します。

    # ▫️ 執行時機

    可以把useEffect 函數卡奴走 componentDidiMount、componentDidUpdate、componentWillUnmount 三個生命週期函數的組合體。

    • useEffect(() => {}); componentDidMount + componentDidUpdate;
    • useEffect(() => {}, []); componentDidMount;
    • useEffect(() => () => {}); componentWillUnmount;

    以下是 useEffect 的理解:

    1. useEffect(() => {}); - componentDidMount + componentDidUpdate:

      • この形式の useEffect は、コンポーネントのレンダリング後に実行され、コンポーネントが更新されるたびにも実行されます。
      • componentDidMountcomponentDidUpdate の組み合わせに相当します。
      useEffect(() => {
      +  // ここにあるコードはコンポーネントのレンダリング後および更新時に実行されます
      +});
      +
    2. useEffect(() => {}, []); - componentDidMount:

      • この形式の useEffect は、コンポーネントのレンダリング後にのみ実行され、コンポーネントの更新時には実行されません。
      • componentDidMount だけが実行された場合と同じです。
      useEffect(() => {
      +  // ここにあるコードはコンポーネントのレンダリング後に一度だけ実行されます
      +}, []);
      +
    3. useEffect(() => () => {}); - componentWillUnmount:

      • この形式の useEffect では、返り値として返された関数はコンポーネントがアンマウント(消える)される際に実行され、componentWillUnmount に相当します。
      • 返り値として返された関数はコンポーネントがアンマウントされる前に実行され、リソースのクリーンアップや購読の解除に使用できます。
      useEffect(() => {
      +  // ここにあるコードはコンポーネントのレンダリング後に実行されます
      +
      +  // 返り値として返された関数はコンポーネントがアンマウントされる前に実行されます
      +  return () => {
      +    // リソースのクリーンアップや購読の解除などのコード
      +  };
      +}, []);
      +

    # ▫️ useEffect の使い方

    1. 為 window 對象添加滾動事件 - componentDidMount + componentDidUpdate
    import React, { useEffect } from "react";
    +
    +function App() {
    +  function onScroll() {
    +    console.log("onScroll");
    +  }
    +  useEffect(() => {
    +    // 組件渲染後,添加滾動事件
    +    window.addEventListener("scroll", onScroll);
    +    return () => {
    +      // 組件卸載時,移除滾動事件
    +      window.removeEventListener("scroll", onScroll);
    +    };
    +  }, []);
    +  return <div>App</div>;
    +}
    +
    +export default App;
    +
    1. 定時器:掛載定時器,要在組件渲染後才能掛載,所以要在 useEffect 中掛載定時器
    import React, { useEffect, useState } from "react";
    +import ReactDom from "react-dom";
    +
    +function App() {
    +  const [count, setCount] = useState(0);
    +  useEffect(() => {
    +    const timerId = setInterval(() => {
    +      setCount(count + 1);
    +    }, 1000);
    +    return () => {
    +      clearInterval(timerId);
    +    };
    +  }, []);
    +  return (
    +    <div>
    +      <span>{count}</span>
    +      <button onClick={() => ReactDOM.unmountComponentAtNode()}>
    +        卸載組件
    +      </button>
    +    </div>
    +  );
    +}
    +

    # ▫️ useEffect 依賴項

    依存配列の値が変化した場合のみ副作用関数を実行させる +useEffect()の第2引数に[count]を渡すと、count に変化があったときだけ副作用関数を実行します。

    import React, { useState, useEffect } from "react";
    +import { makeStyles } from "@material-ui/core/styles";
    +import ButtonGroup from "@material-ui/core/ButtonGroup";
    +import Button from "@material-ui/core/Button";
    +import Input from "@material-ui/core/Input";
    +
    +const useStyles = makeStyles((theme) => ({
    +  root: {
    +    "& > *": {
    +      margin: theme.spacing(1),
    +    },
    +  },
    +}));
    +
    +const EffectFunc = () => {
    +  const classes = useStyles();
    +  const [count, setCount] = useState(0);
    +  const [name, setName] = useState({
    +    lastName: "",
    +    firstName: "",
    +  });
    +  useEffect(() => {
    +    document.title = `${count}回クリックされました`;
    +  }, [count]);
    +
    +  return (
    +    <>
    +      <p>{`${count}回クリックされました`}</p>
    +      <ButtonGroup color="primary" aria-label="outlined primary button group">
    +        <Button onClick={() => setCount((prev) => prev + 1)}>ボタン</Button>
    +        <Button onClick={() => setCount(0)}>リセット</Button>
    +      </ButtonGroup>
    +      <p>{`私の名前は${name.lastName} ${name.firstName}です`}</p>
    +      <form className={classes.root} noValidate autoComplete="off">
    +        <Input
    +          placeholder="姓"
    +          value={name.lastName}
    +          onChange={(e) => {
    +            setName({ ...name, lastName: e.target.value });
    +          }}
    +        />
    +        <Input
    +          placeholder="名"
    +          value={name.firstName}
    +          onChange={(e) => {
    +            setName({ ...name, firstName: e.target.value });
    +          }}
    +        />
    +      </form>
    +    </>
    +  );
    +};
    +
    +export default EffectFunc;
    +

    # 🔷 useRef とは

    useRef 是 React 提供的一个 Hook,其主要特点是用于在函数组件中保存和访问可变的引用。以下是 useRef 的主要特点:

    1. 保存可变的引用: useRef 创建一个对象,该对象的 current 属性可以被赋值为任何可变的值。这使得在整个组件的生命周期内都可以访问和修改该值,而不引发组件重新渲染。

    2. 不触发重新渲染:useRefcurrent 属性被修改时,不会触发组件的重新渲染。这使得它非常适合存储不需要引起视图更新的数据,例如 DOM 元素引用、定时器 ID、或其他持久性数据。

    3. 持久性数据存储: useRef 创建的引用是持久的,即使组件重新渲染,引用仍然保持不变。这与 useState 不同,后者在重新渲染时会创建新的状态。

    4. 访问 DOM 元素: useRef 常用于引用 DOM 元素。当 ref 属性附加到 JSX 元素上时,useRefcurrent 属性将持有该元素的引用。

    5. 适用于保存上一个值: useRef 也常用于保存上一个状态值,因为它不会引发重新渲染,可以在渲染期间保留其值。

    下面是一个简单的示例,演示了 useRef 保存 DOM 元素引用的情况:

    import { useRef, useEffect } from "react";
    +
    +const ExampleComponent = () => {
    +  const inputRef = useRef < HTMLInputElement > null;
    +
    +  useEffect(() => {
    +    // 在组件挂载后,通过 inputRef.current 访问 input 元素
    +    if (inputRef.current) {
    +      inputRef.current.focus();
    +    }
    +  }, []);
    +
    +  return <input ref={inputRef} />;
    +};
    +

    在这个例子中,inputRef 用于引用 input 元素,而不需要通过 document.getElementById 或其他方式获取。

    key characteristics of the useRef hook:

    1. Mutable Reference: useRef creates a mutable object that persists across renders.

    2. Preservation of Value: The value assigned to current property of the useRef object persists between renders.

    3. Doesn't Trigger Re-renders: Updating the current property of a useRef does not trigger a re-render of the component.

    4. Preserving Values Without Re-renders: It's useful for holding values that need to be preserved between renders but don't require triggering a re-render.

    5. Common Use Cases:

    • Managing and maintaining references to DOM elements.
    • Holding values that should persist without causing re-renders.
    • Storing mutable values without triggering component updates.
    1. When to Use: useRef is useful for managing and maintaining references to DOM elements, storing mutable values that don't trigger re-renders, and storing mutable values that you want to persist across renders.

    2. When Not to Use: useRef should not be used to manage state or trigger re-renders.

    Note: useRef is not a replacement for useState. Always use useState when you need to manage state that changes over time. useRef is useful for storing mutable values that don't change over time, such as a reference to a DOM node or a value computed in a previous render.

    Note: useRef returns a mutable ref object whose .current property is initialized to the passed argument (initialValue). The returned object will persist for the full lifetime of the component.

    Note: useRef() is useful for more than the ref attribute. It’s handy for keeping any mutable value around similar to how you’d use instance fields in classes.

    # 🔷 useCallback とは

    # 🔺 Example

    在實際應用中,useCallback 的使用場景通常涉及到優化性能,特別是在 React 應用中傳遞回調函數給子組件的情況。以下是一個實際應用的例子:

    假設你有一個點餐應用(類似 SkipTheDishes),你有一個頁面顯示用戶的訂單列表。每個訂單都有一個狀態,比如"已下單"、"準備中"、"配送中"等。你的應用可能會有一個組件來顯示單個訂單的詳細信息,並且你希望在點擊"更新狀態"按鈕時觸發一個回調函數來更新訂單的狀態。

    import React, { useState, useCallback } from "react";
    +
    +const OrderDetails = ({ order, onUpdateStatus }) => {
    +  // ...
    +
    +  const handleUpdateStatus = useCallback(() => {
    +    // 在這裡處理更新訂單狀態的邏輯
    +    onUpdateStatus(order.id, newStatus);
    +  }, [onUpdateStatus, order.id, newStatus]);
    +
    +  return (
    +    <div>
    +      {/* 顯示訂單詳細信息 */}
    +      <p>Order ID: {order.id}</p>
    +      <p>Status: {order.status}</p>
    +
    +      {/* 更新狀態按鈕 */}
    +      <button onClick={handleUpdateStatus}>Update Status</button>
    +    </div>
    +  );
    +};
    +
    +const OrderList = ({ orders }) => {
    +  // ...
    +
    +  const handleUpdateStatus = useCallback((orderId, newStatus) => {
    +    // 在這裡處理更新訂單狀態的邏輯
    +    // 這個函數可能會在 OrderDetails 組件中使用,因此使用 useCallback 進行優化
    +    console.log(`Updating status of order ${orderId} to ${newStatus}`);
    +  }, []);
    +
    +  return (
    +    <div>
    +      <h2>Order List</h2>
    +      {/* 顯示訂單列表 */}
    +      {orders.map((order) => (
    +        <OrderDetails
    +          key={order.id}
    +          order={order}
    +          onUpdateStatus={handleUpdateStatus}
    +        />
    +      ))}
    +    </div>
    +  );
    +};
    +
    +const SkipTheDishesApp = () => {
    +  const [orders, setOrders] = useState(/* 初始訂單數據 */);
    +
    +  // ...
    +
    +  return <OrderList orders={orders} />;
    +};
    +

    在這個例子中,handleUpdateStatus 函數是一個回調函數,當你點擊"Update Status"按鈕時,這個函數會被觸發。由於它被傳遞給 OrderDetails 組件,我們使用 useCallback 來確保它只在 onUpdateStatusorder.idnewStatus 改變時才重新創建。這樣可以避免不必要的組件重新渲染,提高應用性能。


    # 🔷 useMemo とは

    Understanding useMemo and useCallback-Josh (opens new window)

    # 🔶 Hooks compare

    # ▫️ useCallback vs useMemo

    useMemouseCallback接收的参数都是一样,都是在其依赖项发生变化后才执行,都是返回缓存的值,区别在于 useMemo 返回的是函数运行的结果,useCallback 返回的是函数,这个回调函数是经过处理后的也就是说父组件传递一个函数给子组件的时候,由于是无状态组件每一次都会重新生成新的 props 函数,这样就使得每一次传递给子组件的函数都发生了变化,这时候就会触发子组件的更新,这些更新是没有必要的,此时我们就可以通过 useCallback 来处理此函数,然后作为 props 传递给子组件。

    /* 用react.memo */
    +const DemoChildren = React.memo((props) => {
    +  /* 只有初始化的时候打印了 子组件更新 */
    +  console.log("子组件更新");
    +  useEffect(() => {
    +    props.getInfo("子组件");
    +  }, []);
    +  return <div>子组件</div>;
    +});
    +
    +const DemoUseCallback = ({ id }) => {
    +  const [number, setNumber] = useState(1);
    +  /* 此时usecallback的第一参数 (sonName)=>{ console.log(sonName) }
    +     经过处理赋值给 getInfo */
    +  const getInfo = useCallback(
    +    (sonName) => {
    +      console.log(sonName);
    +    },
    +    [id]
    +  );
    +  return (
    +    <div>
    +      {/* 点击按钮触发父组件更新 ,但是子组件没有更新 */}
    +      <button onClick={() => setNumber(number + 1)}>增加</button>
    +      <DemoChildren getInfo={getInfo} />
    +    </div>
    +  );
    +};
    +
    + + + diff --git a/guide/react/reactRedux.html b/guide/react/reactRedux.html new file mode 100644 index 00000000..8362800a --- /dev/null +++ b/guide/react/reactRedux.html @@ -0,0 +1,74 @@ + + + + + + React Redux を基礎から理解する | ☻ itsyuimorii.space + + + + + + + + +

    # React Redux を基礎から理解する

    + + + diff --git a/guide/react/reactRouter.html b/guide/react/reactRouter.html new file mode 100644 index 00000000..5e10c23c --- /dev/null +++ b/guide/react/reactRouter.html @@ -0,0 +1,302 @@ + + + + + + ⚪️ React Router を基礎から理解する | ☻ itsyuimorii.space + + + + + + + + +

    # ⚪️ React Router を基礎から理解する

    # 🔶 Basic Purpose

    当我们谈论浏览器中的 URL 以及它如何与前端和后端路由相关时,我们指的是以下概念:

    瀏覽器地址欄的 URL URL => request => backend server

    前端路由

    攔截不同的 URL, 去渲染不同的組件,服務器是不知道的。 (組件中可能向後端請求 API 接口數據)

    • 前端路由主要负责在浏览器端处理不同的 URL 请求。
    • 它通过拦截 URL 的变化来决定渲染哪个组件,而不是将请求发送到服务器。
    • 在前端路由中,页面不会重新加载;相反,它通常会在当前页面动态地替换显示的内容(组件)。
    • 虽然前端路由处理的是 URL,但服务器通常对此无感知。在这种机制下,组件可能会根据需要向后端请求 API 数据。

    后端路由

    接收不同的 URL,執行不同的代碼處理,響應不同的數據(json)

    • 后端路由处理来自浏览器的请求,并根据不同的 URL 路径执行服务器上的特定代码。
    • 它负责接收请求,并根据请求的 URL 返回相应的数据(如 JSON 格式的数据)。
    • 后端路由是传统网页应用中常见的模式,每个 URL 请求通常对应服务器上的一个特定处理函数或模块。

    总结

    • 前端路由和后端路由共同作用于提供完整的网页应用体验。
    • 前端路由使得单页面应用(SPA)能够动态地更改显示的内容而无需加载新页面,提高用户体验。
    • 后端路由处理实际的数据请求和处理逻辑,为前端提供所需的数据。
    • 这种分离使得应用可以更灵活地响应用户的操作,同时优化性能和用户体验。

    React Router Tutorial (opens new window) 代碼例子 (opens new window)

    main.js

    import * as React from "react";
    +import * as ReactDOM from "react-dom/client";
    +import { createBrowserRouter, RouterProvider } from "react-router-dom";
    +import "./index.css";
    +import Root from "./routes/root";
    +
    +const router = createBrowserRouter([
    +  {
    +    path: "/",
    +    element: <Root />,
    +  },
    +]);
    +
    +ReactDOM.createRoot(document.getElementById("root")).render(
    +  <React.StrictMode>
    +    {/* 2. 配置使用- 路有對象 */}
    +    <RouterProvider router={router} />
    +  </React.StrictMode>
    +);
    +

    # 🔶 様々なシーン

    # ▫️ Takeaway 01: 理解匹配失敗的處理: 對象useRouteError()errorElement

    • 對象useRouteError()可以看到匹配失敗的信息

    • errorElement: 用於渲染匹配失敗的組件

      touch src/error-page.jsx

    import { useRouteError } from "react-router-dom";
    +
    +export default function ErrorPage() {
    +  //創建了一個error對象, 這個對象包含了匹配失敗的信息
    +  const error = useRouteError();
    +  //有錯誤才會渲染這個組件,然後在這個裡面獲取錯誤對象,拿到錯誤對象進行打印。
    +
    +  console.error(error);
    +
    +  return (
    +    <div id="error-page">
    +      <h1>Oops!</h1>
    +      <p>Sorry, an unexpected error has occurred.</p>
    +      <p>
    +        {/* statusText: 狀態文本 = Not Found */}
    +        <i>{error.statusText || error.message}</i>
    +      </p>
    +    </div>
    +  );
    +}
    +

    errorobject

    # ▫️ Takeaway 02: 理解 nested-routes (opens new window)的概念

    1. 👉 导入联系人组件并创建新路线
    /* existing imports */
    +import Contact from "./routes/contact";
    +
    +const router = createBrowserRouter([
    +  {
    +    path: "/",
    +    element: <Root />,
    +    errorElement: <ErrorPage />,
    +  },
    +  {
    +    path: "contacts/:contactId",
    +    element: <Contact />,
    +  },
    +]);
    +

    现在,如果我们单击其中一个链接或访问,/contacts/1 我们就会得到新组件!但是,它不在我们的root布局内 😠 +我们通过将联系路由设为根路由的子路由来实现这一点。 现在,您将再次看到根布局,但右侧有一个空白页面。我们需要告诉根路由我们希望它在哪里呈现其子路由。我们用 来做到这一点<Outlet>

    • 找到<div id="detail">并在里面放一个插座, 👉 渲染<Outlet>

      export default function Root() {
      +  return (
      +    <>
      +      {/* all the other elements */}
      +      <div id="detail">
      +        <Outlet />
      +      </div>
      +    </>
      +  );
      +}
      +
    • 👉 将联系人路由移至根路由的子路由 main.js

    const router = createBrowserRouter([
    +  {
    +    path: "/",
    +    element: <Root />,
    +    errorElement: <ErrorPage />,
    +    // 子路由, 應該是一個對象,裡面配置路由的路徑和組件
    +    children: [
    +      {
    +        path: "contacts/:contactId",
    +        element: <Contact />,
    +      },
    +    ],
    +  },
    +]);
    +

    為什麼要用<Link to>而不是<a href>? +因為a href會刷新頁面,而 Link 不會刷新頁面, 因為從服務器獲取頁面的代價是很大的,所以我們不希望刷新頁面。

    以下代碼, 在浏览器开发工具中打开网络选项卡,以查看它不再请求文档。

    import { Outlet, Link } from "react-router-dom";
    +
    +export default function Root() {
    +  return (
    +    <>
    +      <div id="sidebar">
    +        {/* other elements */}
    +
    +        <nav>
    +          <ul>
    +            <li>
    +              <Link to={`contacts/1`}>Your Name</Link>
    +            </li>
    +            <li>
    +              <Link to={`contacts/2`}>Your Friend</Link>
    +            </li>
    +          </ul>
    +        </nav>
    +
    +        {/* other elements */}
    +      </div>
    +    </>
    +  );
    +}
    +

    linktag

    # 🔶 loader and action

    # ▫️ Takeaway 01: 傳統式 form 表單的提交

    傳統式 form 表單的提交,會刷新頁面,然後服務器會返回一個新的頁面,然後頁面會重新加載,這樣就不是單頁面應用了。

    # ▫️ Takeaway 02: 理解 loader and actionß

    loader: 加載器, 用於加載數據, 顯示加載中的組件 +action: 用於加載數據, 顯示加載中的組件

    ▫️ 在 react-router 中,為什麼需要用 loader? 因為我們需要在獲取數據的時候,顯示加載中的組件,然後在獲取數據後,再顯示組件。 這樣就不會出現空白頁面的情況。 +▫️ 原因: react-router 希望我們把獲取數據的代碼放在 loader 中,然後在獲取數據後,再顯示組件。

    1. 👉 Configure the loader on the route main.jsx
    import Root, { loader as rootLoader } from "./routes/root";
    +const router = createBrowserRouter([
    +  {
    +   ....省略代碼
    +    loader: rootLoader,
    +    children: [
    +    ....省略代碼],
    +  },
    +]);
    +
    1. 👉 Export a loader from root.jsx

      獲取聯繫人列表,這裡是異步的獲取數據,然後獲取後,放入到 return 中 +一般是異步的獲取數據,

    import { Outlet, Link } from "react-router-dom";
    +import { getContacts } from "../contacts";
    +//異步的獲取數據
    +export async function loader() {
    +  const contacts = await getContacts();
    +  return { contacts }; //以對象的形式返回
    +}
    +....省略代碼
    +export default function Root() {}
    +....省略代碼
    +
    +
    1. 👉 Access and render the data
    import {
    +  Outlet,
    +  Link,
    +  useLoaderData,
    +} from "react-router-dom";
    +import { getContacts } from "../contacts";
    +
    +/* other code */
    +
    +export default function Root() {
    +  const { contacts } = useLoaderData();
    +
    +......省略代碼
    +  return....
    +<nav>
    +  {contacts.length ? (
    +    <ul>
    +      {contacts.map((contact) => (
    +        <li key={contact.id}>
    +          <Link to={`contacts/${contact.id}`}>
    +            {contact.first || contact.last ? (
    +              <>
    +                {contact.first} {contact.last}
    +              </>
    +            ) : (
    +              <i>No Name</i>
    +            )}{" "}
    +            {contact.favorite && <span></span>}
    +          </Link>
    +        </li>
    +      ))}
    +    </ul>
    +  ) : (
    +    <p>
    +      <i>No contacts</i>
    +    </p>
    +  )}
    +</nav>
    +
    1. Creating Contacts

    We'll create new contacts by exporting an action in our root route, wiring it up to the route config, and changing our <form> to a React Router <Form>.

    這裡需要理解,為什麼我要把 from 改為 Form? 因為我們轉發信息的時候,Form 會攔截,然後轉發給 action,然後 action 會獲取數據,然後再轉發給組件。 而傳統的 form 會直接發送請求到服務器,然後服務器會返回一個新的頁面,然後頁面會重新加載,這樣就不是單頁面應用了。

    import { Outlet, Link, Form } from "react-router-dom";
    +import { getContacts } from "../contacts";
    +
    +/* other code */
    +
    +<Form method="post">
    +  <button type="submit">New</button>
    +</Form>;
    +

    👉 Configure the loader and action on the route and Import and set the action on the route

    //封裝了action
    +import Root, {
    +  loader as rootLoader,
    +  action as rootAction,
    +} from "./routes/root";
    +//把action 綁定到這個路由上
    +const router = createBrowserRouter([
    +  {
    +    path: "/",
    +    element: <Root />,
    +    errorElement: <ErrorPage />,
    +    // 子路由, 應該是一個對象,裡面配置路由的路徑和組件
    +    loader: rootLoader,
    +    action: rootAction,
    +    children: [
    +      {
    +        path: "contacts/:contactId",
    +        element: <Contact />,
    +      },
    +    ],
    +  },
    +]);
    +

    思考:

    1. 那麼什麼時候用 loader, 什麼時候用 action 呢?
    • 當我們需要獲取數據的時候,就用 loader, 比如 get
    • 當我們需要提交數據的時候,就用 action, 比如 put,post
    1. 這裡有一個細節,
    <Form method="post">
    +  <button type="submit">New</button>
    +</Form>
    +
    1. 這裡配置時,並為配置 action, 所以提交表單後,會轉發到根目錄,也就是/, 然後根目錄配置了 action, 所以會轉發到 action 中,然後 action 中獲取數據,然後再轉發到組件中。

    2. 官網參考 +By convention, React Router uses this as a hint to automatically revalidate the data on the page after the action finishes. +action

    # 🔶 URL params in Loader

    These params are passed to the loader with keys that match the dynamic segment. For example, our segment is named :contactId so the value will be passed as params.contactId.

    //封裝loader 函數,用於獲取具體的聯繫信息
    +export async function loader({ params }) {
    +  console.log("params", params.contactId); //這裡每點擊new,就會打印出不同的id
    +  const contact = await getContact(params.contactId);
    +  return { contact };
    +}
    +
    +export default function Contact() {
    +  const { contact } = useLoaderData();
    +......省略代碼
    +
    const router = createBrowserRouter([
    +  {
    +......省略代碼
    +    children: [
    +      {
    +        path: "contacts/:contactId",
    +        element: <Contact />,
    +        loader: contactLoader,
    +      },
    +    ],
    +  },
    +]);
    +

    # 🔶 Updating data

    自定義的 Form 組件,意思就是還是會攔截,然後轉發給 action,然後 action 會獲取數據,然後再轉發給組件。

    <Form action="edit">
    +  <button type="submit">Edit</button>
    +</Form>
    +
    + + + diff --git a/guide/typescript/advanced.html b/guide/typescript/advanced.html new file mode 100644 index 00000000..bd17aa31 --- /dev/null +++ b/guide/typescript/advanced.html @@ -0,0 +1,777 @@ + + + + + + ⚪️ TypeScript Advanced Knowledge | ☻ itsyuimorii.space + + + + + + + + +

    # ⚪️ TypeScript Advanced Knowledge

    # Type Aliases

    Type aliases are used to give a new name to a type, often used with union types.

    type Name = string;
    +//Type Alias Name: This creates a type alias NameResolver for a function that takes no parameters and returns a string. It represents a function that resolves a name.
    +type NameResolver = () => string;
    +//Type Alias NameOrResolver: NameOrResolver is a union type alias that can be either a Name (string) or a NameResolver (function returning string). This allows flexibility in accepting different types for the getName function.
    +type NameOrResolver = Name | NameResolver;
    +//Function getName: The getName function takes a parameter x of type NameOrResolver. If x is a string, it's returned directly. If it's a function, the function is invoked to get the name. This function illustrates the flexibility provided by type aliases.
    +function getName(x: NameOrResolver) {
    +  if (typeof x === "string") {
    +    return x;
    +  }
    +  return x();
    +}
    +

    # Advantages:

    • Readability:

      • Type aliases allow you to give meaningful names to types, improving code readability. +In this example, Name, NameResolver, and NameOrResolver make the code more self-explanatory.
    • Reusability:

      • Type aliases promote the reuse of types throughout your codebase. +If you need to represent a name or a function that resolves a name in multiple places, using type aliases avoids redundancy.
    • Flexibility:

      • By combining different types into a union (NameOrResolver), you gain flexibility in function parameters. +This flexibility allows the getName function to accept either a name or a name resolver function.

    # String Literal Types

    Restrict values to a specific set of string literals.

    type EventNames = "click" | "scroll" | "mousemove";
    +function handleEvent(el: Element, event: EventNames) {
    +  // do something
    +}
    +
    +handleEvent(document.getElementById("hello") as Element, "scroll");
    +handleEvent(document.getElementById("hello") as Element, "jump"); // error
    +

    # Tuples

    Arrays store elements of the same type, while tuples store elements of different types.

    1. Tuple types allow you to express an array with a fixed number of elements whose types are known, but need not be the same.
    2. When accessing or modifying elements with a known index, the correct type is returned.
    3. During initialization, all internal elements must be included unless the element is marked as "optional."

    # Accessing Tuple Elements

    const john: [string, number] = ["John", 30];
    +let kevin: [string, number?];
    +
    +// 1.
    +john[0] = "johnny dept";
    +john[1] = "100"; // error
    +
    +// 2.
    +kevin = ["Kevin"]; // Initializing with missing elements will result in an error unless the element is optional.
    +

    # Tuple Overflow

    When adding elements beyond the original tuple limit, the type is restricted to the union type of each type in the tuple.

    let tom: [string, number] = ["Tom", 25];
    +tom.push("male");
    +tom.push(true);
    +// Type 'boolean' is not assignable to type 'string | number'. ts(2345)
    +

    # Enum

    Enums are used to define a set of named constants, making it easier to document or identify code. +Sure, here are the explanations in English:

    # Incremental Enum:

    In TypeScript, an incremental enum refers to a numeric enum where each member's value automatically increases. Here's an example:

    // Numeric Enum (increases by default)
    +enum Weekday {
    +  Monday, // 0
    +  Tuesday, // 1
    +  Wednesday, // 2
    +  Thursday, // 3
    +  Friday, // 4
    +  Saturday, // 5
    +  Sunday, // 6
    +}
    +
    +// Usage
    +let today = Weekday.Wednesday;
    +console.log(today); // Outputs: 2
    +

    In this example, Weekday is a numeric enum, and its members automatically increase starting from 0. If no value is specified for a member, TypeScript increments it based on the value of the preceding member.

    If you manually set a value for a member and want subsequent members to increment automatically, you can do it like this:

    enum Weekday {
    +  Monday = 1, // 1
    +  Tuesday, // 2
    +  Wednesday, // 3
    +  Thursday, // 4
    +  Friday, // 5
    +  Saturday, // 6
    +  Sunday, // 7
    +}
    +

    Here, Monday is manually set to 1, and the following members will increment accordingly. This kind of enum can enhance code clarity and readability in certain situations.

    # String Enum:

    String enums in TypeScript are enums where each member has an associated string value. They are beneficial for serialization and debugging because the runtime values are meaningful and readable. Here's an example:

    // String Enum
    +enum Direction {
    +  Up = "UP",
    +  Down = "DOWN",
    +  Left = "LEFT",
    +  Right = "RIGHT",
    +}
    +
    +// Usage
    +let myDirection = Direction.Left;
    +console.log(myDirection); // Outputs: "LEFT"
    +

    # heterogeneous enum

    In this example, Direction is a string enum where each member has an associated string value. This allows for more meaningful representations during runtime, especially when debugging or serializing enum values. +Heterogeneous Enums refer to enums where the member values have different data types. This situation typically occurs in enums that mix numeric and string members. Here's an example of a heterogeneous enum:

    enum Status {
    +  Success = 200,
    +  NotFound = "Not Found",
    +  Error = "Internal Server Error",
    +}
    +
    +// Usage
    +let successStatus: Status = Status.Success;
    +let notFoundStatus: Status = Status.NotFound;
    +let errorStatus: Status = Status.Error;
    +
    +console.log(successStatus); // Outputs: 200
    +console.log(notFoundStatus); // Outputs: "Not Found"
    +console.log(errorStatus); // Outputs: "Internal Server Error"
    +

    In this example, the Status enum has three members, each with a different data type for its value. One member has a numeric value (Success), and the other two have string values (NotFound and Error). This allows the enum to represent status codes or messages with different data types, and you can choose the appropriate member based on the context. The usage of heterogeneous enums is relatively less common and is typically employed when handling data of different types simultaneously.

    # interface enum

    In TypeScript, enum is commonly used to define a set of named numeric constants, while interface is used to define the structure of objects. These two concepts are typically used for different purposes, where one represents a group of related constants, and the other represents the shape of objects.

    Here is an example using both enum and interface:

    // Define a set of direction constants using enum
    +enum Direction {
    +  Up = "UP",
    +  Down = "DOWN",
    +  Left = "LEFT",
    +  Right = "RIGHT",
    +}
    +
    +// Define the structure of an object with coordinates and direction using interface
    +interface Point {
    +  x: number;
    +  y: number;
    +  direction: Direction; // Using constants from the enum
    +}
    +
    +// Create an object adhering to the Point interface using the defined enum
    +const point: Point = {
    +  x: 1,
    +  y: 2,
    +  direction: Direction.Right,
    +};
    +
    +console.log(point);
    +

    # const enum

    TypeScriptにおけるenumとconst enumの違いを、tscのコンパイル結果から確認してみる

    enumとconstsの使い分け

    # Reverse mapping

    Reverse mapping refers to the capability in an enum type where, in addition to the normal mapping from names to values, there is also a mapping from enum values back to their names. This feature provides more flexibility in certain programming scenarios.

    In TypeScript, when you assign initial values to enum members, TypeScript automatically generates both forward mapping (from enum names to values) and reverse mapping (from enum values to names). Here's an example:

    enum Direction {
    +  Up = "UP",
    +  Down = "DOWN",
    +  Left = "LEFT",
    +  Right = "RIGHT",
    +}
    +
    +// Forward mapping
    +console.log(Direction.Up); // Output: UP
    +
    +// Reverse mapping
    +console.log(Direction["UP"]); // Output: Up
    +

    In this example, the value of the enum member Direction.Up is the string "UP". Through Direction["UP"], you can retrieve the name of this member, which is "Up". This illustrates the concept of reverse mapping, where you find the corresponding name based on the enum value.

    Reverse mapping can be useful in various scenarios, such as generating labels on the user interface based on enum values or determining enum values based on user-inputted strings.

    In this example, enum Direction defines four constants representing different directions, and then interface Point defines the structure of an object with x, y, and direction properties, where direction uses constants from the Direction enum. Finally, an object point is created that conforms to the structure defined by the Point interface.

    # Classes

    While JavaScript has the concept of classes, many JavaScript programmers may not be very familiar with classes. Here's a brief introduction to class-related concepts:

    • Class: Defines the abstract characteristics of a thing, including its properties and methods.

    • Object: An instance of a class, created through the new keyword.

    • Object-Oriented Programming (OOP) Three Pillars: Encapsulation, Inheritance, and Polymorphism.

    • Encapsulation: Hides the details of data operations, exposing only the necessary interfaces. It ensures that external callers can interact with the object through provided interfaces without knowing the internal details.

    • Inheritance: A mechanism where a subclass inherits properties and behaviors from a superclass. The subclass retains the characteristics of the superclass and may have additional features.

    • Polymorphism: Different classes related through inheritance can respond to the same method in different ways. For example, a Cat and a Dog both inheriting from an Animal class may have different implementations of the eat method.

    • Accessors (Getter & Setter): Methods to change the reading and assigning behavior of properties.

    • Modifiers (Access Modifiers): Keywords that limit the nature of members or types, such as public indicating a public property or method.

    • Abstract Class: A base class meant for other classes to inherit from. Instances of an abstract class cannot be created, and abstract methods within it must be implemented by its subclasses.

    • Interfaces: Common properties or methods shared among different classes, abstracted into an interface. Classes can implement (or adhere to) multiple interfaces.

    # readonly

    The readonly keyword is used to declare read-only properties and can only appear in property declarations or index signatures.

    class Animal {
    +    readonly name;
    +    public constructor(name) {
    +        this.name = name;
    +    }
    +}
    +
    +let a = new Animal('Jack');
    +console.log(a.name); // Jack
    +a.name = 'Tom';
    +
    +// index.ts(10,3): TS2540: Cannot assign to 'name' because it is a read-only property.
    +

    Note that if readonly is used along with other access modifiers, it should come after them.

    class Animal {
    +    // public readonly name;
    +    public constructor(public readonly name) {
    +        this.name = name;
    +    }
    +}
    +

    # Instance Properties

    In ES7 proposals, instance properties can be defined directly inside the class.

    class Animal {
    +  name = "Jack";
    +}
    +

    # Static Properties

    class Animal {
    +  static num = 42;
    +}
    +

    # Access Modifiers

    In TypeScript, access modifiers include public, private, and protected.

    • public: Accessible anywhere (default). The modified property or method is public, meaning it can be accessed from any part of the code. All properties and methods are public by default.

    • private: Cannot be accessed outside the declaring class. The modified property or method is private, and it cannot be accessed from outside the class where it is declared.

    • protected: Accessible within the declaring class and its subclasses. The modified property or method is protected, similar to private. However, it can be accessed within the declaring class and its subclasses.

    class Animal {
    +  private name;
    +  public constructor(name) {
    +    this.name = name;
    +  }
    +}
    +
    +let dog = new Animal("Cute");
    +console.log(dog.name); // 'name' is a private property and can only be accessed within class 'Animal'.
    +dog.name = "Tom"; // 'name' is a private property and can only be accessed within class 'Animal'.
    +

    Note: private does not restrict access in the compiled code; it provides compile-time checking only.

    # Getters and Setters

    class User {
    +  // Private property to store the password
    +  private _password: string = "******";
    +
    +  // Getter method to retrieve the password
    +  get password(): string {
    +    return this._password;
    +  }
    +
    +  // Setter method to update the password
    +  set password(newPass: string) {
    +    this._password = newPass;
    +
    +    // When printing the password in the setter, use this.password instead of u-password
    +    console.log(this.password);
    +  }
    +}
    +
    +// Example usage
    +const u = new User();
    +
    +// Get the current password
    +const currentPassword = u.password;
    +console.log(currentPassword); // Output: ******
    +
    +// Set a new password
    +u.password = "newPassword";
    +

    # Abstract Classes

    abstract is used to define abstract classes and abstract methods, and instances cannot be created from them.

    abstract class Animal {
    +  public name;
    +  public constructor(name) {
    +    this.name = name;
    +  }
    +  public abstract sayHi();
    +}
    +
    +let a = new Animal("Jack");
    +
    +// index.ts(9,11): error TS2511: Cannot create an instance of the abstract class 'Animal'.
    +

    In the example above, we define an abstract class Animal and an abstract method sayHi. Attempting to instantiate an abstract class directly results in an error.

    # Implementing Abstract Methods

    Secondly, abstract methods within an abstract class must be implemented by subclasses:

    abstract class Animal {
    +  public name;
    +  public constructor(name) {
    +    this.name = name;
    +  }
    +  public abstract sayHi();
    +}
    +
    +class Cat extends Animal {
    +  public eat() {
    +    console.log(`${this.name} is eating.`);
    +  }
    +}
    +
    +let cat = new Cat("Tom");
    +
    +// index.ts(9,7): error TS2515: Non-abstract class 'Cat' does not implement inherited abstract member 'sayHi' from class 'Animal'.
    +

    In this example, the Cat class inherits from Animal but fails to implement the abstract method sayHi, resulting in a compilation error.

    Here's a correct usage example:

    abstract class Animal {
    +  public name;
    +  public constructor(name) {
    +    this.name = name;
    +  }
    +  public abstract sayHi();
    +}
    +
    +class Cat extends Animal {
    +  public sayHi() {
    +    console.log(`Meow, My name is ${this.name}`);
    +  }
    +}
    +
    +let cat = new Cat("Tom");
    +

    In this corrected example, we implement the sayHi method in the Cat class, making it a valid subclass of the abstract Animal class.

    It's important to note that even though it's an abstract method, TypeScript still generates the corresponding class in the compiled result, as seen in the generated JavaScript code.

    Note: Abstract classes are present in the compiled code.

    # Here are a few common scenarios where abstract classes are beneficial in TypeScript:

    Abstract classes in TypeScript serve the primary purpose of providing a base class for deriving other classes. They can include both concrete implementations and abstract members, which must be implemented in derived classes. Abstract classes cannot be instantiated on their own; they are meant to be used as base classes for other classes.

    1. Sharing Implementation Logic: +Abstract classes can contain shared implementation logic that may be common across derived classes. By placing this logic in the abstract class, redundancy in code can be avoided.

      abstract class Shape {
      +  abstract calculateArea(): number;
      +
      +  displayArea(): void {
      +    console.log(`Area: ${this.calculateArea()}`);
      +  }
      +}
      +
      +class Circle extends Shape {
      +  constructor(private radius: number) {
      +    super();
      +  }
      +
      +  calculateArea(): number {
      +    return Math.PI * this.radius ** 2;
      +  }
      +}
      +
      +const circle = new Circle(5);
      +circle.displayArea(); // Outputs: Area: 78.54
      +
    2. Enforcing Specific Interface Implementation: +Abstract members in an abstract class must be implemented in derived classes. This helps ensure that derived classes have specific behavior or properties.

      abstract class Printer {
      +  abstract printDocument(document: string): void;
      +}
      +
      +class LaserPrinter extends Printer {
      +  printDocument(document: string): void {
      +    console.log(`Printing document (laser): ${document}`);
      +  }
      +}
      +
      +class InkjetPrinter extends Printer {
      +  printDocument(document: string): void {
      +    console.log(`Printing document (inkjet): ${document}`);
      +  }
      +}
      +
    3. Providing a Common Interface: +Abstract classes can define a set of common methods or properties to ensure a consistent interface across derived classes.

      abstract class Animal {
      +  abstract makeSound(): void;
      +
      +  move(): void {
      +    console.log("Moving...");
      +  }
      +}
      +
      +class Dog extends Animal {
      +  makeSound(): void {
      +    console.log("Woof! Woof!");
      +  }
      +}
      +
      +class Bird extends Animal {
      +  makeSound(): void {
      +    console.log("Chirp! Chirp!");
      +  }
      +}
      +

    In summary, abstract classes in TypeScript are a tool for building class hierarchies and providing a consistent interface. They help establish stricter relationships between classes and ensure certain behaviors remain consistent throughout the class hierarchy.

    # Class and Interface Interactions

    # Class Implements Interface

    When different classes share common features, interfaces can be used, and classes implement them.

    interface Chatroom {
    +  connect();
    +}
    +
    +class Customer {}
    +
    +class CustomA extends Customer implements Chatroom {
    +  connect() {
    +    console.log("welcome to A");
    +  }
    +}
    +
    +class CustomB extends Customer implements Chatroom {
    +  connect() {
    +    console.log("welcome to B");
    +  }
    +}
    +

    A class can implement multiple interfaces:

    interface Chatroom {
    +  connect();
    +}
    +
    +interface Shop {
    +  buy();
    +}
    +
    +class Customer {}
    +
    +class Custom extends Customer implements Chatroom, Shop {
    +  connect() {
    +    console.log("welcome~");
    +  }
    +  buy() {
    +    console.log("buy successful");
    +  }
    +}
    +

    For more interface and class interaction patterns, check here (opens new window).

    # generators and iterators

    In TypeScript, generators and iterators are often used together to provide a convenient way to implement iterable objects. Let's discuss generators, iterators, and how to use them in TypeScript.

    # Iterators

    In TypeScript, an iterator is an object with a next method. The next method returns an object with value and done properties, indicating the current value of the iteration and whether it is done.

    interface Iterator<T> {
    +  next(): { value: T; done: boolean };
    +}
    +
    +// Example: Iterator for a range of numbers
    +function createNumberRangeIterator(
    +  start: number,
    +  end: number
    +): Iterator<number> {
    +  let current = start;
    +  return {
    +    next(): { value: number; done: boolean } {
    +      const result = { value: current, done: current > end };
    +      current++;
    +      return result;
    +    },
    +  };
    +}
    +
    +const numberIterator = createNumberRangeIterator(1, 3);
    +console.log(numberIterator.next()); // { value: 1, done: false }
    +console.log(numberIterator.next()); // { value: 2, done: false }
    +console.log(numberIterator.next()); // { value: 3, done: false }
    +console.log(numberIterator.next()); // { value: undefined, done: true }
    +

    # Generators

    Generators are a special type of function declared using function*. They can pause execution using yield to return a value and can later resume execution. Generator functions return an iterator.

    // Example: Generator for a range of numbers
    +function* createNumberRangeGenerator(
    +  start: number,
    +  end: number
    +): Generator<number> {
    +  for (let i = start; i <= end; i++) {
    +    yield i;
    +  }
    +}
    +
    +const numberGenerator = createNumberRangeGenerator(1, 3);
    +console.log(numberGenerator.next()); // { value: 1, done: false }
    +console.log(numberGenerator.next()); // { value: 2, done: false }
    +console.log(numberGenerator.next()); // { value: 3, done: false }
    +console.log(numberGenerator.next()); // { value: undefined, done: true }
    +

    # Using Generators and Iterators

    Generators offer a more concise and readable syntax. You can use the for...of loop to iterate over the values generated by the generator.

    // Using a generator to create a number range
    +function* createNumberRangeGenerator(
    +  start: number,
    +  end: number
    +): Generator<number> {
    +  for (let i = start; i <= end; i++) {
    +    yield i;
    +  }
    +}
    +
    +// Iterating over the generator
    +for (const num of createNumberRangeGenerator(1, 3)) {
    +  console.log(num);
    +}
    +// Output:
    +// 1
    +// 2
    +// 3
    +

    Generators and iterators provide a flexible and clear way to handle a sequence of values, especially when dealing with large datasets or asynchronous operations.

    # Generics

    Generics allow you to define functions, interfaces, or classes without specifying the exact type, and instead, determine the type during usage.

    # Basic Usage

    Let's start with a function, createArray, that creates an array of a specified length and fills each element with a default value:

    function createArray(length: number, value: any): Array<any> {
    +  let result = [];
    +  for (let i = 0; i < length; i++) {
    +    result[i] = value;
    +  }
    +  return result;
    +}
    +
    +createArray(3, "x"); // Result: ['x', 'x', 'x']
    +

    The issue here is that the return type (Array<any>) allows any type in the array. To address this, we introduce generics:

    function createArray<T>(length: number, value: T): Array<T> {
    +  let result: T[] = [];
    +  for (let i = 0; i < length; i++) {
    +    result[i] = value;
    +  }
    +  return result;
    +}
    +
    +createArray<string>(3, "x"); // Result: ['x', 'x', 'x']
    +

    Now, the function is generic, and you can specify the type (e.g., string) when calling it.

    # Multiple Type Parameters

    Define multiple type parameters in a generic function, like in the swap function:

    function swap<T, U>(tuple: [T, U]): [U, T] {
    +  return [tuple[1], tuple[0]];
    +}
    +
    +swap([7, "seven"]); // Result: ['seven', 7]
    +

    Here, swap takes a tuple and swaps its elements.

    # Generic Constraints

    When using generic variables inside a function, you might need to constrain them. For example:

    interface Lengthwise {
    +  length: number;
    +}
    +
    +function loggingIdentity<T extends Lengthwise>(arg: T): T {
    +  console.log(arg.length);
    +  return arg;
    +}
    +
    +loggingIdentity({ length: 10 }); // Prints the length of the object
    +

    Here, loggingIdentity has a generic constraint to ensure that the type T extends the Lengthwise interface, which has a length property.

    # Generic Interface

    Interfaces can also be generic. Here's an example:

    interface CreateArrayFunc {
    +  <T>(length: number, value: T): Array<T>;
    +}
    +
    +let createArray: CreateArrayFunc;
    +createArray = function <T>(length: number, value: T): Array<T> {
    +  let result: T[] = [];
    +  for (let i = 0; i < length; i++) {
    +    result[i] = value;
    +  }
    +  return result;
    +};
    +
    +createArray(3, "x"); // Result: ['x', 'x', 'x']
    +

    You can also move the generic type parameter to the interface level.

    # Generic Class

    Like interfaces, classes can also use generics:

    class GenericNumber<T> {
    +  zeroValue: T;
    +  add: (x: T, y: T) => T;
    +}
    +
    +let myGenericNumber = new GenericNumber<number>();
    +myGenericNumber.zeroValue = 0;
    +myGenericNumber.add = function (x, y) {
    +  return x + y;
    +};
    +

    This GenericNumber class can work with various numeric types.

    # Default Generic Types

    Starting TypeScript 2.3, you can specify default types for generic parameters:

    function createArray<T = string>(length: number, value: T): Array<T> {
    +  let result: T[] = [];
    +  for (let i = 0; i < length; i++) {
    +    result[i] = value;
    +  }
    +  return result;
    +}
    +

    This allows you to provide a default type (string in this case) when a specific type is not explicitly provided.

    Generics enhance the flexibility and type safety of your code, allowing you to create reusable and type-agnostic components. They are particularly useful when you want to create functions or classes that can work with a variety of data types.

    # More Generics

    const echo = <T>(arg: T): T => arg;
    +
    +const isObj = <T>(arg: T): boolean => {
    +  return typeof arg === "object" && !Array.isArray(arg) && arg !== null;
    +};
    +
    +console.log(isObj(true)); // false
    +console.log(isObj("John")); // false
    +console.log(isObj([1, 2, 3])); // false
    +console.log(isObj({ name: "John" })); // true
    +console.log(isObj(null)); // false
    +
    +////////////////////////////////////
    +
    +const isTrue = <T>(arg: T): { arg: T; is: boolean } => {
    +  if (Array.isArray(arg) && !arg.length) {
    +    return { arg, is: false };
    +  }
    +  if (isObj(arg) && !Object.keys(arg as keyof T).length) {
    +    return { arg, is: false };
    +  }
    +  return { arg, is: !!arg };
    +};
    +
    +console.log(isTrue(false)); //{ arg: false, is: false }
    +console.log(isTrue(0)); //{ arg: 0, is: false }
    +console.log(isTrue(true)); //{ arg: true, is: true }
    +console.log(isTrue(1)); //{ arg: 1, is: true }
    +console.log(isTrue("Dave"));
    +console.log(isTrue(""));
    +console.log(isTrue(null));
    +console.log(isTrue(undefined));
    +console.log(isTrue({})); // modified
    +console.log(isTrue({ name: "Dave" }));
    +console.log(isTrue([])); // modified
    +console.log(isTrue([1, 2, 3]));
    +console.log(isTrue(NaN));
    +console.log(isTrue(-0));
    +
    +////////////////////////////////////
    +

    # Common Techniques

    # Extracting Variable Types

    Use typeof to extract variable types:

    let a = 123;
    +let b = { x: 0, y: 1 };
    +
    +type A = typeof a; // number
    +type B = typeof b; // { x: number, y: number }
    +

    # Binding Function this

    Bind this on the first parameter. See reference (opens new window)

    const obj = {
    +  say(name: string) {
    +    console.log("Hello: ", name);
    +  },
    +};
    +
    +function test(this: typeof obj, str: string) {
    +  console.log(this.say(str));
    +}
    +

    # Index Variables

    interface A {
    +  [key: string]: any;
    +}
    +
    +// 'in' iterates over sub-properties, resulting in the type: string
    +type B = {
    +  [key in "a" | "b" | "c"]: string;
    +};
    +

    # Built-in Types

    TypeScript provides built-in utility types:

    # Record

    Generates an object type with keys of type K and values of type T.

    type Record<K extends keyof any, T> = {
    +  [P in K]: T;
    +};
    +
    +const foo: Record<string, boolean> = {
    +  a: true,
    +};
    +
    +const bar: Record<"x" | "y", number> = {
    +  x: 1,
    +  y: 2,
    +};
    +

    # Partial

    Makes all properties of T optional.

    type Partial<T> = {
    +  [P in keyof T]?: T[P];
    +};
    +
    +interface Foo {
    +  a: string;
    +  b: number;
    +}
    +
    +const foo: Partial<Foo> = {
    +  b: 2, // 'a' is optional
    +};
    +

    # Required

    Opposite of Partial, makes all properties of T required.

    # Readonly

    Makes all properties of T readonly.

    # Pick

    Selects properties from T specified by K.

    type Pick<T, K extends keyof T> = {
    +  [P in K]: T[P];
    +};
    +
    +interface Foo {
    +  a: string;
    +  b: number;
    +  c: boolean;
    +}
    +
    +const foo: Pick<Foo, "b" | "c"> = {
    +  b: 1,
    +  c: false,
    +};
    +

    # Exclude

    Exclude from T those types that are assignable to U.

    type Exclude<T, U> = T extends U ? never : T;
    +
    +let foo: Exclude<"a" | "b" | "c", "b"> = "a";
    +foo = "c";
    +

    # Extract

    Extract from T those types that are assignable to U.

    type Extract<T, U> = T extends U ? T : never;
    +
    +let foo: Extract<"a" | "b" | "c", "b"> = "b";
    +

    # Parameters

    Returns a tuple type based on the parameters of a function.

    type Parameters<T extends (...args: any) => any> = T extends (
    +  ...args: infer P
    +) => any
    +  ? P
    +  : never;
    +
    +type Foo = (a: string, b: number) => void;
    +const a: Parameters<Foo> = ["a", 1]; // [string, number]
    +

    # ReturnType

    Returns the return type of a function.

    type ReturnType<T extends (...args: any) => any> = T extends (
    +  ...args: any
    +) => infer R
    +  ? R
    +  : any;
    +
    +type Foo = () => boolean;
    +const a: ReturnType<Foo> = true; // Returns boolean type
    +

    # 🔹 index signature

    // Index Signatures
    +
    +// interface TransactionObj {
    +//     readonly [index: string]: number
    +// }
    +
    +interface TransactionObj {
    +  readonly [index: string]: number;
    +  Pizza: number;
    +  Books: number;
    +  Job: number;
    +}
    +
    +const todaysTransactions: TransactionObj = {
    +  Pizza: -10,
    +  Books: -5,
    +  Job: 50,
    +};
    +
    +console.log(todaysTransactions.Pizza);
    +console.log(todaysTransactions["Pizza"]);
    +
    +let prop: string = "Pizza";
    +console.log(todaysTransactions[prop]);
    +
    +const todaysNet = (transactions: TransactionObj): number => {
    +  let total = 0;
    +  for (const transaction in transactions) {
    +    total += transactions[transaction];
    +  }
    +  return total;
    +};
    +
    +console.log(todaysNet(todaysTransactions));
    +
    +//todaysTransactions.Pizza = 40
    +console.log(todaysTransactions["Dave"]); // undefined
    +
    +///////////////////////////////////
    +
    +interface Student {
    +  [key: string]: string | number | number[] | undefined;
    +  name: string;
    +  GPA: number;
    +  classes?: number[];
    +}
    +
    +const student: Student = {
    +  name: "Doug",
    +  GPA: 3.5,
    +  classes: [100, 200],
    +};
    +
    +console.log(student.test); //because of the index signature, this is allowed
    +
    +for (const key in student) {
    +  console.log(`${key}: ${student[key as keyof Student]}`); //'name: Doug' ,'GPA: 3.5' ​​​​​, 'classes: 100,200' ​​​​​, 'test: undefined'
    +}
    +
    +Object.keys(student).map((key) => {
    +  console.log(student[key as keyof typeof student]); // 'Doug' , 3.5 , [ 100, 200 ]
    +});
    +
    +const logStudentKey = (student: Student, key: keyof Student): void => {
    +  console.log(`Student ${key}: ${student[key]}`); //'Student name: Doug'
    +};
    +
    +logStudentKey(student, "name");
    +
    +/////////////////////////////////
    +
    +// interface Incomes {
    +//     [key: string]: number
    +// }
    +
    +type Streams = "salary" | "bonus" | "sidehustle";
    +
    +type Incomes = Record<Streams, number>;
    +
    +const monthlyIncomes: Incomes = {
    +  salary: 500,
    +  bonus: 100,
    +  sidehustle: 250,
    +};
    +
    +for (const revenue in monthlyIncomes) {
    +  console.log(monthlyIncomes[revenue as keyof Incomes]); // 500 , 100 , 250
    +}
    +

    🔺 student[key as keyof typeof student]:

    Inside the function passed to map, each key is used to access the corresponding value in the student object. - key is a variable holding the current property name being iterated over. - key as keyof typeof student is a TypeScript type assertion. It tells TypeScript to treat key as one of the keys of the type of student. This is necessary because, by default, the type of key would be just string, which is too general. The keyof typeof student type is more specific, representing the union of all literal types of the keys in the student object.

    Object.keys(student).map((key) => {
    +  console.log(student[key as keyof typeof student]);
    +});
    +

    🔺 補充理解在 JavaScript 和 TypeScript 中,对象属性可以通过两种方式访问

    点符号(.)和方括号符号([])。在您提供的代码中,todaysTransactions 是一个对象,其中包含了不同的属性(如 PizzaBooksJob),每个属性都有对应的值。

    1. 点符号: todaysTransactions.Pizza。这种方式是直接访问对象的属性,其中 Pizza 是属性的字面量名称。

    2. 方括号符号: todaysTransactions['Pizza']todaysTransactions[prop]。这种方式用于当属性名是动态的或者是一个变量时。在这种情况下,属性名需要作为字符串传递。

    在代码中,prop 是一个字符串类型的变量,其值为 'Pizza'。因此,当你使用 todaysTransactions[prop] 时,它实际上是 todaysTransactions['Pizza'] 的简写。由于 prop 变量的值是 'Pizza',所以这个表达式最终访问的是 todaysTransactions 对象中 Pizza 这个属性的值。

    # Accessing object properties dynamically in TypeScript

    Accessing object properties dynamically in TypeScript can be achieved through various methods, including dot notation, square brackets, and the keyof operator. Each method has its specific use cases and benefits depending on the requirements of your application.

    1. Using Square Brackets: This method is particularly useful when the property name is dynamic, such as in the case of user input or other runtime conditions. For example, you might have a TypeScript React component where you need to access properties of an object based on user interactions or input. Here's a simple example:

      interface User {
      +  name: string;
      +  age: number;
      +  email: string;
      +}
      +
      +const user: User = {
      +  name: "Alice",
      +  age: 25,
      +  email: "alice@example.com",
      +};
      +
      +const propertyName = "email";
      +const propertyValue = user[propertyName];
      +console.log(propertyValue); // Outputs: alice@example.com
      +

      In this example, propertyName is a variable that holds the name of the property you want to access. This approach is useful in scenarios like handling form inputs dynamically.

    2. Using keyof with TypeScript: The keyof operator is another powerful feature in TypeScript, which you can use to create a union type of all the keys in an object. This is particularly useful for ensuring type safety when accessing properties dynamically. Here's an example:

      interface User {
      +  name: string;
      +  age: number;
      +  email: string;
      +}
      +
      +type UserKeys = keyof User;
      +
      +const user: User = {
      +  name: "Bob",
      +  age: 30,
      +  email: "bob@example.com",
      +};
      +
      +const propertyName: UserKeys = "name";
      +const propertyValue = user[propertyName];
      +console.log(propertyValue); // Outputs: Bob
      +

      In this example, propertyName is a variable of type UserKeys, which is a union of all keys in the User interface. This ensures that only valid property names can be assigned to propertyName.

    3. Dynamic Property Access in React Components: In React components, you might encounter scenarios where you need to dynamically access or update the state based on user input or interaction. For example, if you are building a form with multiple fields, you can use the square bracket notation to update the state for each field dynamically:

      import React, { useState } from "react";
      +
      +const FormComponent: React.FC = () => {
      +  const [formState, setFormState] = useState<{ [key: string]: string }>({});
      +
      +  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
      +    setFormState({
      +      ...formState,
      +      [event.target.name]: event.target.value,
      +    });
      +  };
      +
      +  return (
      +    <form>
      +      <input name="username" onChange={handleChange} />
      +      <input name="email" onChange={handleChange} />
      +      {/* ... other form fields ... */}
      +    </form>
      +  );
      +};
      +

      In this React component, handleChange function updates the formState dynamically based on the input field's name attribute.

    🔺 For more detailed information, you can refer to these resources:

    # Reference Articles

    1. TypeScript for Beginners (opens new window)
    2. TypeScript Practical Tips and Tricks (opens new window)
    + + + diff --git a/guide/typescript/basic.html b/guide/typescript/basic.html new file mode 100644 index 00000000..f8e638b6 --- /dev/null +++ b/guide/typescript/basic.html @@ -0,0 +1,292 @@ + + + + + + 🔶 TypeScript Basic Knowledge | ☻ itsyuimorii.space + + + + + + + + +

    # 🔶 TypeScript Basic Knowledge

    # 🔸 Primitive Types

    string, number, boolean, null, undefined, Symbol

    // Known type
    +const str: string = "Hello World";
    +
    +// Unknown with expectation
    +let num = <unknown>getNumber();
    +// Known expectation
    +num = <number>getNumber();
    +
    +// Function returning a number
    +function getNumber(): number {
    +  return 30;
    +}
    +
    +// Void function
    +function count(): void {
    +  console.log(1 + 3);
    +}
    +

    # Any Type

    A variable of any type cannot change its type during operations.

    1. Any type allows any operation, and the return type is of any.
    2. When a variable is declared without specifying a type and no value is assigned, it defaults to any.
    let someText: any = 30; // Will cause an error if set to number
    +someText = "someText"; // Error
    +

    # 🔸 Never

    A function that never returns, or a function that always throws an error.

    • bottom level type
    • can be assigned to any type

    In TypeScript, the never type is often used in the context of exhaustiveness checking, particularly in situations like switch statements. The never type represents the type of values that never occur. It is used to indicate that a function will not return normally (e.g., it throws an error or has an infinite loop).

    Let's discuss how never is commonly used with switch statements and the default case:

    type Fruit = "Apple" | "Banana" | "Orange";
    +
    +function getFruitColor(fruit: Fruit): string {
    +  switch (fruit) {
    +    case "Apple":
    +      return "Red";
    +    case "Banana":
    +      return "Yellow";
    +    case "Orange":
    +      return "Orange";
    +    default:
    +      // The default case is marked as unreachable, and its return type is 'never'.
    +      // This is because TypeScript can infer that the switch is exhaustive, covering all possible values of 'Fruit'.
    +      const exhaustiveCheck: never = fruit;
    +      return exhaustiveCheck; // This line will never be reached.
    +  }
    +}
    +

    Explanation:

    1. The Fruit type is defined as a union of string literals representing different fruit names.
    2. The getFruitColor function takes a fruit argument of type Fruit and returns a string representing the color.
    3. The switch statement is used to handle different cases based on the value of fruit.
    4. For each known fruit case ('Apple', 'Banana', 'Orange'), the function returns the corresponding color.
    5. The default case is marked with never. This indicates to TypeScript that this case should never be reached because we've covered all possible values of Fruit.
    6. The exhaustiveCheck variable is of type never, which means TypeScript understands that it can never have a value, and this line will never be executed.

    This pattern helps TypeScript catch situations where you might forget to handle a specific case in a switch statement, providing better safety and avoiding unintentional bugs.

    # 型アノテーション(Type Annotation)

    TypeScript では value: Type というフォーマットで宣言時の変数 に型の注釈がつけられる +アノテー ションによって静的に型付けされた情報はコンパイル時のチェックに用いられ、書かれたコード中 に型の不整合があるとコンパイルエラーになる

    # 型推論(Type Inference)

    When the type is not explicitly specified, TypeScript infers the type based on the assigned value.

    let typeS = "seven";
    +typeS = 10; // Inferred as string due to the initial value being a string
    +
    +let typeA;
    +typeA = "six";
    +typeA = 30; // Inferred as any since no initial value is given
    +

    # Union Types

    Represents a value that can be one of multiple types, using | to separate types.

    let unionC: string | number = "Ray";
    +unionC = 100;
    +
    +function getLength(something: string | number): number {
    +  return something.length; // Can only access properties common to both types, error
    +}
    +

    # Object Types - Interface

    Commonly used to describe the shape of objects.

    1. Interface names typically start with a capital letter.
    2. Optional properties are denoted with ? to enhance flexibility.
    3. Index signatures allow any property of a certain type.
    4. Use readonly to mark properties as read-only.
    interface Person {
    +  readonly id: number;
    +  name: string;
    +  age?: number; // Optional property
    +  [prop: string]: any; // Any property of type any
    +  // [prop: string]: string; // Uncommenting restricts any property to string type
    +}
    +
    +let tom: Person = {
    +  id: 3387,
    +  name: "Tom",
    +  // age: 30,
    +};
    +// Constraints Tom to have the same shape as Person (no more, no less)
    +
    +// Cannot modify readonly property after initialization, error
    +tom.id = 4069;
    +

    Function interfaces or interfaces with function properties are also possible:

    interface MyFunction {
    +  (a: number): void;
    +}
    +
    +interface MyObject {
    +  jump: (a: number) => void;
    +}
    +

    # Array Types

    Several ways to define array types:

    1. Type + square brackets
    2. Array generics (Array)
    3. Interface for arrays
    4. Tuple types (IArguments, NodeList, HTMLCollection, Element...)
    // 1.
    +const myArr: number[] = [1, 2, 3];
    +myArr.push("4"); // Method calls are type-checked, error
    +
    +// 2.
    +const myArr2: Array<number> = [1, 2, 3];
    +myArr2[2] = "3"; // Error
    +
    +// 3.
    +interface NumberArray {
    +  [index: number]: number;
    +}
    +const myArr3: NumberArray = [1, 2, 3];
    +
    +// 4. Built-in array interfaces
    +function sum() {
    +  let args: IArguments = arguments;
    +}
    +

    For more built-in objects, refer to this link (opens new window).

    # Function Types

    Functions have input and output types, considering both is crucial.

    1. Declaration

    2. Expression

      • Be cautious when using the => syntax; it might be confusing and is recommended to use the declaration syntax.
    3. Interface definition

    4. Optional parameters marked with ?, which cannot follow required parameters.

    5. Default parameter values make parameters optional.

    6. Rest parameters can be defined using an array type (any[]).

    7. Overloads allow a function to accept different numbers or types of parameters.

    // 1.
    +function sumFn(x: number, y: number): number {
    +  return x + y;
    +}
    +
    +sumFn(1); // Error
    +sumFn(1, 2, 3); // Error
    +
    +// 2.
    +const sumFnEx: (x: number, y: number) => number = function (
    +  x: number,
    +  y: number
    +): number {
    +  return x + y;
    +};
    +
    +// 3.
    +interface Isum {
    +  (x: number, y: number): number;
    +}
    +
    +const mySum: Isum = function (x: number, y: number): number {
    +  return x + y;
    +};
    +
    +// 4. & 5.
    +function buildName(
    +  firstName: string,
    +  lastName?: string,
    +  age: number = 30
    +): string {
    +  return `${firstName} ${lastName}, now age ${age}`;
    +}
    +buildName("johnny");
    +
    +// 6.
    +function push(array: any[], ...items: any[]) {
    +  items.forEach((item) => {
    +    array.push(item);
    +  });
    +}
    +
    +// 7.
    +// Define precise input and output types for numbers, then implement logic
    +function reverse(x: number): number;
    +function reverse(x: string): string;
    +function reverse(x: number | string): number | string {
    +  if (typeof x === "number") {
    +    return Number(x.toString().split("").reverse().join(""));
    +  } else if (typeof x === "string") {
    +    return x.split("").reverse().join("");
    +  }
    +  return 0;
    +}
    +

    # Type Assertion

    Manually specify a value's type, commonly used in React's TSX (TS for JSX) to distinguish between TypeScript and ES6 arrow functions.

    1. When dealing with union types, sometimes a specific type's property needs to be accessed.

      • Caution is needed to avoid runtime errors when accessing properties immediately after assertion.
    2. Parent class inheritance assertion

    3. "XXX as any" should be a last resort for solving type issues, use sparingly.

    4. Type assertion reinforcement (for old code returning any, explicitly assert its type after calling)

    5. Type assertions are only effective during compilation, having no impact on the compiled code.

    6. Type declarations are stricter; prefer using them whenever possible.

    // 1.
    +interface Cat {
    +  name: string;
    +  run(): void;
    +}
    +
    +interface Fish {
    +  name: string;
    +  swim(): void;
    +}
    +
    +function getName(animal: Cat | Fish) {
    +  // Accessing swim directly after assertion may cause runtime errors
    +  // if (typeof animal.swim === 'function') {
    +  if (typeof (animal as Fish).swim === "function") {
    +    console.log("Is a fish");
    +  } else {
    +    // ...
    +  }
    +}
    +
    +// 2.
    +class ApiError extends Error {
    +  code: number = 0;
    +}
    +
    +class HttpError extends Error {
    +  statusCode: number = 200;
    +}
    +
    +function isApiError(error: Error): boolean {
    +  if (typeof (error as ApiError).code === "number") {
    +    return true;
    +  }
    +  return false;
    +}
    +
    +// 3.
    +// Accessing any property is legal, but this is a last resort
    +window.foo = 1; // Error
    +(window as any).foo = 1;
    +
    +// 4.
    +function getCache(key: string): any {
    +  return (window as any).cache[key];
    +}
    +
    +interface Cat {
    +  name: string;
    +  run(): void;
    +}
    +
    +// Type assertion
    +const tomCat = getCache("tom") as Cat;
    +// Type declaration (more strict)
    +// const tomCat: Cat = getCache('tom');
    +tomCat.run();
    +

    # Declaration Files

    When using third-party libraries, include their declaration files to enable type checking.

    Usually, declaration statements are placed in separate files, e.g., jQuery.d.ts.

    1. declare var/let/const
    2. declare namespace creates a namespace to avoid global pollution; use the namespace when accessing its interfaces.
    3. For library declaration files, it is recommended to use @types for centralized management. Install with npm install @types/library --save-dev. No further configuration is needed for global declarations.
    4. For NPM declaration files, export and import are required to use types within modules.
    // 1. Using jQuery as an example
    +declare const jQuery: (selector: string) => any;
    +
    +// 2. Example (illustrative purposes only)
    +declare namespace Vue {
    +  function component(name: string, data: any): any;
    +  function mixin(data: any): void;
    +}
    +

    # Declaration Merging

    Taking jQuery as an example, it is both a function and an object with properties. Multiple declaration statements that do not conflict will be merged.

    declare function jQuery(selector: string): any;
    +declare namespace jQuery {
    +  function ajax(url: string, settings?: any): void;
    +}
    +
    + + + diff --git a/guide/typescript/index.html b/guide/typescript/index.html new file mode 100644 index 00000000..8b118b8d --- /dev/null +++ b/guide/typescript/index.html @@ -0,0 +1,74 @@ + + + + + + Typescript Reference Guide | ☻ itsyuimorii.space + + + + + + + + +
    + + + diff --git a/index.html b/index.html new file mode 100644 index 00000000..56a27aad --- /dev/null +++ b/index.html @@ -0,0 +1,78 @@ + + + + + + ☻ itsyuimorii.space + + + + + + + + +
    hero

    + itsyuimoriispace〰️ +

    + 私の技術ブログ - for sharing personal learning notes from 📚学び、💢知識、🪴成長する。 +

    + Read more → +

    📚 読書メモ

    Reading is a discount ticket to everywhere. - Mary Schmich

    📩 知識を共有する

    In the process of letting go you will lose many things from the past, but you will find yourself. - Deepak Chopra

    🪴 成長する

    The key to growth is the introduction of higher dimensions of consciousness into our awareness. - Lao Tzu

    + + + diff --git a/logo.gif b/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fe02f8f3cf117582ee7d10e0751b84e33c92432 GIT binary patch literal 223822 zcmd3t_fr$?_x^V`p@o*vLBP-nHS{JBAXGs@Z-Sv$CG@VLcL=?ShK>jtdKE*Fraq#8 zV5bX~=Zy`)!t>?xUwrq+o!QwlbKi63T(9do=9XsKI^N$wLGbVzfJAXf3LzCF1Q>&$%@6rS{)tgy?3++`V`u4$yC+oOpoKI?rD!t>CHYco}aBRPj9Qs8tN>+*He49 zx#-Q(!16-(-s`ddZH+IlPVT>*{@?cW;fJ}C?@tatKRfyL;^W7a|Nh(i@4q89IYr}t z7B9TtRJvdj;^XvqvaMt5oxmj@>A3i)U{|x{MXrz#l%A28mv(&ty*|^+?pM8>}Yd~hy?!sd&G|6aKF>C#QtNwVCv{#Vni@iRl>r+(^m@r zSMC2D6ToyrmQk{>z+`3TWGmzrWXa^@=NFddmR9Cu6c&`%R@Gq?ZeT2mvs=nAii*_R z<&6c3*J~-)6>j$q<#hDa7Z$e-Q*%3VE$&WCR%8w46=puZIZ@g8sB?5~ZGN(QsHf-2 zi+{4aMrt#jtQYLpcC38PPRA%IDk)*V{W$*h`}X&5Cw~vWaJxP^I}xksD6niEzCq98 zV6po1^X|rUzJN+cM-WzgDh*Qa>13f{)i3AJX7Xd=Q}x2Tdr5-)rG76Rn#^;28>BUA zpJEF5Pl#@BC66lG-*o73F4$Nq-}btZXm=;W)zQazf>WYs#nm;?>w4^&GrL+n&F-@X zp{;Nh`v>Dgb}e}Z=OX>AmgMUZyhBc20aJneQI*1KesV>U$}X=xpM;MO{#-W}y}0-T z|Dwc6^m+YV)vqr~9*ce!a9qjfW{sX+Wc?-ix%qeUe{jR7O~Q)l`yypm!NeB>8|QuM zt%bK$f0*PJI+ys!1&?Laymtxxx8kR}K^B|zbNeqj@1MB`?PocLSKo7Ra`{=pFG37` z5sgk^YTy%zd2|nJf&%uiCaGubtArgnRAqP)IloqTU0Jz2Vfy%Cphbux-$vVlrJUHczous}rHJ8?a-Yt67u&QxUMmX8>7=?g z_2Y{zQAa!7{I*L^HZ?=XdVI2W8wOj0`MbX!Yr^0>(=-5KTknS|Tu&1aDeS(Xw-r%$ z@|e%#Ql^~3DrHA(+ihsGpDDce6DpVA!ons;)VV9hs;uB-MzWz6ys+AQ2THUOxmGoS z_#E-M=jcr!Me(R->Kh%Y(DRGFXbhQ8QvjA%D)^oXk4=TA$tX3Eo2KotHc=`4PHhW8 zO!bLn>C@1yAC=$GHQczfdS^tfjqN3!?e2Va{u~lqw<3`qeDYVh@1L0SN{hdG+(H)T z?;Hm=vReJ9WA%Ihm?UXGxP@b5%%^P{+;~jm#k@)Q_?2X>$ zy^=e4_mk~U?;hr`n!m%i42Dc_`MSpOr!{q`?dcU&As!FBEG4gKWTUgIzRcArqM zJ`vY1)~q;SRj?*O?0s+4OgMBNAx+@C1^?b*ReOXsnvk|}qI{4g(BU12y%-%y>p)eH z9=2XK1o$K}5h{Jj2U96OzN^6Bm%zMjmuA-OLQ9L- zZTF3>JSNV<#8o=Y-Em7J54?&!)i)-|`Zg}pk` zoOQGgTq`SGMU?T!+vH@CUm?Gbtoyq>_swz0-A|e7Sz8gVEE@44awV2${3019NoSJFo6zGNDfu&uyA8F|VuPbAPQLBhY93pD-e+!GggN?IC0)~T*6x!?fScK%coRjC zN@kXzf=`;QV64aqxVpCO$$BY)TM`%S|2Oc2fF!dlq8V?f*s`yaq6_#3E&q3o?$vX_{?EtEXZqP;dD;K$X z2_8g(fMxqZ2_yhSQtQRO%3eEmNM(_xk>T6u5v6g9`sUzP__gmn(X5@6nkIYB;BXzl zx#Lj%)uYP^pHSj>x8!-qD`kWAmZGqW*(blw>#DnRJW1STpC;^5GoH5jnUxuWgy*S# zM+39$PuTd-BZ&uAkeUTOC%cCbXAdx{W9uDoRrdwZMsNdHI>-T}qRKTGH&t!9xv3Y7 zIJgyEd{>J;oWDWCJeW{O_I*Uf>`tNhHj% zkRXFNVGE8ULXz>{_f<>pBLFH`({m-6xOD&h`un~d50ByUt+k8AOttU6_TLh(=#CbY z3tuXrT3ku*P^)^h?tA845?!^^W@RLRl-%iaL9W+JlzpP}mQOu_0C887;gYh(2)x%` zTXhf!P>iy}9dvn^>45IsWqlu98hj3Ixcd16VY@9IRZWGs=fGiJBDqe62pS+k#9rU4 zBEcCvCP>K@bZ*%6%U=lOzSzXKtf%or(J}qiQPq(2%b4sMi3Xc;vp*ls$7c#PS4*jq zSNt5F{5sK|pVU+|DQDf{-=ji0v_SYee=0K$fLN>P%vqEt<}RpR#y6q8zUb4kN;@C2 z?}SBrKnz1MAnG8MQx1SD_6d6mS^ME>__j? z+&aA7iZQdz&fJn2R!cE>isc1$7h6a6P?~r`YzNZ}VSW6&Y{ow^N6|$|U%1)<76Ng+ zwGUtrch%kI1wihc*M}%%qtt)qFcAO;ew~tM0)m^Q2$E>Pgba6K@ck+gNnzxRQH3)R z;C}vbPL6OEZ0c7B^DbY#A3a*Xzbe&hSOiWPc@G%38++;6Nv=rBGG!^```XY>o}W+E zaE~37W91=oZE?NvyHxYQg^lq{>x9lR5++4UZ37Zk0XT|u%w0@Ziy@4G1xzc+BY_v_}x297HYt!=01*BUOG40!$7po|`&fw=-2HLeT;s2Ipce?v>(a;l?L+5>g&4R1y0D^dO+p(h8K7m%{wcgs$HIs1Lu`~EDQ#FXENJ>gnYcBaFZ%)!+QmBfo@(*dV zAX@|t-~)o{2BOr_AVGt(BMLI1Sl%v22v!1b85PxtAVeW35@kL&=qeIGCL~~hld+9( zQp7@a*$@vU)qn)W`g;Aa8f{Yw2Kq{&Id*%qTB49u-oEZ$Hm zF712!G)5O64*a5qub68U7UFJ00B?f$itCYT`ApGbk`z+r_gb}XVO!8402!UFz8_OLk1j!%MePw#?K2 zXTkd^ljw^%8>xbkYCr38XutL~*Wgw_fMBiqNLxt*Rd9-bx=ms1o3Bfj(c2@jznWo3 z6hj#_$cj0yGuxD6g!6RLAQ?F)n39jNFmsCd_HZ+b9#oW-_uNi~2UpKnfjzq$P7m@b{a05z*7?DitIZ$812Jipj#aVJj5N9w=ra{lynte#qwhZK=Bo zU3x^uo%l+3t!|6NI2N@Xk*Rj3_wB*Q{lFoAwK5t0HuL&TKd^cP4-mobH6Ar841vt@ z)JFH1gN#JrLmxhFRox{T3_76(aDBb{WB;%zXU z#puKzd~Qt6D5hXWP?w1U8#a}}5L*yPm&q!_&(XjxqENYoFP+g>^*HNYrb4(wKp}Vh zbRHFyQMewYE#G0zV@1+VbByn{HZY1iY%N3&nazxZA{no4e7(KYq4mZuH}TgA%KclM zp|2`3Nr|EhM^aK5X+aPb5Z=u^=OOd2nU(bB6$R?87q`mY+&fyMtN=2QbnGb|3|jMp zj84ru5k;-8K?*p?rX!Pw0!2hnizL#o*){aT(tJGB*Wg?UYi0MIrtUcnE#&4rh>T;2 zlxwX>K}A_G?8d&VO&{nLm3k@1B2DqBs!Ns#c_g2$LWF+i0VpCQd%$W=Y+-65>=|*b z^+TnWH7tNry1)2R%`Igb00PzL`%s%95c}c~7opJecb-C7zkDNX**}q)YU#;*{n?qc zBdYNwKFY;y8t!?QiH?#-USTpq%zlCturDr#ALHn3C z$(-wk)d(t6pzRQVonUF>YN}371&9C_0XkYD^Tj#Aw{>ESO631o;wcGA2hnja&fM{@ zM&Y0ZCxH$JJLc|6UL+{k9{6Ff$)p6`7R5*Z?IpA0RXtfuhE09=;nv)PFw`82*D@M2 zb2C=Gjt&W!E{|AffPG@p8DLSv)R{0&*u7L05VGQy({@M=mDaJoB94nGX}zpM%+EKw z#)E_U9+DMrUH+(}t3r&vF%qSW1b9dnvB-owuFhCe6C;6Y(uZ_fCKSB7TbKl}3WD6k zagLl?Cdd1(mhRWMa>?GaV&LGk+HAhI-oM?dC$^DAClD?iYS%aMl6xpKyWe1X3mx_0 z(Zh}MCO+d142q{MeB`70ILp92JtBZHa^|1owYwhTjzdiOB4%iz1TZ2N zDXj_zsQDhc=^4)>|K|en5kM14#w{&4m90v-TJ8zdWfwWHz+%zDHx>N3LHeS*>z0vp zXEBQ^0{x@gFT1tn*#K+4`C6MJ8WMi6GntGo=73tfACYZ z>$D9!i4WlF`d$*H>J`Bi<@s39#t-myN_}q(lRdzD8Nm5ySLFkD&F-lRd%^Q=1GdXR z&F$RbfkuZ|2KS~e;Bjv!0 zauJ@4gaVj~XYXa*a`uv?8kl)O-a=gPcXZ^wJ0ywQ=IU-&)N9;*Bw_ehOmwA=Ixh^q z>#>?}2!8s(=;*cJ|0S1{j9+PTs|tcd`0rIS_j(149KEop`X|(Uk&2RqB07YLveBMql-`)c%*Z z&UWdOs={v-f}U$ijEQ0Y^=`jKBfd{fbv$>wXZ3QAWBwjzWSxKZ<@86?4+5yk#M#L- z*Fy!zfyhVq(i}`>NJoOQ0FqqRTx*G_pMPoQau$Sfp#fvR3?7n`B<=mVdD3BL7H^sGsv}M;C z8|~LNbC?qZEVZjkjgMqsxW-rS9nBvbx2L`Esd=WY!@R`u3&V0|RQE(){`Z2=Z>wAT zk#4_#*S$b={!-=U{sw*X`Q!toA{*4yOxQmDGTthqbiU@2*yK(RK6;k+Onl@PTk!Qp zBr&33?pQnObmVprkx#6Dn`WGmib`fvNmXLh@MGf@H8C=-U=1jh{Ux8>U5Sp#%7_sE z`Ek>fctfZKEu|oE%d?(QF*4KY>1-vBp8HFUZw`;jzej%&I$Wy7H{heXC3Sio7aL0m zJ1;Hlx#WG-C~R&t@?>s8kwA;8?xVF-gxcDJ1EbVSGZ7TTaa2a9F_}@ZBjJNzC!8$2 z+?gxnX33O`;6^JDs6-`If#AqrcAk4T@5FKX*XmX;u8KM}9o|c*LcG=~Jd=GnoDspoCSFa@ zz9WC{Msc;ux!B>w0t8}>!yYYe7IgE5)0k`z+6X1|;ig2c{DUsmAmZ0?Y`I{lxD}=3pNpXf4FAw&}c4 z+`gG-CLY*sCO_UT?g;XkZq?eAIB*qIMh?ye>x*oPhu|JFZlN>fq$G+4*kpuko7{8u zYHz!AVD6g5%EH77#flV<28c$pwFlPn56VvKXh@EBCNyQ`Et;Z@jJp)_I2Jl)F}8eMdKvOQn($qotqb5A>FssWrkXI-fhn~5+*9j;@I1sS;Ur0?md?RD526Gv636&5xD0>}!D(;%f!Z{~t^<_zm|JB`s7E+{S{`SagT=V!4-D?DWBa8En!NGl`AidrCOfmS@1JHbLA zm84L~5Gy)00ilsD%#6FRV}VYktfvo?Y{JSdP>&XNDSVCqM8-eKxUN=Oa@6Y6fXut5 z{u6srXCq#%A6)(5P)oP&D9x&-&7V0rein4V zL}1Z|(V2=EvK4aLCS1W!SXK8wWMD)Zr3PTZanj6Lw==1Uj#!wWwKT+w13i$8s@$Da z+z^dRwJ4%!4!>@c`^Z9430`oE0ArLoFk;Y7ztgj0pS|kJ0eclB=M#`q-0xb^f=jgt zsocxbP4L~du;W5A;sUQ0|PWk_VWBiTi#R9HTM z0x&O4IG1BoB%GTwOw&>U4lgVkbUF-NJ}rgtvo#$R5X)7q|!}y!WOM;+Y9@;JXKAUftl#hLFsUss7%BT$6hz ze#y}u_3c)g&S-r(de&|_N2b&D)Jwn*DwmNg5YgDTSB0%{uhy)zczgiHHBDhdB}dLk$0?ushj>5(IQi z$`bV;I@~{1SRKv8$Zo0h9~TV4OlPug;bMbRfLG4slQW3L_pIwKmGHSO1>gX@TV$6Z zrY>*5VnIhnSA|s!nVOQnR#7}imOOjwahd}-hOE<8jGzN3a#!Mi*`MTnRa!w#pNvwVfGTZsCLWe+IFPHN7i?ZrowNVE8@K)ONy zYoqR~WzqvZzogr*MB~zhbEph2^%ye{<>b%oAh1L!)!j)(icoPIlG>?}!p`ma+S3fO zIR)_KMPO?BuN&!O98_9a&1_ACS8rQY#>lExjlr80bN9P@&vgVc?Nvqo;Zuq;52g4p zVp*&+S}WfO))}8!_`Y|&*6hoA=B@pmlfdL#Gf7tFR{9sjI=Rb@t%=Y1IV$DemgZjG zG=;i;=y%Bu(LhQ1vS9O9=AYFQ%y4psAQmHNy64QWxSXbm0f7IC`Yy98<$V$VwzWT! z?Y9Ygb8o^DUL;mIS=euVHr@Qo^o=Gz+q)7U{#8>GO*{8NnSo2JjL^E_6#H|{**;S#$M$i8kTNrp~5HmHEWb`To};wwclPLh2fqI-NsrJGs5ta+mz>cUzM? zpDt3)8CHt(L75Xekp%4w77@tZ$Y+aM96ITlLWFqN#W|u zZ1Q}w)%^^`<3l}p+#3hUeW3FCG;ZxXUz@*Cb9Mm@EdpWT-yG%c*9if9PL#@4sGV2XaK_}r2;<{AZK@I7#Hr!d z_W3$Mn(dO(d3+^pAg|((D5H{~)gSuGB~n}GOmK7pF4y0Ls-5fm+26ZeAh_!dsmH>39NG@3xOthA$hQaeJa|~krxk^RsK~lOY8PpKu#@<}zmraN+tLrmhrvYpLXh4(t zy;;1gZs+;)Eawg+gM*yZKrGEEAwbeSDAIB|q`IWAu|55SNfpZIHef}YUc;z8QHc*3 zu-KZ%ZO%u!^j+iq>X)|#2@3k}lHsM#$g`kO#b&EB1`C5r>ScPI+syu{b>rTF>gOTE z%>iAGBNlHB&WAXd1P*RMZoF6qW2HGUHida|11OxqeIJku4We@_uc(uL__Da!gM}Xq z@KcRzb|&WpfS>JrL?01#5*#GN@Xy8@58!utuRg004v`6&@}`gB^k%LS zRkC2~&BoxrgYkd;4a0gfyoV8Gp3HRCzh_;O<>gyB z@9^T15+!D^1;H2cRFC47E-idD!^ANRosR9ROFHX?)AXN zQ_YW!V0AK)0W1`7Fm6iw3f60w2PR1Z@=9P_Sok$xEp9-2>RIx5B-=@jv9<%m;Q}iE z?lB>PmCo0QFIf|(Z`Sn`{3B#8B~?o^LSe}8wu9CRf}!=x_=BC$&Rp$Abl=%1Ykx*F z@n_gev9+^b&WuFImr_)uBZMZA8b2SLpFo-*aRqaW`Eg$_S4`BsD2-h>HJz!>(j);L zEHu&PoYI4o%gtmf;Rs$ybK(XQAJ`4>f_N-6*zd`A`=Tt3Uu8YZ+YXKn0>5vVHumK)9d{etDvtAfMaGho!szYXU(5e{Kx z*dHYBfDt!w-Y(r&s9%|O=g(h~*s#i0)#=)_=H3odOK|)*qnxYNG+eeIG)U4$8o`E3 zeuspyQaM9Pl-P;DQ(rdQW#35(`+*!xoeCrSfeNz4mDt!9FGymc!*CVk+5B60{);Gj zaY-v|sSSvWO#YVI{xhDSPJr-8P#u7A0hVI+X-U5c^NZ3LlBGH6)}QBBq!)cFEkG6u zrvU+46x4sZ*XAZa;I~^&>8HBhrdW@7U$NAYT*}mTk(gu6F>(?&2^JF*EYce_ulLuE zuN9I|ft`pW!4E3vFJdz9xJ|&t9EP5H3S3}@3Haab)Ljm-t!Is#y*78fd@i(0U~!*M=r1Ou2xH*uMeQZ$YgEAv*^B;N$fXfTM8lD6CrJfD0um*vm2gT4>`s^;>{( zAJCKS5yRI!iQ3e82D>coac(pW!h!6eGu-4VOx*=O zs_G$5|Gco{S4IN?dSg>(bn*t9b>{Hhlb2wtDGD@T6D|8uI6?7|{o>(y`Ats^o0~!% zX1+NM%~E5*Oyq;Wd$pON&FR;e+YBQYZ1SKfkHUNLc|4Ii$mR7RDLSWoL*2fakJC5F zCtuh%93YS~G^PPB8OS@t250jw4J;_j(hQQA3X*%yMxQx7q~zt3^@qzy<6a5oV957& zlV^2y)_C*snO&smDLkbBZ&Xw9f>D2SdE&~0uT`MpBA&M{w(Z`^6ji-Oi94^vm1v*f z*4m~U-F`=VWo6kT;IXR{pMNh-jQEZOL0EPrH1IQrUyUNLjwMMhMCbyKp2?s%E%G6?~eQMS&%>?==5#QG1{8+B}yh zcz3iCS02dMfP2(cs}UMJV;I1`jgaJ3M`q5VqfbObIMi?;6VYS~1;j)!`~JvuWCu{z zqCauxktF0yry}%6KpF>W9+G0ChT(R~fnLbzs&ICs6N*%om;^DQH$rv{$jSJ9Z0xDM zn{`-*p#g9H3Rj{1LL8reUJsVWf!7>1CVZgm{T?o&fRny~P~}6G=dNZK$1cf^1rFRy z3oeg-**P%yPuF9N`i)hPoBM(Ly%UCt@z2lg^+u<`L<6re?eW)y-z5`TGl5t3YoS-?O(stY1w z$Q<{ND+jRd0cRx1l<6AJ5Kllxz-N1%bNuD<$Pxb#)D!UuW({d^S2>AFXdJDG4bo0sc4dN?LRB zx&P5)t^xrb{5(iN9l4SAPXj9;nl6dpU5C|JK@+nn*MV>MI@0gbZlhXlpsYkq2Z{d$ zP7wrCr)^#j>kV`jyc(fII?Z2O`JQl|g-_~!z}j!qtG^WcHd?)G;=|v`S~eu-2b5=A z5#3U;+Cm=ZoyW4ApiX11;CpF6v)Wm5MmYe{+DL-4a2*Df7@+f!NogW9_K82L>H|9_ z?5{kO*KO@hVdBq!3{>!HmnGN7<|5K~*@@ue^?-I*EwW?3g!+3uzqk zgYS%dIM|r^)Kp~g;wU^IAtf%JFC{G{tE8f=R9UH1t5{pFqF5w#YWSMyurfg)f?KLw zO-)^06*A~n19{Zd^3;(ibzX6KmQg@bT^ZAq!@>fX&~B(KV`X_6ndH@!uGiGBZ*10I z-%>ikzS~vY`M6uP`FV4HduLtw=g+EdKi+)&@&@xZ*s7|ie&X8SgMPxs@Pqgv%1n+Q-u3e{?QkOr`( z2?6UC_}nnrB8se0$0QN~a^T5S92tTmBJr+3YKW6~ZWdiYov=+8RL(1C$4;1Y+(qy- zL#(k*tIRrP+i0$d3=TZ+1zCXR1EIJifNFZJ04`&Qr3YbBvIgY)38_4wqNdDGGjS%) ziLR>6_abTxe)($mUOK-b_DZGih~uVZt`f@U!}rgZq+fLeFF8!Sx@eyL*&VKaqL1DE zTqvhESvj1mGnV&hrhnODsq?UE=s5Suy~w4oH_Gmk0!HZ$ErQa(HdX~csf=(Rm2;(_ zU!@MQuJ5E{#qrOcvM!I2i=-5q2^q`=>qH!fE=B4YYq}%d$%We*i)Y{~AWr5;;*E_l zmrb!N$|NHS9W-JABp|FPVGH7MB&1$aBydlm)tZR_N}ANlsa@xWJN+!N3gR*>8X#yN z7o-=RTX8EDj!^2}E!J@=)jCsgh|~UmV+#-o9|#lTuN@O(Ri~SUBqeMmk@C#umw`i^VOMn4d5^yWc9VMlNIAr4`m) zS%buMrkG3I7Mt2=lg5ReH+}`}>!{F?cCCuds}S4J$0Kw!pTJWubsruI-|#$bgr`8bR#eg^K14B$25Mxe$tx;)Tx7;At1iaSrx^(RlApXhcDBQ--lMY8^Ll7@K@rZn=UcK5wW)Jyrn(05mC zL{_6<$)t#%|Jpn=N_o#t(qdydZ-QX{z6e9=YZG7~Wl4YvH*qCGTo&lssJ{DOSeM+? zg!Mp*B0!b3{)#5+rZ{2M2PU3}e2Suq}^a+i-&JTTmnr zgLDGKpcJq*g))RZgev*Fj-`gae^+b0@-r*p=L^+bL%Z2u10Pj%ejvufjdrfawcr2u zQp(*Ib1Nx-?=!dA=5oO2=$ytt8Zrn6JF`w_;QOh^1aANsPJbuul8V|xGYFl*_x&3u z{jz|8p(r);X)O=8PszS$g==k#LaI*xi7Ocz^dMh6mD{uW|Hhr$n_$qUr6M!dnS@=T zmscy~1n?LJ8K~ql9}!?ECp+sWh{7TCS&75DlAqhTS8)Se>94b-L?pRGAWiN2`?syH zobl4{^W)lIEY=BFzHrm0sXuk1=8Pf_($bJNsqI!)-Z&rrh$6&im!;_L;yUwFG6tZm*5|<5JPWcDh9LCqB2G z{qg@T@=}uYEJOyY2JgOkNM)wuY?(eTWt@B`7bu|d+-tDB=j#!!^Qlw132GSv=Ye5+ zUQH)*#)}84Cs~T7^z$r8xG-c?dIsy~lVU+9avk<(>vu951MmhbwP-+_%r>+^Ia`lr zkimj*01a@d-@0+}hs>i79}IUpzJ>o!Xsvv${K5M?N#B*=o7!ZJfh$+%@2X;K-#TiQ zWgUdxPBldqfOva_G zSyWY!8Hj9oyb~On=XwT7Xv^Ein5facO=H(+x!bfH?vV7C_QqZMC;*VlxZ^LjA;^fF zD3;#TI#_N+J1(f;wzNexR#>DGUJ6-!^)@ESY6*XU?pm(RIomucsbg%adiTuPa61i? zbn?~VYxH|2i_-wa^jXcYYLwe05PW!Q8x!u!qk|Aru_%P8QDb6h2?FTf61kzfflH} zDB#j=%h_5uukg9Qif=PtN+;xRDSac`Xg9uYL2l(r7HT?&L(^ z_V8Tjoy0WCeLgMP=;y#+vDJ^xigt%-t&?YT>7^P-#lmP8fJuP@r17eUvB-a|d2;Uc z)EH0_KibLX*TkTHa3QeKj&?j8N{DsnIeUNf`&dYVUed1!!%H@PS06r{ga2?zKu)@h zFFaoQ-WeTh1?#!nHkh;%BeQxBA9A;;p34FkG@Gdy75?9Gn}(qu6ZW)k`RTz}E>by^ zi5AG$>kyoJJXl!2$iB?~zn=_0iF&U=4x|yNSod5;9n3!!>gvu-criJ$;9bs|dDpR< zf5U7<$(!=e{%frh{PJ06=egf)pOh=o>%U}%B1LXGdktw$xJB&7u8RE3IQf;Z-}ZpW zwmzOw`FShX=5KNM#ggRv0G{&*tY_q|p8908DRV#GC@J~X)zVftl5SJx@COZinGoCJmhr0g>}Zf0Lqk8{oI_ZA|7Mg*8XGHfX@ zVCy-IVG-gYLzj0TH6+@o?b-(ruzsd$&uq+!W`9pkat+EhZp|NhANvhTO_EGmp7j=3Pm6!=pxp+-7h!061RF0@Wf68Pa77;pZ)wpM!$k@ZVA@oZ zg0>uCGixR!3`2z_#BPvQRBvV~%&hU)G<-@VMLX$glM#Tgc*+#EEt9|*9CtAoS6mGOI#*|% zqfV*`ILFf^0bu%88f6J4FPnFAzsABO9=Moptac#o+h8WJ3FQDF^JInuh1qsmslCnS z((=Wh-<+~0mHgw*l-@FM;v#)(EI788rrSqb@S&pOW1ni17sRx@=lr8BJcqSiqD{(g zN*7*(k|LOI)C34IYE6G@K#8O5u$f^a_1) zoncUe5H^FEjNZaBvmacgEuQI&=U!>f8+*!qg9&_5TG}H<{p1j=nrMKRR)qb!_Qo-0 zv&k@W&j3E_Vi#|^@RaKlMkYU4`0NzNrwkeQJ|Rm>*#mK^Wo)T;8ƴV$3pWz29% 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

    5Yq6o6_f5YznQrKA9~MRh|(t z)I7a;Nma*O~qnD4w}Blk!^ zaFG z5q5B&?NC*n%2a&O(huwXrHns{eVZwc%N{u7LoG?PoDS|WHPLgqE^O_eWy`nZ zPtJz;+*+Kr*^&s0mY%%vAz$CB;I-`(;o$7+#H_OCX%=!Wv$Zjp7ym7+X4I4|i%`84 zr6yA6GuMwTLtaXOhI^;CY}EO>P6`E_+USc7wiJ)3Z{1xssg##~ z;xIkBsTf01i|j3zUohk72NJ*x8d3xY3IBp5^vvG_y#864ZhI}gn6S9^1}{T11%Al( zD&aLAJ%0}_1p9BFf8*j7Z6~ps@$(yhImD;fli&AyC~kKFS=)vK0OML-&a-gtdZ;{$ zrbt*1o=_1%OC#dZ(KbnW7bn4~R(-_b9gdKdJ6v`aM}rMT+hre>9U;G9fwfc!6z!ARI{1>ug1`*jIU7Ns}clvbxx*OS>IR;kkD~$7ic= zE^+>bG8Nf@Rz)4nZ_t{9>-UPA`1g3fq6PfBd2*THD-8%27WKOfE2Hi$7yWT{Ylb1U z|9zi--B_&bQhz@n*p~@4AofaN)r}#iXl73GRpU2qdFqkCKK}7S29G8QX2zWF@@u;I zbWQNq`tImA%yqHx<4SZRwewv+1Gh9pafVqz7v}aXx&=BX9sH0uNt=fg0U2NM7EnQI zw7@-AzR^h6Pl7J+iU-}l=*R|yrUi5RkIbUo@I4wqgCTPsn^{X8Lue092u zys1F}KaML}S9@)p;D$@+$?0fhX=-R03t)99S*|P=F>92nP@_;?2Lp&oOVrhuG&Ysg zx7JHbqhw`dB*dgdVKCX|q2XI2qqoQIl&CZQmyf=qG1EAAZ}I-Vs)%vR@YJFLrHh^BeA&vh$m`a@#86BimwVJ-vyO zKh3fbVwLud!6ehNczJDvj3+hNd4#OsYU0`!9Qk6{<1|db#02sPmrAKO6KYc=r$Z2{ zb_)PhYB=20xx3XLtD$()R({){W+ypJ4Jq+SoUaz|QUq1~7sM*K#0tXnFO`qKF5yO9 zI=Hy!+?sVn7EUFW@XCd8HUe}5a2tcg% zK<;;90PJG>(o_k%q#x^0P5x+&gRFc!3S=RMM8fLX}r-QU{mdm=U zQdPyA!>t_GOFUeR{4rewh9wV97Hbi0#x0wMu%;1LO@HlJx*DrN&^R_7HT;BGoH5bT zvgaGn;4i|@1b9vT=;Q1Xd%+lZBhV&TmVbQNv7~tv1?95u#QQfC1+>3wK5RxwAZ%OL z_r}>Qko*j|R-+N0=|XEmo}&()z%Wtn)U)CdweuiZvpEGf5N@o~rQt`;omgUTEWP`# zNB7BOv|ZV#(#MnsznA^{hqHg_fK}t6twd8}MsiK!Q!T&*AseoW=9D}ADu>2q&T@3wnsD@TXOM;VabQQg$nzHTpR#DNNqzG zNEpYK|25kp$#t<rp=!KbqT8-e`TfJE;x&npE^WThnYlw<|k_-ITwM#8&M7DVyBg`52U66sevhR-E~6d#g3Y#}cxeA`3KS=|FC*g0B;}p~6P$EItDgr~DZsUY@9&uJGN%<7Q;^5hLqm$K$w&LgG^#go;xVLqXV#G2jUs)G++Z z{X`y$GYgdl6R=|f0@NAVKst~_mxmCIVcbp`j0;^lW^Z>Z?$nmqmoqf36i2+(Hp^{8 zt^h6yEW&Ai*l3v|3BuD_kfDMF|FB9aY}yQv1f{ZdB2he)7qXi|8MzaC^$J_IsQQgV8`DwAT~%(7=Dz+@mHjZMtG2w(t(bOkLyad)OhnbYB)P0NnXX`H6XOwGBn@5d8Q(xjj1x{ z+Yf4L{Pu=kX#R-2=7GprezhP~3ZU3SR=I5mq+ebJokoNYF1ol3nZJx6w7X`*bek*fGMxuaaaJPy&A(GkDqeCOy`1nuqYt z?)(TfgB$0a=f{@dWPu`@N1d{|H5S5o;`k|=v5~Y61qYkNSc#z+F{Z4Pk_?gHd)6VV zbZg%|U3KT`mSHMCX34D7wpm_^ML33&AUio+hJ1DH6igh*h@`A(d5oOt9%rL4ATkAl z3$0f={3MfJe*p+=nG{^5BC<8T++u!l2>qua}h*J?pgzxNGb zswuz5%YZhFHJOQFNK3I1bgmVYEQ4U&&Q)`^X?2gGXGnspU^5;r5x}D{WKLkhU2z!A zu3*Pl&k+mzC~J7F>=zlCdrM8yS*Oo;h zT?1#t7-g@&y8ODQw0Nv&kHL-sGr&rb{zq6*3H2|xetK{NlGyL&EYeMb_u+SX#noKz zf0D|Gi(jnGMu9!43S=~mT?%t*H~Vx@h0eB__pL(!T(OCM(^Iv0UH=xwn=i6W@ZazC zW5>HAakytkua`tkeRMHoTD<#X^k>KQU!X1l%7GzWoH6^ML`@hfqgs;Czf%0iBl2_ zC?L;#c2j*hgJ8$PxbOgNA5v7o-;2)hf@g3{LvTpM!vr5aCe$%5z``JF11CoruLjAtK?#870x|T*K5h zGEN4CSYxe`(w&o9$$v^ztmy!R3T39{eA?tOC0u$tNNKE0OsG&B+Jh)i;vX)jivN^x zg(9`EAOb0;isC!<$hRXdF!sAw(-5U2Bk~yXd?v{Ha=8>Shcs)RHVZpeE=-UL4p9)g zc*sZ+WK-1o4m`V}7<|_vD2|8bJks?Sk5TLy1^eyg!C zUJztKU=21`1;lL=urwQ*8abk<+X z;EECxGh$wZ>=}(EfGt$$;+92wOMxEZxb3pzT6~F0e32f^pcn}@odp0!tTR7fgc~SK zm*iLi)zp=XD=Mq1ujZ*;yG|*mW!5(| zw-l+Uw|2H@baZw1P;P1r46^o3My?NK4c_eS&l{wV&dg@3Ys?i*FBXh1JzAM-A1HXR z`t;eOjisjNed!CE+iweB=Du&%(7f`7w%hP(C+q8vU-v2wuKxG?-ll?J(z}|`n185# zyVe|nMi!8$esX8eZOTnlKC)DoPj1>u=5h{tu)ERTeLgx<7x6l{H$P8cBLCglQ%9|J z+TNTSju*c&D$l(8RdfpWl`w&rRuy(TC|-af6ScI;gewlu zJN@#1qg3)h;rZjCv!Sg|miW6eKlZ$P^w&w$X7NLBh*Oi#{Qa%pXFUh{zbcqIVg^^9 zFzWny4vk+DW83=#PP;_woqoHZH=z4{^DTbo;rE2vQypDq0~vh3nm0-Xf9&=?Xn3n9 z%}n|tzuJEKa`Z@VuS)UN7QPfS)=?sZ&bbH?*{LGKWx%zRf6iz^+J%QefPtTL_^V8@ z$CFImnqLO^qr#z-T<&xvW;6Y1hGAYdg>FbmyvA64nUg1m3z8jU1UVS8G-bQQTS-F! zikUpg^2QIM55t2sZ6($knp0^m!9Sf zZ)bgTZh9@Z^HHIuKFW@}@9YPM=>1Lag4-gj8ran@Jpv&H35v$fS}7XKGB*xuDKU3l zMR58Or)-5^vBP9Re(_wV`lP0oT9A}Zq`1LXdL(0e zwB1VQ=dKP~Mf9i6O>@4OZx6Q@a#3S;20VS?>|rzb#TBs+-zJxwg4@ik=l8!X8Tl_d z6k6vzmy7z68q==nA-~-JNE-}o84JBD75DrW?6>9%v;F5$s*%TsZ?m(Bkm z5YhiU(&LKj*B_gy%L2c~OU2`j-Y{}5BoHxAx4GX&+DNXemFS$<*=~%Q)R>4E(D+jn z{IZ7-mHXhvQG+DpBcXq7 z8L&A8ZMNXr2JdsdFylQkGM@%hN;0|Rp=r6^K%?{-;CL=j`3IublQb~(;yAmQF!2Sw zduSxD3hcColxGNRXe4u&&k$E%GFWP1;ZlmTU{iqr;X9%%hnmbM%Yj|46Kz7&>p05E zg>F^o{>%I*zqC^$l&&N~?fh&5MEe?P59LU*XS#ob);Uht6|6jT6m!{~mb_}!FSEQI zUl=*gZNngO$8b;#|Dqx-f^98EY4B}|?Dm0yta5R;UNIHN?NlMFFBgbh6Ph{lU0sItd`Uiv@yB1^7ZR5Ov^+2e3T24?2rn%O_EZ_>sZJb+$ z26rP`=ia0%7}zBXa^1cm9(rw@t63b%-nWk-w^R8Db53~=T`=MxdK9UZ&R&U@tucYA zI5s=oQ@9DE*u52eoJ=3RcuVm3QhR8J`E7<*DJM$e9(wfyu z+v^762jti!6oh51=y2A$i%iOGenW+|;b&(XOm&g(xoL3?1tXEhcCm-B=mSl6FluD?}O8!T>Skj!4@IYVjl(d6Fj|r0Z=Raz5XR_|66*2 zAVAsGNPRkKK#tT5tj@n|01-uSPjD1@zdgr;bR!$YKDNt9sh5lp>F21 zsF(@6CK?N#WdT|Bngr8X-2W>?&P#`K8I?Zj9z1m?jyOb#-=5FHoRCQ8d=M27UN6BD zN(VULWRa$-5BZv@lpkm&|HD;}x^LC5ZMlaGg1-y+zt59PA^PxZw|e{;cu&Eoa(n)} zwypcTzjh)&-%5kLCm7BI9i+hfBS~jnLe^D81BOb|=;5x^yk`m@J~!Q5EEDJPy|ZR| zUMN#vSJv-YKMN9WQA(MCqZf0Iy>#sUh2=C$=y?@y^4sm4A{-G&IA!akv|QEtxua<2 z^qObFgJktQ2hqhayHug_g7AJhmEZ=O!&=XtEc1>jkI7A2F>AYTSzcN)HTvG1(e! zVC80zSU#I;;N{((<^9(9Nu00L^ZJs&vj_69r5IZ=D;Vo>$+vMEG`;-GK-1`RU~0qe zcckP4AO0jXcQH~B4hXUn$SqG}XsS2tFyen^wzImg70tyPvz~Mp{>vF#IJeNe)kL{x zIP5DQ{H3WD5?q8)h5J@zZuiFz6NY_jQZR`0TXiJ1gFR)~Wu8=L<+ z5oV)5yXK584AKCDN;ZD~2KeEB>dw46#+uzE1G#4tM}AwC$9*if=xhXR%6T>ezW!E!t{eRx zD4P2hrlCW_fdnHV2`UNRR$~rBA^lV=Z7@36afsjb^|Sx!frv`TXxv>;q?5qrbTIbw z1hK1rrQTJelB^eo{L60lNLt4Z#}-Zl1fMFRWS^4S*uRZ%DKxP6 z8rob0e2R4P_#U?|2dbi@TEp4i7Vy2TW4$>7?CC%e$7rX3NGOyDwIl$_!1bs(S!-EC z=&nFxkDwCD;!KEBRV3TUPgXTrJR|V|U=q}E5DX5|lPr?%cdk?rWWz&#I{PINp^`}O z)$ISQSP)FY>%%y8dJ3DDn2|BJVhwAUCAT5~#;e;hW0N!(Qb;VwM*}{mMq2wBOdmvy z92x>$Jlf$3l`vNg0+a_00BArOKmI**+;Q; z(_|h1V5Wf5NRnnJuxJ4u>!H&$qZAHDfwUfUNeTH?7#jlwV_<6wI%%fdsYpMCssOe) z6re&0(Z`rc<8xcSINwQ)P{W67fGHw=962}SAd!*2Q2-PN<&?LJ(>4200^YYIJfTB* zuuyhd=4L>26DwWl{ERx`;uO?(2ev6i^mRvXtku8_zaeE#sz> zUB}~v1A!Vu;t~tM|0@PSLz*vCc14*T21ILgLZMVp3J*X#iM^|GG16v6W|aLK6&Bu+ z^+K6FxC{s$s)?k?5?~s-<^O4d@)VGV0n2tmHL%&-DH(kY|wf2FBBN*>R&bM-BA(HqHWOvm08bLi@&viPCbGhh7g?$%@oqQ_eR%+In0beM6xue{m zklKj?_3^+{Kj4RsaOJP!PtodrrW%2=)w_LwdReyPMHmYK`lc5h14}MJx${r~!}8); z1cZYM4xWKZ6QN3!(tCQoz6)f#1pptI8Q4%YKkZQxYPnca+zCs~FLAiF7%>Ob1+wba zMn#%&gR%#vj80aIe!g!&r2@LaJiX{<7{Cow@uQ(qm~^!=00Ka`8K0pO;O)$i$3d0p z^(+M7Cqg+ip#0KSn{*kV$5_lgk2vTrtoOBVS0hgN&r6iC!Ohx zyFQ++z9{yIPWEaB^{B1N3Q&pYHg1M15daW03KR`MR>4c7)UeAfvA>|+s8n-lKCfsf zK**lwW}viC1#EJ?Oa98iX*2!~EkX1Ci4vNlm5PT-vqB(~Qj&a&qNKM?W zMld9H6U4oM+@z?$g!_QMd@lzr(>R^1frUC+=V}mOY*-jo_wJq?#CA_MCFqm}0Wc+$ z^)k>_Y-Lqo>-RuSPKPU>O(LmMJ=Tqv^^qlfZkcTKV%Ji@BRxVQ5UQOS!H;|xYSY%@ zf2y<>JuD5}VNF<;2bOj^>!&L@aNhnxm#BWR5KOnYlH7um{XaL%o^xlnqJ2U!ga}Pj_peCo1&$B-ZhcY-~mL^us zH-jHo3e2b$y9)p-EeA<(o0bDwjZHs9^VyYINJTbp4)il1VBfxORyts+4TW?P+3-+V zTDeqgHHMNB{433-iF{|k!ur%ByWMhhzw4b>sr*;uo+Z~X_`?k=82ljnSO}2Ef|3Lv z3jtav*_C6hEp7e6OKitNB7c#HUGP|0$`dsLw9^kN_okkgmU*lIfR}`dl^Dl~4R}-p zEt-s%$3x$tKzZP4V@2V4QIY_<{KT(@1vh!6JZc7X++NHm*U8rK}4jZ6M zfhwK$<)@7wp1DM5a#q0uui=?hkwDAuDkud|$N1_KfaKR6?t3pQbgz5-@d_$FGaiAt z-K>R-eFmkzH2X1ZU(Vp&k~iI?Zaq}J=ec`7BG+X3a3m2>5fqqm`%lTG`izAg` z<#Bzfm&@*WXHXgM@`gAV19sLFDt=B&mKi%PoXprXd_`aeYe*^)kTt zho|xCyWpT=!oO$0j0KDvP36JCB#F=@x2N{ju#%$~3+ijG+i~n=^U4OYW*728QE|-3 zipqO{bSDhJfo53Je0e-Ky|^P1)~Y>D@-RHOTgA~vqje@WwA?OMx6NBx8kBK*;SN(J zKykW&-2tFWhuIN9Mp}Xi02IfpTW&KbLrC-MQPZC84?8Xb$T1F)3hiBrMZEGq6 z+!GRnq~FY${C5AY2L0p(F-_Gv4v~bo%6Ja!(5^fLfrGM8VW+4t_o*#6Pr!<@=JpmQ z$S7n`V0N7_CCit1aQ*br^%kskB=eI?M)B@bzJoc6 z+Ke7TkQ)ch>l^y;I;VB?irMOWb^BeTRp9GXQgXiJB!n0}r}!&%wlCAhzw7wmkRu!7 z9Lu}<*bd&CgsKq09xgrx1&Kgy{E-b2n7C3Wwfa&ub!^MY+uPQ6`?x#k=L5doVh9n& zuMA+3(4!8BI0kt9;=_7IR6lX^v=N*+k8bYtPQ1Y8Lv6k)KHu~LbTTVPw)30)oi(OT zm^tCd{t{S%D&BHxc(xPYy2FrF4qFGzcm}-dw}kNM&0F=)w_N~!=6n_cprYs{@4bX; zi8dW4gSSJL@4OTFCy0+25;%DGp?K&8gwTzk6k5ALbus&%k3k}K_1m}ldv)Z11v0?9 zv4B+DSpQ<;ASqPmL*&uWv(kXA@_hXgN=P&bGt($2z@_9fWK97{i3Q?Qr*5Hi&STp38kWeqJnF z6g=HD>$hQIny-u+epfWJaeT_6nM5xdQ9 z_>jTx4PH}C(1>!IzUx|#De3rD|H|H<_BaDAzoq&=Rw^kAY z+DVy{m&Z|E70qmEtQ_1Z)EZj|ca5?2;#&R;5R{#COGE$mxOb-NV|gJbv(dY6^=M72 zw@!UAhP^u_EQ~c}11RW;5H?uA8)7<&1j3S-@GleD%~z!zRAL2&+2QV%rp5d)jE#rc zf_km0(Ki6g$~8ECxguDfIZtip_|f8`bagw6Eo;nvbK))gk8pkkpsfgiaoxW=;$od~ z-;_g&jwhLJ$e+&uMqeBW-7v$^Wn6(uY>9F{Llnc3QdIVwi&Gx3@d80SsgR@qRXE~nC+RD?8&2rume@ZDb7GBl*|*q@xL zkTZ^Ta+>v6vmnid^H8_Mix@120U2q>+`@XGs@ajkKIJFQAe9nN1e*~lY#wX z`Dd*FDtbt%YZ3|RKF(a49|4~9iE^<)`6R5|KGJDWfWtRH86j{}9pnLZkuc`X7MKZ_ zT!NU?Lhr4s>KX~_nK@ZnndbL$_H}IslUVS#p+?}}jjMIM812AeO-pKblRO z5a0~idP4proSwu8n&gw1rw@opAYh5>S@;;k88hK)aiwCK$j+16CPn z6SAl6&T8%xUiQIMolvc&?$bWSKcvm96`l-#8~F42efJc*1q?Z;l+Sllhm_3(Q9Ydc z!x?pq6>h_;z$=Y!D2^4wL;>cjYL^`8j;M*1)fkCBCT3LvL|hjgv(Q}0jKLAv2uS#* zjrs2d%{qb5%V%fgS1Q`-k!)r(=xJ$2<{4T2d-M*IGM2N_H_XC9iMJRRk=m2>wOSc*~} z)rsY#5gAe6K>$UBAc-`n>z=i!JQm{6<_C+#kR)7aFqvIH#E>QQn5}R9f5IMiOC0zR zVuk=+k}-nVNtmSu(Rv0ne-~YN(j3nEs=MZ3iskO7D>gB zwKIsYGuXkKIj?BSi!U=zVvU(lcpyc25DpW1&dJJP+&{EJWe((JL`hhKb$k0W%21wM z9E>*$50gash&+{t@|F@|`g91}cC=BbJPZM4uwlUj(!^RKb^buk`5X*aSNhqbs}z7e zE|iU~+>*Nb=)~ENUQdq7xNsfd9y@LobUap(K%^`f2d7bqqJ`M{9LkA*>`E$udwd-T zM4-=FhRdkz!F3>th}8UX{$jLNcO_Hm9Op%lg^zI|)=lFIn{bfMl5DK+M9WX)@!h;f zlz^K6kO2h1yWnFH^gQc&f=;uMP(&9?7?~}e--!)}k9aO+0=Yt8w24q3XegMDG3!_7 zKc4~!!AUF_8i@@VN;cNr46tE?oWRkbwr8MDYZ*^&@4|Z=nUb%|V_*SyiK+;LH;Ixq z?ng44Oe&0$3E34QtM33=hF#-;V@%KlY*79Oc8$Uw-rs%^1G8IW88f#*7#?eO;)s#1 zfJ2e7SWpE1IjT$B6{dNtz+#Fr=3W+Y&X{ZyJxMGCE})ZOZM2&9;ZO3(x-*{`*~KIG{9sOFo|X>qM;h7t zae&*;q-6ONUzhNIDVf96aIIB{2*zM03DWJt@YAzhh(t|e42JqLKg^`QljoCPkC_|h zK<%>UzP`?M04%2EpS;qw4o1%XOF?O@Lf5&n)@nZmtLH z&VoAFn>wq&555uuWXZel_>jF^6D$lxFaNxYB3hNd)KgMJq~xwa@{`0iXKw25l{26l zL8N7Xx1|`yM2Ao|eUwrp6!%WZ679=o0Knb~S$@(bPa&$Pf!g1##G}%Z|1_5eq(O`@ zS0t^jh)EZwE|R)0f)fgrW<>C@6~O4{(&Y^V55S-(@NGjG7VsQc%`H!>_WD{=R8u{J zjGd>jG3sCd;Pn|1EP@PPPu9}H0AHi1(~W8-6cZ4gu0Bv^#Aw%Iyz`sb*n}uXR=G1m zwN|cCa;_xPfQUB$^qA3Bwd!Qt{sC&Zzxp=JiURv+p_=onO7{TdLdX3LQ0&9%$wi>#UUsF5I}hbJ-ySG^aUQ({3{wt&F_tDRh%L1$Iw9 zP0A#}v9~e)O47wgIX`~gF@CS;LMdz+GZigh1?MKrX`NEi1s!? z@Z_(|cgQ^Y0eDNeMvEbY13GkxU{AQ;trnC0p4PCa#G}nBXZ|vY{5CZ97D$D3?%5#F%I+_A@}*tH7L{fZQn@u(0NhUF{TU)LQ5wEkdlmw`iTX7b%GI zla{W0pirqxC7|G4s08A)kNgn9! z-fYkJRw-|;%qe#BJ*PBUHSg_Ka#7+6S@UEfGYl;IP7n&ssCS=O!2m`l*BY2R7P@zF z-cOX~jp~H#Tt>a!^3Y#w@k?pEr1c=}4{VM#E%$da|AN|*ZjU<%D{zaJ7KHKzvWwFo z73nE&6<{BiK#^Al+^yN-^Z}U#a;MFMoK(2!%iB3pS z0BF(~c*GYRpjge0crYyT;Hr1{(y5>?_pSQgTrLWF;`{yq#Om?k)2spfV_iHrK};8u zPW$BYL`HD%`OyPuMRCQ*@^8&glARyCB-;M>CPHGl1As^+(jJ?=^*r*3h{OW%oQ$ml=Di%p4=GhR>-V5{-^6`VO!fZQX z4CB&aOV|h;6zj(PTr(EsGuc-kOs> zX-|F+vHCS(A~70$q|KDZdlCttCDV|?ZiKifA`b0T~+2WA4geF}~nCsT$ z;lrUqk*U<@?3-=%&@B#Dz>B$j@YBNyzXj51A|Q&lWWrAidid4MfpZrDQ``Q>ZytP0 z@9@7owbhjvU_1Gem?}$TRCIc10UQlNx5YksoPe3=tX!@UfSTUy`TL_p?GbO99zEA# zW)3$yJBK=r&Sv-Mx2x*Ze*YpTv*9#mz;hYmB^x^W{-wX$*w0oD*QODZe-qG(ctAwm zT>FN`PWl{}%D&RaBKlark>?>LVW5&tf^jIe2Wvu}KEoJTpPn6~js>lRlV9+X9|17p z`6a8t6YVbs&|`{_n)8peTn+k||I(kQJ)2pbApNWCKXz0ae08E~mwj<>p6|mf%~|## z4rt6D?@M{Di}pXX?fF+sl9jHI4~(*Ck5Oe&D&aouux2uB;ymEJU{86|*gmPiLUYy` z49x&KR^}vXqn}%;l30cpC5m79L@}%6Tv66uwS#+KOiw+X_IhP3$6zJ$1=xO#=J)W` z@!zHQ9;sbFhdLjur0SKtcbNL#e^JwdQ`doVS1E76pK7$Ik=0=dTx!Fhbn^%`@ zw*tyH3{~?cD5IC!$2Zl=MUS;$9a^812hkiHzV5O{^tarP8_HP*pJWEHcy3Jno09vG zr5DWSah5)94gX&Q2s{78UCP9eJ;{?}zF>i9n|ssQVFDm z?bS2P`tpnL^=sAMZ_n$0L7923OIMP7udWsiZ-4rD8QHOVF=~r1c(bA{BSw5*p*vRV z=^N#KFYUxsajW%hm7dFy@3Pry@~4vTK8nZ^iKRW=gA>6Yw~wq+JfmPgKH7zF z;H}obAE!M!nN8h)9H&o-wRi#I5s~G zA#<_1E-f0k42z^ z&%Y@e=PBo|S50ln8hy3HiFS^XpO(T|9?uVt^~^%XCB|2uRL^+-D#G>6G}`*$xPdLuJ-^Tng<&(9u6 zeOcw=nqEp<=`&*gRdu-kTg61qQDABmfS(3Y!a_pH!s!`lnb|4Xl(f{;^c3`I zCh@|&3~?qCiOSldWc!B3rsm9w%;shxF+nYIZ3m;3@&EX}M=FgcpD_5n$Ak96PbXgt zsHjejD0HY!^k_GuVP=%Rx_qIIRpFAdYB}utywuKUy^r=zI1g9&;0rO?|4Mj zQ~8et()nH@JWk9uV86UQxgUcRGHc;E>6j}UQcLC}C)s{H4dY%Ptdh)Lj~%V+Mcig) zPmS5M8R=}WyR3@l5$XGS*(lX8sXVdfYmH`{eGF0o+lqQ-P{5o7N>ke4z)mqUHVzYCdgL0M|mfZ`wGTP*IaYaRMAD4>Og+B>O zWpy{`60s{vw&@S;xL>RhWSFwpki-%_tT1zXy6Ry}l7ziM7D(R9-qYvXM@l-SaNIMi z8TOCp{+t+^z;@#7a$ypi@i*=G}mp0v!xacc%_A zYt7Oi%v#7pA~Ou;V9I5{*gfEU5U>ehF{8M=%NSY~tj1hf(GkQc&s$D{DBV?2Qp^2w zMIf6wbcll!#=Utd(aVL%Yydl?DRaWP%^(J){+NMvRv)$LBBK1gI$P^;X+~B> zjn!o}Rpjld&eDwB_wZ!^vElo6je?arN*i4rk!cAoJq4_ zXjO)pP)E(iRw#EG2+`sL07_0(p>eGlkyU}aW){B(T1TftAi599Bo?Ik7ynu&^ud1r z?!b(R#|wIis{4Y$VUjIzz1+sDE}OSl@&w_{2xMGqaQYyZOtib>HIZ)=H_3E;;xPF6u^jz5go#X8uIKpoeoW2 zyH%Qej0;JsX+(QmV2DL57F_^xhEhpj)&(no!WkAlNa{k;MO?pA$v;2*Td+H&sE9P9 zF?~J$cOI`?B@kxLq>sV&>neAVc_(*>Nwj%SEDbEo3?Cm$$3HRN6$hq2GKuKZP4jlv zm=2Fj2$VHYC!o`bl0LsmLUxMev(bBZUb1QZ{xed@;b)xj=oYmV7~Doi-Sw0+{0jPf zY{MHb2rb1QB&m3)+!V8P8Z-C5b=3na`^fPGK=o}e@eOc94zocp-;*|uoleFN4PN^1 z^3kmedqWZa5;lguQ5kNBov9u*u<&>w5lN(`S)TTO+VJzXD0hwizEt8w?e})b)o~MX zv`N?e*Q7+NT^8eAW+XFFp&;(So+*FyeZaW+vt15;?W;a&Ve)Ejvrs`*i0v6HJ}H+x zlqLax!+ojWy#LVsI@iV&ILX}Sg?qUskUkcol{ z=Ves%oBaXWELE3~#s)Vw8TNk4ZO3E8UaDTS$}U&o;-ug!c5LD8xj|M%`aU-!18^u6 z;BjQks5jA2HarbVpxHmv#a_GcftMj{ZGyB>K$9b=oqF1O8l9D3!Jib{*rC zuKK%COks*JktROwvvTC?9EDii1eU{^cwtKTXP+5~g!N=S#~7x=SSjmFkT?8q%?f)K zUUXbP2Agj6bHc?XX?JwzG3T7lKuQgQ-7?lLl&WF}WHeCTGZgcg7umpj0PFgd~w?L5Y-^N4swW+<4)Ob3WW*?mxt%# zGt%4?=Fo6#nzEceE=hu~SLIku-h>I?@>Vr6h4~DC?JPf^cdB`apQP`7Eu)kq%1vx( z>}2-e>gz~I>l=U3r($w4T=aU(NA7feESvO0_Y=yiFioIc!F&6{_E=$mc5tQ}FRhc^ zNH$57SA<1%)nMklWqB0m_u4mo)&eTf7A~8r`}!AWxEN`M(KC0k0iB5}oP#j=fI)vR zI#hs4g?%q1GFc)aY?D|Pxu}ByZwy)3wnUt=TFFv+wZaZ0v7A|wf&I7GbUl3_;b<T+GYAi)GEtANeIW1$hlI*Ra0=+G2;LMfirr_tcJhK6up zjG>kXc>WPA3vj#&TpT0?%KA`U41gCPTgq!VD`SYkx;3WF(s#WgR%7j$sV4hwgCPgN zQmp@GcS=8r*98mZ4!{~hh`^Rg&AX$?L3j=obyP zX~F~~GC~06d+n4pT5jZC0)7Ox^L{fRVW=v#J0fA^IZAwiiZWpF5v~+KY$S@AjQ}i+d%}YRn*m?j`6)wAW$d8?MNu13W_{cd z_H;}6+Kz4WAFtotlw(1Ew!nQTn#A{z{~k5F>vFamhajEC!i;^7nAZmplisl>rjLJE zBIRmqlZe`yd(~xb#b0`zs!!-XSo~gAsc$ETWJYGJ$7|<5(p8wxPD?+Hy00*l7>(az9v?vXyrG(_vQRJgz1MzMwLthTF|f!FKud^x zb-Q#hQb-Rv)Q{VCV^JdkCaD32luV4&_PzT9ar78)d>2acKnjfkAW z3q}$Ftc*n<1$xp9J;_j)tc*p9AHm*4l7)-HVK|tk78!?1Hd+Y6$&(Fsq4ETPoeHX~ zCNG4pqAUtUrKB{yI=8t{L8UhJcJ=KHx%RHI`UlH9yyLMH@M%A4Zm7Vt=*4B&mKYsbp z^f~EM>3*r=$l=k?@0fmg)b0t1#74Mq`BP-I@y+DzUv-ffu@P@BF6+sFW(nh9rnME* zksOgzC_$@+`g)vbmLTS7x_h&2H9AMLdetWCtjF_=(aEmoDFwHmRi;J#FcZ!T>=96W z7N^9Trzq2kD)OEyBjmG{p1jBLv6siUrDJL8tjrRt`GfRh0~URczV9n9GsD>)1?c`j zYTt2SJA7ZPfw;!0GRKM|16qM`}dyi`eKc&dWDvzdV}w@@e0_S4TA<0x$R4 z=WpTl!1Vm(M_O{0VJ%q|Ok2TA+*S3y@2)nQ2+e9VIFGSe7w_^0_coHn@A$5?s87Fc z-17c=#lipDyD=8WOP2CFb4?pxi=Lo0C^5lgLIk%p{U= zr*?8qhiUjKNcf#DYS;_A@yNWnZN#i-)2{7N$&^>|;^q0ITrqiy$6)l8`o@@b8JRQr z3>OzCbQfdV#@&A#K%6vG8)W}gT`!oPbX;cYT6eA{+f zlv#fA60hlI?!f5TxyF>_kGRruS_&Tz%6|2T(Llj5Xw^7PqLVYkj&?wo9EFOlaZ9KZN# z%hZ2l9L?(<$w(K^hUmG~d0Nb?m!$CL5_5vmPyH6?d!t9c5ghF}j`V^Ulg}dgFeEg_ z0`W7hQUBN1REoY&T5h`enOBKr8)Kwu`)o=4d&D~sF>T0|cjl%>J))l($|Jl><*%|~ zg2IS^8Ejfx2;u$S`z!C*UcKmJ?`KBkQk9QB+zvAuD5168<$d7y)OB-w4N|aS=4Xb7 zAWMl%is&?iq-1=r1N%FSgPwN0?5WUiY?;8;y*?T}{K({z+3rt?Xtj_So6{L4>V-p@ z=TFLb{+<{olPcq)5A&~EVyQDFf5^-UsSoWNqjPGS%5cc^lpppYrILz9xr}d(K zeZfinqOKFmcq)5W>8Z(0oOP6G{q$K2#>th4v(O!xqFjb^Yf|IR@xfR*si1St^!Y_g zmw>2#qhbtK;B~cSt?%Bsp?qVNxDR>$>a+458C~RC4ryM`O1lT-xg!;*#Z~5|**7zG zd_Py(Ke{T9d9|2i?);Y-H4L|B%Og}5=fjA?-Llf$nwgXCJbX+?ou+t&YY}F!ZT0oR zdiXh$q;4-ZT@-G4`i%I;8kt)5P{IHDz6SnwfBg%dFJba{)}wS?-0X&hRy@=Z$$~oP z;8*4lTSz_M@FzoSl=--)#WK&{Ge7$$kxBCFz0UMf<#Q_GrgGQD>Ta`I1?cfgo(eS# z^}I2?Y8=)N2v1>y7r$*YpCQ8#X~dMKDSAe@b#M3aFzx=B%`0Ve# z-FD2meV>*+G>Oc+`Lve#k)5thTEQdyH8VrqS%YfK`3}yZQptfAJ)g>4t;2%bGS1+Y zc2kR9A!d{iUjqrm{TXIEtM2a;tYh#SkE{X;49B$U)g!w5!bgbA=;rslj~f=bNvQ?z z0#wksKV5Q8bD2F2FJCt+6e5+q!fdj&rvu)V)}G-UI;d7$*``Ohfrm5di*S4LJXa|C) z8p)X|lz2OlZVbzCx#ia0Lo<(CHFK(b6CUyMio0)aaXIRK#nhL`PSY;+dqKGllFs@v zs~r*_;B%+6+xdAc8P*>RnUCGR$sKX!+R;MaXQpSW-8H+XLX?(BQ(FeK&Fidm-jm5z z#j*+u?#8P3SB!1HiRq}0v~d15`76$QGM(2W*6b(E?W};oz6ld!q5ou|%1%D~SG%95 z@#4poaZ=K@yDhpF=pBg;IN{hRk)J-0(NZRDKL0WO_E7=+k*b`ydnF-a`9;n8XX)@8 zUmN|exEUWGF*Xix*d~Ksw|;R+ps>~Kn!&YQW92^xIJL`dG=Cve)k^m^|Ey6h>bxK) z>ty>>Q`?Qd*G3(6c|G$QbE9l^nR)HqQ;0rB^J*Z%9k*gnzoB&e8^(rOhMfr@@d)mf zx!kNchwiyrBkD+39}d7cdG$HGbcLVG?XkM2nDr^PiuJ5iWZ$=`Tk){iv?*?P9(`Sa z%^Rz8sIMb}xfRvr@pSL3bE{aLcy=IUs%~6OTH*U+iiG4}2l?&Mt6TD%Z{NEy9 z?(t7bItJsP6EHrFm1d47T-kpzO>e(L4H}M=scJ`}e6Gx_^L7|sC5-qD3tU>9^?2R& zSMs=DmEn7leHs3ZF-6)kmdgI+T65icGd6gK)lEj%a@ExR0a70R&7oB++*-F%z9Ty7 zZQLXNfs;R0zN8;S%yXD@n9c{EG&h5VGLV)_6-nhrBX~|FxbUpcwd@lvxqAPRnK04F zHi3V<#Tgr?OiDi3rxo6KII-iwde8f`oz>&|8-j&;X6lb~zNyIQ{gp~;cwaQR*A zEY@!lUn~DnMoWTDk<`u>H4@?02g8O^0-vAZV-7Dw1xP9k3B*aB3&~H6KLY(#wY*yE zh*hs+x8z8RIKKcn1P3y9ulKsV1>6*;cQ|LODG{d;ril3-%qgoiE9gBbMNG@rIeQEv z>NrL2C-X^YMZfP&Ix7PYssj`-VC|Zr{;KalD*WNo;BHfsX0NlV_k?es_ZNN2ho2TU zA<4$|5@#ZhEZy|^mW6;!@ZKn1=TzQ0r)*@GHe-M6ibZS+{tEv>=9>m$ zhjV_bd}Mo6(nwcX&J3B-HXrNbicP=paYhY&=&9(02)?IdGm#5P6bt_q=Bt_E zdCu`+$xWGImF%c=y$dLHWZ7_}AUP~{lyZX`18p3Suq?B?M8e436~XArv!t0GA6;E|ol~3Cz-xMVGKKWTB^H4%7IWabU?#juHEe9q4+HTv zyI!oOzC0kt-$3m(0?SNcGXC%2a z^oe99-+1`Ti`Aq}>Z=EeiN70J2xWVw$bES3 zGd#l!(wMPLwfZW3gs@sfa9zoO=jgY!az7s=58a4A+%6mn;L6njpJ}IBo*^)@ zN`_dQ!iL!1Ig~=A#D~?q_X^=-8zsR*wfh@23LYej^4|1SD>pyn#nj7&v4_cp|*`d%NB zPS9{p!$8Ablb#{L>v{;-_D$Wcq?VF;=%v%ZI^l!MT}(t~bGi z6L}<^9PVHL$;h4EU3?aID#O9QhCh9v`ZFD{O+j0(wiEz7bx8;YDhg%begl9#Taij% zlw6Pk+nJ87AMNKidbLZBlj(Y4RzK7&OoT%B5~ocY{v0HC!CgC;Qw8`6yiLL7WH-!L zWTGT%iG1BU=DfSKXm-D=+Sj;;qj%LGw0ubqpZ_f{>0fuLtI*|Up*!3CU;Ucerx4jq zx7aS$Onv9th;EQ~>`GyLw`(K^pGP}6MBfm;`JY~C6UtX6=-d**N-v|b)5^T;{GAUO z1`6C@nLNToN=%kgJ|O{N%scpqtWf9n7?-dO3C)u`wMC^t($9P67bWnvL3zA;atyAn?$_5<&!u4)O2wB55wO+*GPnZp|#h4G{)RZ4yQ z9x7xg{Ashh-)V)<{Q0bZjaOXsokd6m3_i2dl@~HzdJgt6y;u|9pO1s^V_>{!$USF- z9@Y9diBJ|b7dn^Ey5^|IrzbgSGnkA9qKfRbo{cZK^|5hxx-JA!T19$N;36`*%yoS} z?`xL2%LNG9qe!#on##Ag_*$c5Y-*ODNgC< zu5+lPn-4ytVn1~Pq3-Z2qTK&v;jSv+=~Dqp1bb~2c=is6?0i$0iD*|rme07Ine0mL zT-eDn8_4i+oZ;#HP$;=5VO!Py4}LD7m^Um`W)} zb6-?P0+(~>XIC7(K8$@%o2onAgz{MdtjBmN3)Pqbi`9h_C4jZ`yCi~3fFL9~76%zj zJ2he~iG``2g#u_$84sv;UezSxG-yx=al@N;wmv)xq3(Vx?RDnH+1V>iQAC@3&DqrW zFCnjUw&HwiSAqrE^e;<45-fgoM->Bd*?p`&g0*O#XQ6;nw5LJAa8*~A=6**F3ZP4b zv!S8u|D@MUMizow`d_{NhC|z*Ymtnf;_wTwy1UsYy1P4$N&k`kQ2wFt&pEZuB_VDG zjxO4<|2*Xr12uhdXNzA0>$7&Z)SkMLMD-wNzF}~@{-^7zkC*B3vZDPJ9+G>4*zD*nVl+0Mr>IO|)YW>DkZ zg^B?#IU-b*lUo@B$`AkzN&!PDprIa0@%iYjc&&19vuRXZXGG9 zqY(i|3W_?qyL+Uxq<|t02?0?@sGz7LR6tZf3=F>Se(!(q9LMu)$9-Sd=X0K)lwqa> z=Oo&%68iYbOSC#IeGSZ8c^$@5GrM44UxbulQ~k`a`1yiv#JC*<{WmJ7A>R4m-vfDe zZ{G`d(8}^efROnCb58Kt3q*O*fRP4vggmB~SK)TTu1g%VWQ(|^@=&8-l)NwbYin^) zExo*TICglubvu#&xHU+}Dnl1mR1r6OEEhDh1GhGoGhsmE=H%1yBa~l@C%={($j8Qd z45M3>&Ze>auflR;Ib_A!tITZ6_|d=HLjNiXIkRhOp1f-KY+!ePO;}LWi+_#nd~K}Z z82>lee*^boajg==zd0dGpK@yL&Zk_mo-QcOx`99v*ci^c= zSHQDZcfj)VHC_?MCA0qT%RHKIlC5$(k4;k$?r3Ja8v#D(9KI2s6UCW@e33!VB+eoi zKc7^xFv5DCUY(;}Xe!~8oa$BcjnUnAQR-5Y9W<@H;$JO098A3yO z684gTU)Jnme_F6=IAKUY4om{GK&G?j!iKKvRV*!J&nJ@bGoTQe=4Bn6Ax$9}o?v9_$HJgMT6vY{WcSdqfw>4@=3BDXhSnD8)E z*=okdQRstAE=E<74q;HBi)^%&^&UPsVe6KL652 z<)sLVN94`Ls8-$oBs2LMRjxmLh5_}UOnjA>1$-Ufpw3llk9a28`PwKaE~ctTH=u7- zbk5BBDOv8!nA~9ZX(7DAU#!7NH~7kxI9pF3rExkHJ8jc?g6j$K*gxly4ERNYn&IB| z!+2&%f$Xv@Wd~^C)4lQx&=8U{v?I*hcmmrq{U}7K{?6;&7>mjPf#@90Uy|L?^^xa0 z9}BwXo?F7Dq_eYj_N2RI6klu6O^-dMp>((MsrHw#W#_SMu{PB*lF~L$hBf7xHy@<= zq$7JjxpMC6X0+~6#-<#!1r(H9No-?~K0fR46LpS<3tlj+kM%9XJO*)#C!h3Cqo2L- zA>tx?A%x9JOkw7c)R;%a*}C$-YJF28c7697!pqO}EGypPdk_c-aqTRG3d*i@mA9uO zO|YGoa6}X76+WGU!PDC0%Rin9pVfwphlmH}sG#sTMJ$+G6=Ip@0Tz1s)90dx;H^?nVu;}U&gZ&Oy;4#`y~-|rBRDfeM?10Q20YXv98nc-9He-aTULCcqL z>M&*hOym2ggrg@R77C~M`m;1u%0GMwJIh_mtkO8ZwH@sYvTPvVD5 zkDs&*-8t;C34GJYZsn&{gJSQB$5()$+{6-@{cMyv#t7=}lb*TBio&>W3XT)EWfWb%~rS3~-#eEn( zy!10@1VDw8#~(eCP4ou7HMnLPL$p#BPRXA-7n3<5u%crnmGPTzg_WMsA{c!YHTSkk8HRpo+)zl=ueKjAF>{dJh`;g=%G>%#qn zvVo`m5+YaD0xWcX$rxx2=4M|t&#y&km{BuD`;BrnOpC3i5H0+=Fh?GB-LAUL$A41*G1DMa*dm5o`o}Z<`oHQ_#OL> znTI^9eMTJnP1_Ei4pYuGHT2OsOLT_D6Rjjt*y+}rbRbl2sntlMu2JwsBmP@L6yNuRSh za!;SN-09#oFdDgWN>3n$uj;zTBos?(8ZYJyIogF5ar&ukN0<;=)`HJ_`oo`=9=XKt z=IpJQAU1W{8ceV9*mWlqx_d9N$nJB+23hg^?Ilhs_9#oG;u8dl@wQqKmWw`BPYU=? zmK#Wa;1My+uFsxlxhYFHKlTJJlnBPo2<)=N{F&+1`u9QP?bS+YV)N^1?8ETE*19UK zttJ6mt}|Ch-*ZLcKuj==QoV3r@-^Gd4@^T3#q=vy%C|J(44d<0>|M$X8a}8llpYp7Y4$V zAOdRUtCx#%{B4xkjv>8G&mWL5HZdZ&CNu4`;@#ty_}q%D?nD^VEeZmK~3eh+sAK7(AU@1M8S&{K&soo*6-_qg2# z{X~`$7D*X{jDI2s z;{%rhFtXMtKoscF>Eu-;^4vaF|H|E3YGd|=OPN2|MU1cU1huhEn^@@JH(ki$7g+2% zD_>_({7<2tTw>~p`DVIOW!xtCa{26k%jr?)A1HL-YDE0quvZ3@zXkMsdv}J7l}0(I zVJ^4lI(Wc7bZ61=3{9O!tzrlO0IS%)GXJJIZjOaD~RuV;0YGs zrs;?l(?{XT9J+lW;su3gLlcspVpU`-9`1YWy1ox?SGmyu$x_v#kAMcAp zkwVw~NIo%P+GMy|-~!&T#az;IUuwU^;uW7m;3LH+-z5L01ygW#H~s8)$v}@evgiU{^XQATp*PA82xO~Xeq+I%*T$5Upn#HXlUQ)lM7 zBn_`FlhqVYN~GY9dfXFHJWgt2Ae3!2@$!znb3K_@s49GjK}+WYtxbNlX<@f{qU!NC z`QFP)^IW+Qq#h{6ey%^gDKKfBm>Teit;fPq4i%BKE&kC0UMUUJx|QPmg6&lU?5eCv zbbs(!T2d1Z#ELSpWxhd`IIS%!-WkcM(jz{t$@*WTwUcZ*^`oqx?A0QjsQN>s0_XW8 zx>@R0N**fl#xldsoi6gtSLO(IT?SZaHTzl`3OUT)-;jpIUfY`b`AcB&ZWJFw0WPOV9wH=)>NUK0IYa#l?C2s7#(gC@0@}Fz5=UyEJp_&+v;nN zL;-D!$#rG06{(o#0YrwcW__F7xDtoSaB$mJHr64(x}qYPZm=^`C^nV;XxxqAUSXyS zes)3IYVaPE!>lcQ3(4GInm1psYsEQ27R@w!KPgtin%6hibTM2K4%eP=7rvkB~YnFUU57$oe*ZP2CHi^e1E0z#jm8n=iDn4Q9~+F3stznOX^EO zhHg8WV2Ovf%Cy%DR{esL;6;^3db_gO*$pOn07z9MRFW2wh)c;MXoRlB`|lugsiF^G z6yY#H)}~Z0xu8>vKmO$4rpgGCJVN>}G7&Btzq&w@Tq(|Klm0vGI#kFf?JIn$FcCon zSSSF4IpzrhPIz-7CC}&MATmI45|QMolc)dTf_z|!R72ukzO_~nY;hqsX)%4+IsJog zRi<2F1^~3F#^liEA{>Zu94SzV*#`;LRMU%J&Y1vI>7 zy7J2HiliKoc>wdIh>%OroZZog{Rwlt0+u0wP!z8R<2>&lmQ|vJAMn(NjC0B)upQB` z&w8`Zt~j3(#!CQY6+|#XbPG-=C>@aT=*TITkm9nhrEzMTJ9@8=qWP6fTb}8 zB~fA^OeUe( z6nOWe>+>NalCa0F8FLwhQCf}HT|ljaFf<*)o!^onSh(GaR9k^v5o~att+@kks0qFz zC+>Vf4kK4 zwWfWA(nLd`X%o9yWc&4oihfIBq(}5TmZEx~0%^MisTA&Vsu_eAab&f>$8dyi7#C}R z33sc(Hd(P-MeiNDCjf;DgCY!A*H@PyXk#xWUlghk%=QWnXEi=;-}N;iK9WVs<#qE{ zqbpM9V6x&D5hN(vI@TG=b)&#qT^`vY>vAFsmsMpIlV+78^w*7e9a%uRSd1>JaJRUy!vhM`h&$a(E@Vte9TYk_?A7!_3@H5tr|CM+v^u34177{pmW#RgWdN3y24l_lQ6*k)bQ%+oi<HBc$DUn;hK^$Krb*T&eD=;IEe=I-xk!brW%O@Vc>lwq6QASj8AQNt088}-Mt`t+ z71k+AT*;-oCz8E7D53})l!{YWyVo!_0GTL>c9R|}TTD`@W`T#7jxQNcUpd+`eiiYA@)$$(i1jO5&Po_uJ*`bzX| z`(XQO*T-*t%&c=rVfF{kdVip~0U@;!ER8SFGW^%%{G}podSD>hP*M+e*NCTjf#iWV}7Pz}8T+%qxmg_NTr7-`Ex6!tAj@J4--3EgaNGULZf z>e~-0FW2v#6S&Hm*3q}+<6o+T2zkVU1^1Tg>Itzm^cP$7a$Ntdri$`kKxLhRMY)u< zv+hyf_|?oL>R+~B;>niMPdyAGJ+BCan zF-(9oDzA{?!ufoysHC%PdL$y1c4F~JPS3y(-tBN7*|W$dJPNa=W}C>Dmi>fPD8OX! zQ0srt;wNp!$Y8IcB0ZPk@XrBXs~_zZt;VyB%*V^#s2Ml+m1}rq84O2o^knxMU#e4w zvyqYWNiYnZEMw3!R9RI-dG@rW9j(1K{@SivuPbq3CQ@8ri6ohk12=UQyD-7yv5Z2h zOL{%Iex6s*F9{IX2MJO@0_4|;`7dPjR3h!lzguw4o^!FZeJfZ!QQYy`sr}yC=voO= zns^%LnHNh7R8a@cVZH-Sc>c|&bdy8?3_U|<$R|$sRBqodcfGzgN?UcmZxIijn|dRe ztvJ4{MZSjFf;~mJ8SDhtSo^ala@>nLTe`;*OZFu}%xUt~D)9a#SiM!>T*3W-q zHF%_^YQ}9v)UxLf`A%Nu6oVI4M+PIQU>ZuE7+V3Xu74B}HD`-|8EW!xcUf2< zi@l#u?Nrd)mpTTUYkEO+6`77J>742OuTfC#=q@V4l}SBETkD zbo=X=TI?U!R_>uu5yQON)O*^i{jHsG+@$3Rq7U%$x!Z{rcnbZ774w2EyD- zwh(=^Ds&?etVsusli|3x`>szZd?l&6r+@L*rbkzsFOWR;gpT~WKnnw$=;p9x%er(?1VVyZ>C+<)}CQp(OEJOIuN%a&@E{#)JbcS-kp>KA=l8f7&m) z1Ba=rD={-GsViq>s!N!jJB96&xP{~kfP;O{DE8m{i+SPMA zPbssnr+09qvt6lW=)n-f&qjSX+5c#E?(xLPoq5{A+05~$83T)}?Jw5Wlm-Ty*3@+w zwRY(w6&3IV7^kYd@pSh<38z9=mj$yZXlR%LisfhtCLQ-Az>|g}LtwTj)r*TXP|_Wj zXUdrm%{!|sE(j)p9+xYMs`*Qr1lt^6;!`h`&$u2ruKJ-Z?ofYsuT)(|pRwzhC$IaM zGXbY=WKhs~Z!H||^Mm$PH!m<@xq~KwG?lm6%+N3$S&W>|q>Vsv!hl?az>}m9$F7_Y z5f#0@k(;}3u0^Qmln()~xqoU04qaRS5LfM;2t#wHpPz@3ffqo16Y^8Gs);d~^S=N^ z0B{#xZ^+Rk@{`urn=%4aE&>Y^pm(pkgWisH^eRsWX+)oJ{uR1nwP~8g!E(|)_;s$voQUMm9*|8T;p#~`% z3~ZguQZjRtelhHg@!a{ze`;QGizV1|TJomlHs`1PTg5L(nw?|4EFUM^kj6j-O`_Ae zQxZV{29IY0@cU0MtglJd7=ld+Jifpd#*(N`z)?AbG?vFN1svak!}RGGD|c!W$?-f} zi$k*pCam>+f(LVpeW_Qbak2K>WH@Wi2t{`zO@GQHDKL>X>4uO{L>Zyg^;hhW8sz|< z=~St2qDuzG#Re%4rA@GD>g<~oo`~yKL5zz_n%G1J!PxQ>t?B6ImcTpTp{YZ^TB<9C z!-LlWXO2ISuux4R!1-T3Bko^q^l@GsiIyDNiZE-=2sJ-gT%ve-}|b|6kuLwo%A40u%}*nwiv|{J12c zxipHO=w+q$96?PL^LsAp!Xtni`pbCwjMWXY(TR+O@v#kaon+%z^TpQwH3^4lD37&7 zD2zY7_r;~Gk;n(jL!F;Drf*YCI&fSIs2hzRE>zp&lObA+=Ytf6Uyq$g`yl`@Iq#6D zVA(CQ@okQmY7=k}a+byS#AGcMvHsp$yBqpXw8B1i%@28l z!=!D#bjREFSH53P++ZoF(6cKX?7^F8Gi)s&2#lQQa#S9$U7w@@P$@3e33CI>Ile>$!oR=c175?OWM&MxWH*|F4c6^0T% zK=@GTfyR)kme=L*?0d|C=8T)%Nf4c7r9I)1FbOw{YBE%Nyx#4O2LY0JHwA0JPZ9zW z3xBF0OM3@lK%ziIs%C!{45o~NBC8bzgD04(3fEabs;Wp{NvKV5N9%8NG9@mh=RQqU zFS?61Neqd5ZTZ4-9HobJ(HqB%3SX%g=%Ii#hp8Nrs->%cDJ-V4bx>Od6LilS6{j~2 z!!T&W*>o{pfQs61Du&AvWeqEg;71mvC=|sZFW*bLohMP08>97T#z!^`o%AtoS1V{a zRoHi-+3W2Gru$qx?QaXmxl0-8=hi%?FX~lkC=84Oj0fX-5*UmO5FAGapcDWW#RXo` z2cVYJTLQmM06>q%j!ajBu*y=--E5nS=4?v{dJbSG3H~rL3hsIy3e4M^1w@qF5NAx( z!$0|xpj_4QQpT|Y+2_EHy<;4_M|@#^5QoMo1xB@RYo|Y4uVHW`=6T5+y05p$gTf+27us zkm2H|$B)h-*&w%89_MheF69_C7wB8S!-VOQmj37y!TxwK z2Q#f7IUde4mOO3d>|rq!(#|Ac*5O)(w!hRABUQO5Ar|;tM`OWQP1QAkO^2|EEDr?= zwyA{-IvpFz8=5a^dDVP>?0EPh7{DoB#}E>lMb?3QDKPtueF%Hcw8Qh?c~@0IU>1Gg zKC`V^eDgs<@1cWK#KdJc-6lkmBq``!kN-_af;gMo1craqJdr~l#wAPy3|8K7HD#=! zxbwB3Fc340)&O&&!{lNuoWWq(Xc`rqXH_u2D*+RTX&u;EC+vAyUlz&r*tBPTrtiV;ct{8MpQN@ zr?Sx8R&Xzw#ZeC#2vfHNQ!?00cBKv)&H&ebDA>n?;kKAWgfIa7W>o=dErn#{%N{*H zJmC3RC0>Xbkn|jxF*(kXvU(?dM|@qW(84FD92Tn1U^_zqI)Ky<#`;btu;F^2S;phZ z>Qq5L9%7=fA`v7_QO*S8PIEI%e4P6M;Jqd?{@IEud%Y!F@_y2PwmzW}kMS~;^mdqj z=%8Z&{8nOM`BJL2(XoHlMuRXd!#K|CtmVE3t?8m+GlsFvr!qTO!?A4S)rRt!flw+W z8I2v?$sR|i;-F9%05-A*;wP;@oD?e5^WWDymNkBQsM2Qo=HjaeMzGeSoF(mpS!4nfK+TB7Q%=8UT5V)to{)Z&l7Ew> zaGgl7FDn$R^3({*o=-+((_u2QbBhG>n+&e?-jYSKf5of4d3PWF_C0{5J!lnkY38$` z?{s6vys}#6%citZ6|E=MRvpwMw`&b~uiUA&C@=fK%>fKCT^t00TJ{sn1^UTJbr%fAb z0a!qgQ%AMC1Ox1KrUU^mQt=fzchu;$2w5+Tr~Er}QOEEwWzN&K{~q1Mp~+Ke@>l9T zG+!zTYzArqP-!W2)jkA|hbBh3wGq?`dmP9O#tjG8MJ=IlBIvUbz9u(U_d`|z(9kmCx{SUWmwC74O=zL=RjU9 zP*S*kGF$RVSfdYT#UdYfRQ$cNE7e*TdjUQ{EJw}(n(Q@Be)rtD= z50%-B$$uYVE@&b|!M1N*JSJUL{`7GL7bf3`L>1bDb6p{txXT;|ZUTW0CEKbFv6fIg zT%lRQYl)u-1IW>*&-VhF`;x^3pn&I8I85$y3Pfck_ZQS}0-x5Me=!`wFLf*J?#e~3 zVs-b8G{FY>6aR~~rFufn+^S?J;{@>STQf=Kp%%`w<3rmi*TmOP3)7Ti(r;4B{T|a+aet(!RW%>+2r>cS2j z1&U|Kfs*!1r1r1ZO{T141dT`;#Z;%l9=BXmq|41O znz?w4=| zE%110kfDfhh!`!Vw?Fp#G^E&3NrdD}$=4DloCq~b!$0%H{O2tkYN6%N#EAh(|AmRq zO;kP4XZyM6cjm{J!3glB?S$Sj#)nE5(j7FNKRuZS?m5$X|_F8LGP?Nr~ z0u^IM-9B)K!En7$4De*6*Ytz{G0OLCsPu)9J%8>3PcHW5r8BZx5M4ZomjJe;gTIgG z6a2f{xg$(kq}BqY7{TjLf)=M{@)EV{CX2dXGCPc_10xrD-*~e z=WLIyGL=Aeu_GI00*H$Mo{9n6IP%n^TNb8#;!{j^)J0mx1#C96D6C(Yo*!+QW zaxaszPTf0+XSz4zk=lD|RH1a(J;BMCQMrk0;4^ZEo64WA%G#Kd>cJDqMFO=y*d{E> zlkY~{kU{wUPJi3mheClE(h!x`mUsJ-2eNd|sw!)3$-s%4@*Dg%_M-2|wpRk#*uLTI z>_>?TUP|-1I##aEVYh&l))ik`l1z5Z4|OeaL#Xp0S+l z6vW-CebvcCtCqhcV@QmaBtxGi1WsHMA2%W#kx{sO;KE&v3huxrl+%y>MxJ()M?&|S z$WU1VRGQSonGazj+rj8qTKR1QLKGh%_^_3)=n`T5#rWxo@!ZXk2mH!ng>06{yFF7U zRaHLmjCp&>0hIfo)^9~HG9Sf>UTN9k7&_C+%fG@%{5xA^K1Ap-Kn$X4l z?VC*d3y$u9Na4VP@*p&D22P%Gi@(h{NqclYq>$$FwDI2Y>IdK1p=(k)1vhUFCrw*W zjdjWL`@-=@e17rz7Uo#SIY?IV!o`;$X(q65|04rxi`eVx#-%=$d(Goj6P4pKoQ#AB z4)i#YOQLxA)F2NszK0tV%}R!_(6K^Qw{Ib!_wRx#iQd^|kHl!8Z)rixtZbEdWTpRD ziu&XCf1Z8plV|z`wsn1E^r3-}2#<|#uAFP5-0j^s8q*A!N%$`Azy&fr$p^F9&}{d> zF|1Qq9Mq6D`yqaciFo_d=+s#7oLy$8NdBodjZ-2tQ`KIFGn{Nyv7_*|Pw zWGQr|GD3Ewuc%XNA0>pl72*zo;GtDfrz_A9WfPiY`V+{0`X}4C2YPTV#=ep`KbW!d z6ZtYp2_fLDuW9Mh_qQlHj%~zkg_5O$VT{NKv?Vz5_1&%$6%lZezgs>Z$f<@p{s}xa za=Hir2l3ug@v7=I8lS@pX#%vm=#jO%_y1-m-xt2pCBk(vo>dmv*$Xd-seZPIzgDgX zFmUuP*Bo!2f>y@^G)rELd)4wO3R48@e_e=3CAJ|sHdqw0i0HN&pT)AO!M~v*p#L^N zieU1oi!+yR6bJeGyE3!utstnz=Zcp3(7g2PYRdI?K01gmzYVs%ML?%UUj96xzOEtozY;aqWPknmu>Yg7)SD84pn&xuyzV{RjPrX5%ImPbb{plHNHr{4$efhUz_=M6Y5=2;puo2~*|;mM6iXA2YK?OdSroU4wGo7uf$C`3ll^=Gyjl zE(;XRRfo?Jef=)95mCq)erD|Qg)1k+yImJ}Ee>1iNYxQ3 zFDy7eHJ%Y#F8khw$;u-_#?Q7k|1p=+URf+ zwt{sx&dtL1%HJD@*xf}=`9DXM$KWD`yR5;F@9iXx=n4Pnuo4ms8O`c!TWn~Do9H8# z7OUGv|9-kxlVg>znjlc&oqJr)KJxTww=%+k+~}rzuKX8JIBoH3>3Pe1x~vM?hg=P+s*`)7C_G*eJc8efSzbWsU@eb@Vs8B%c2c|QB1 z#7LdwHLFQ@$t%OWgMGhg z*X4A4bc9vctPz+ls0vXuMF~5L7zBUhZht4^c*H1tTp^y1E*?F%p-jK=gD{tB^H9bV; zG!);D-9TPW*eSCxaaGyT5`sk z9~N%EPAb9}FW-eP`%4ui&2FG=Z|3D*IxGzS7#etV~Pfz48{h5SIz&;4Z zd5M5xH`qRB!Z+wC-`Tyh%%7&y9eUc!iIt7!@UF*Uo*=;4)lL0UHzFZmS_t&MUH|karDx5&} zRm|+^U&zdwFf<=aI2r|=uSEVnRtdbuzF{c_8~~1H*RZz{hC(U2e%f3`^U81jgha0Q zdPZJs$xhJll%>hUR7zj8iksm)qtiRdse{1-q3lR1sHsMlv)Sskc>qg>;W!)Q5}3@4 z3n)Ov`s@BV9%ozgDTRe?K(0YjfU2P^HowHU$2}ls_tadIsYt>LC@*=28NGgGWPm7CCObH#w_6#fkpp0@J~mTpqn_uiNV>`rq)F zOlw+dZSedv>^FnQzZ$~tl^a0}jR0$?efp=BOC*l>lt$(MG8&kybpP)awhT-oC!pRY=3-1&M(1Wwh}}j6@%@|i`K8&MI7yr z@Q-HLSThK3L4uM0fc#jd;QJ1#-C~V;)&3rNX6`ESOKu~4h>L8+m!;h0q|6-ezYnF$ z@gr)_>CjX!2`E(8aG9YT%U?w!!7BDAC0iDKOgiT^Vk8@+_;5N3BQYYojjBtE0ja9} z&is9v=iR+xY<>1Q>+_!xKMZDi;dmp}Z)!<>Z zsab(n){mb99RD)hN5)00p<2 z`)8YwpxKx4qmo6x+N&(u`>^Jq__Fj9gWlLhsj-LiTMSIsma=XCg&~Ist}PzywB>~4 zRIT+S1nI-9MIl7-f9w6CX`O%5J0S?{+jo{^PrSR7Io*p*&3PSE5XNm1XJ4kG<;3kj zsL;f37%PDI^(FPEv-jEkuvQ!JNdjB4HV5m4;lh2@gN))1vCFNok{e*pNravX_+>Vy zV$Yu6i}@OyMedUfTfdxU4-JAH#2`ZzpD7pqPNDH-{ff^a*HdURo8`k+=R-%M7rH|z z4)>QH{i-UNRpnKLa{`L=w^`TO1Z~d+o9)c@+NGLHu;up zeS)e@jlj}y5EGxdt^W9Bf`*2Vxd~6vt`0$zPK7y4)SVnY>XDQMU9t&6-9E*~gX-X3 z9aBOl87a~E<1G4jD^^cTRUPTN6CHQuz|V6}tM1t~NkENBz-7sbTq_5C)lDAiOmEDf zh^0vMDN8Vrcji`hXF4kM>UfxBl#HxeMSkQHKX@UD;xei zUCZXGGt7QYvER`PA+-qRKMi(J(O<46lcQgKeB}1uep#uwEn!*WaJJdBj5-Ey>=Rzs zDLBdkLf(wz`Nh{wYed~N3NF9w%#HY3TPPbJi2fWtn#5q7Z6zeF$ry&|V@e^|O9Nd+ z4==o&wz~cxZrgs+@R&Tg9&`F%_m{s1?_RS?Cf-u{eL;U}`1AqoP|ipUoNot#ST!7r zZzPEQ`p`X*X7KSO{p(Ntqz!QSx$b-F3lMAI=K1R8F`tkbuO1pH2WzSPB1Ed-dgm3c zZOC;6ZwaL>GJ~NvoX?N`3C(i`SS4?c@tirZuwq!X*r^VfZ&o$Spr@Q14{lwWEsPMA zJ@=mOS4Rhe&Vj63~L4eML^DtecR8z7C;DpS0a<=;OrFflQ49KvT?^$A( zJA}zPp0kF4wTIcbOQW34d_M82FNw!kF<(|IGC_Pm$a-^f>s-}LOonS+T{GiqjrN@{ z6-_-tYtW6xz$bN&%&u=L1@g1&O8Mf#6 zfY4ad>PwawDASTwY6N*E(Dam0qo$KKC(2yfodb)z$t0 z&LHU<(HYz&0;NB= zbbg?r=Ul25MNZ6o?O-mREhc}4HA#zQZmY z&FDU$dD|ZFxXoO8A(_!sBBvGTo94)6T$Eh(-5{?XJSB}-GLpA;VBd~Tf5((g@X0#) z55r-6CG!i5ve$Ov7@tAzkh`mm-@MQKs^1mZ`NJE@<0rYLaao_~ zAja49WHb4XVykS$^x7i*m`va7El>}rGF%OW|++~AE{!WBe9+h zSX`;~p>XZ8fqq9<<|}-gPB~w$aXb!zVXFD1>!jv#f3}5Y6qL=ErHpBXGzX@_1w+)1 ztJ~vz)$ho%K4M)`)%ksZ%akhoYF@$jGUW@r669DN=~nkOu&#JH`YX))Rz%~|>3|o3 z&CSQg;?AOh0i-%y;MRdXXL^1EJ?}04G6oCZvGPB1%`y`#T;IwRm}xrpmN8|*oh&v5 z?x=kWK#uH)I?rYQb0OWCMc`suFP2!a|IQeXv3z01dYEW-rzi|!}zlIaMhb~2h4cc%QU#kIpqrR)^or4Ue*VkUu6wMI3!rZrH-Mc z?X`0wx7L^2_|pguN5Bj0r9++eb)C*VVjE$RyAjt>u3C<0D}4T&pe3Oz=4_~*R^PzV zH16&!qEl=o-4LZ0|7!tcW8MBPu-M9)JF&cWj}9u(#%H&6tlUWti}?JvgFYudokbSK;Au(l6^ zKH|N$9SwCEYD_&&q)**udU$pLsjEg6HhSlJ~m6eMt zbNmP3JFiXQ*B8@o3Jo>3a|m=4?~w<%uXX1R4aiuOiq5hB3DnXOV%JY{NvgM1m9u+| z%Hf#HI302E4XK6FFsSqg>ZVZ9Djnpub;l|&3-hNwWF(h|6<&8Od>c_&e{X1St|}+? zjN@F#pTkaZHAu)X<;d6t9Nf4Jcd3Hixl@VYcRwK>NOUy;ohaYVTKR#6tWm2B?<;~2 zzP63*E8LGfV*T+0{hz>~o=!p!UU%5KL(k)S+KzgPujOIlSaqv%IA0axF2q}&&geA^ ze;aCto&TbK*I46$jX%RqQE`wZPY4)&AFOp2hG_o{Rg(8RTyawp@Awye_5Hm{wWHya zm!2qF3bSYOL1DA<)r7HM9L*c0d~IP@?~UlwO7Sfml@*tcKd~#8N66fYZ~k*!L`W#?>#Vox0~ zSGPCY{C5^J-r7%?OHD3nte#!TAAGrw?C%7dI`%h)%(cXG{e~43LKVIH#axdbi!7<$ z>*0N5JKrJ8GxPT`brFQML_GN$L_LJXBsx9GezG#ExSIWBa(@2tT0}V|FT_z{DI0#q z`DXSgTgCkB+AM2ryi3uK_NMCDZy|H58HO?porCx>lnDl$1r$L50DJ=pfEa-k^4Y}y z2TZ1CWM*aOoR!Nh$W>HIRV*y8sI00k%&(!;=gBqIHQcIfX-#bE=xctMl)YbK^8TpLOwVn4= zrSY%t3tvC^mh}A~SvGTdV*KUjUtoma9p&?SJYSgQO{31%K1^k0xjzF{q#IoM=pyBL z1oxTD!{qTuLM8kLGRnkqUn0nWWyhCU0FsXfSK z^Dj$(*ORiGZEaSpys~t`u|GH`IjZC3?aI;^&Pz|d&h=zH-Eb5tRCG5x`N!THnz|Uu z$^+vYx&D}s_tppq#8uM+UVVEZZ76K*Zr2+h-*_e&Gbw?9!N=tt_3=EwR5rhg)~N__ z_ic~z>;7*3adwB>k5$ZcpV*!X3pVafTPwZivFLS$ht*#=N;`Vvt)Y@6qKC4NL7*EF zBAo<}!)~Tpiv$k5xqHQPHHbfx1T1BbSt4&<;JD-evvZ>P4EdVkzwd)_;ADCpslQf}JVP0d5ucz0Fx9;*r_sJZj43&YMyj#DI2+0)XT)w!mLA4Rf2QzyV2d=Pq^SvWfB z+GGw}Poep0@@DwiIUF8th^v&Rc&Rxa_B|~nmbL|`D9uyWl<#)w=CdA%L^PM@d5=6U zlNL`2@WY)6bi^uVQzgW`+_gV=M7K)>S;~!SH&)-1?ZInPWP9plogzslwLbREJCASaP389YbKr*E14k{G#rfmip6>UggD3 z%(D~cy#aRzn;BU0z&C&NmR(ke&QQEU=I{%xhFdNRU$A)a``>DxQqgy=2_aQ!xVDQK zLHwnLhgkE;n;5J{X3R$WcuPa1iX)1#mP~@?poBuEgvBa8DV=tp z;NxEMlP2ZP#Kd2+T!zIL_pT4e&sSw|uV;?=&*{^&U9oMdhFl$TFZp9!I+ld#=Q}4k=B^xB>CS|B`vYF`5V_Q1ovRBmwY~iNdh&W-QF3|7A!6^ z`UyrHRL*&k<$v2^u+=o_eqn|$t066*O!|-{ktWzjQeWw-kd|=Uly}Tca2X7mr5W!?3_hUD7mv5qdPovgoLcxIQNUITK96lZEu)J|9t`eKdR39uc<%K!)E~; zdUV4^HzTDP-Hn2jqf@1%kug9h z6QA?Ep9hf6?cwU%?%|5V$Cj7bn8C*ljFeH~ymPAQ(lD;*?*bP2z4kXo@0zuq4^3Zk zJIVI>#%I5K-9f{q?uSj1$fs-(2m1Ng=XURzpB}q8C$j}@9Mb7mud3-o;Z5>Mf>UMd z>#TZ_H{@j)WsRUqs^BYHZ(KqCpuwLWFewv5vm;VzSl2;*VE$6}{rH`W#TjIug^zH$ zKyK5+#{^b7ICM3{tNWRF|7wR_7|WUw;Q5vl502>zKsRL6d$Tz)LGhx&BanpSfroY? z($BajGCIE-ew+?M&8|#C;J6&b7M{~ZJB@Z3Fk zLUK0yME#Y}j(Q1C4i1zt3jt)BW%7=qSr}2@!drQ? zc*kiGq_bukpk;&KFN3b9dsUl?M^G6;t0?H)ds%UaPrWZa4L= z7YP5H`>`;SK}UB&#$Ve{Ys=aEzaMO|S!C=dr4(}(R%xvR9_#WEQ$F^~#+A#74aDI%`KaC6*`^l#wmT5<0R?K_t68+Gy0kMqNYOv zy+N>u^2K5HhFSl>ORlrO!woPhy>wmF1-6D}M5xHgCiLp1b2d$fTd0$Ift+hj1P|+d zHKU)e)R`4ict&iY5?bO)KR8}Pc*4_;5?*iw6*w4oJ#JcKr#f<{$)Yo=Z!FlT?4q8^ z?*Fru^DnQFW2OmOsYcmnu>_uh)WN3M@t!%x1 zM)0~))^`S7*daiIZnCTM8gX%eW^g7>AZ1VO7t3uqqr@FcLf_yW zd9SAmB6t;7OA!CWm);~tK3G;i=vPV>33ny?x83>G{hr+MB^e3)$(;TO26zy4n3~z^ z_0Xk9N{*K<{Ntro=HElTOGOxmxD$BQ%HnhUI9k|qd6U%~U7A+kDtok-#mPGD zZ&|_npRvv@5!>_G#(v(sstxUQ;XVZuaMnmVVH%}kGgbbywTrmLQLKDEmWhE*`Jk7d z(|x2c(pY{f%BjOfhE17@1=r&qD^QpaW z#p2^x`6SeMXoF+EJ>u1q+_ZstUxHKxi>TWpee>;Utq_CT^lES_03A@D*VN{Ct*dEQ zX`f{N3-O~)}@#iyT)Ila`2`r-74vtK0|5Qgx{RTyZmUymq z`Zv&(xPsB^qOpXshawuA-3AK6E25X|lmsPKokv#gEvuQERON#6=hwK}o<-#E=Yle} zWh>vQj~${?TujeSWt3dVVBpM$iE;;<8u17+PZD@@5J&y|*PFs11NvlJcZK0|^^19g z>xRB(+-E0&o>I>?9jv9c`44J}Ub$Znu4Njt;(X$im~dHtyB|9x$&J=*JYEdM@8U^& zM>8IIyFmu29Dm;$YM*_5Jo4C5ncINMACseEI+w)CP57PXB@my+ek0hQwAZwiZ zEpwKWgbkCV6FJe(fKAmm$<@J%aP9}ul(asbIaON96Zi~c@k>M<-uU2h?|TN*BgGeO z9GoN!b=QrmHrp7$I(29bkv=e*6tG>)7Fx7yDn}}oCRT}RC zted(?@+~B6y(lP^1O-8HqYqGJyL3IXfMDSyV`p9)dxaQN{NEcO&2Gd6GgZlP@RdGV zt%rd9 zGVpfp&@u zk!}nMtpx_hAQF`5&U)Dk3F{j^1t;~+2S8p+}yIXdn3}!>XPXDs*MV4)2?noTjMl^Fk z!>&?6Q&JH*8L84$ALSkGgBP%Ficb(JBETxFaznMU-|Ob%jIeqhL<4OVURj^{t$}1m z{>}6m!kJa9#jBddtP686oW$ z1`i}=6SEtY*?%}NsM0#fJqQxOTYdt>Ubz@#c80$fcH4P$SN~5#0jBiZUf!qQ@UK!? zb`~OI%WM*^;1_Yq93(0NqKfWP0-Sc)I$rs2jKh%nC79r?4%RF zS-|Y6X2?pNulj@7NrsJ4TBjQ+vr71|8+7-in_u5!EEZL7y9Ir)M^Cy?-#Hls!V5dY z00lpj_9aj>3=o<0=#Xxns)$b~!ZV3*EugI&2?Kb=&YxDa^S)*!lv14PIVO>j#Jfy$COdf?K7eNgNwETRDtG#hKBKpr9l zMHbtTmbkOY;T)g86bl&6IPhWMLcHztGGVDeH*MB zSMliQVp|nLeeol0&4+d{?OvnCBaR}cwKtj5$j(qGpGiNxUU1gO=t}d? z-#9zr@6UD%|C1`mz`o9-mJp>~v^P#;VKJISv_d`HM3knqo0EeW4 z9{T$1f#Slh{!PozMp%}GE?WSg5Uy~*Z2d2bm=?o^Wi!^PIOQTJ9m4;wvp2#`^cWG< zkK#3jG3sqq{!@B-qv?71%!B8#S-EB)D+W$pdB!>o!uV)MR<#(t-Bd~a9TRbAmZ#RD zEr@VP8o9j++inZ=WS)nSeyj}1pAE^cL8_6%Y*lS5Q}k3MTGhXBEq5c;R&l`%x@t{^ zy3MqH6H(;ZFw`C(?K{u{5StZRp|AmrFZof?m1_wMa0Hxy?yZroF2oL9`9ARMuh^wl zP$x$Tq2$-+wXsGo!HWUNq{yU^=C5#6C| z2j}c3wfYG>ORvU@jAm>AX_y!PnoY=NvIfx1``AXR4&x{T_C#grAJyz)9P;&U`CO(^#VZg7(YKqVzrj4lY8=6lB8;U}i{Yr5r)h_y zndHH9IRbqMVX6u9a@y_@KY4P;;H6XR%N*qG79a@JnnHArNp!Z#Uh1hL!zegypbW>B zI}#zOCgXOfB^s%`p3eHnbrLwM3n?Oyd0KyXG=O8%0Vu4 zB)%!odQ)f#qGlkR)(;K-&Dys?;27Zd=Qrpal0JF{&PUh0IEJ$8#fQDd&z!$3ogU(u znGdp_Rz=Nue~C$y0hkV9!CxSeS4lzwOEjMrRP6v1X0o7dQJx>lg$B4c7Jh$zJ1~5s zLEl^%M-lA8%GwsW(SS}E*wVHf_;1Lmby1d|=~mKGp2-{=X)y2~gwmp}<6G*qUWRW# z{B>5tufp_6OLCzwZ2;2m3{lx&Ulf2*Z>-5xK`?)(WY-{}NstEF<<+aJ@>Xl9xeNm2 z7u7TKXVR9oYA{XQGbCn>@__`7UY8w!@NF!(B`%N1tyVBX`8SqZ{>>R~Jf{B5WAvGQ z2M+KaLgYVFveUrUzahOD*qz)($lXOZfw%Tg=h2_n1sUc0&aD#?SaoBz*JSyjl5TL8a#h>KPw$ZOPi>(jBZyxNt8xlgmoxToP zKD|+qlCDYKOO%J2=J8lC0sQ10xtkOq4YJI1z(d-Hg}q*7I>;0JIF|Q$udNj|-5W&D zpooL-^Fg=eK15wxq_Lc=*Ijp(-}pfX<=Oxg&LDgkKojXHs|BOjGIwpZw{)G(0A45= z_Eh%^90^y$9zX=4sz|t0@;dA7T`PglPm(^$9wUYjFvk4%3RMT!1eV_lLXYJ?qZ8l1 zIbWlo_=Xo56-fZfc3T5`sRuL1iUz{kKj|R8g$rze2@v3L8JV|({=78$_1k$nXpr<` zTuPV9_I>){HlN@dZb}|~=KLG&^&MVH1RGeN{|e}0Rz|R9j<(wf?9X()_gwNj=x4vx z&Nm8X*81qY-602rTR~>(>?KZ~JO? zz>WVFT)yo4e_6pH>J(3$0x2(OO}*nw`zIiel!p1`pg0Qi_GDuD6jc7;D5AbUIM3E; zAIXBZ|FH4Bw%}aRMN6xNJHj5T6*&9|eY~agnH9!{X&4w_2vhpNs*?&2^K!IoVHr|J z2(Qw6(&H7$72$$;9)I=ovcAv?eLE4pay|KW&BNR8kLrYHU`A~Srueg7G?2a=y}=8;zXfEDVoT?RDzghOeK5JryArETDtXBwcNdOc>omr}y8`9?8-T-t%i|ps z12Qdbr_;;wv$I4NjodZRGUsA=MK{6^=Xhe#E>P^8o=c)1pkPk@-d%Z z#Z3ZsNJb4rSSq8QCoR52)#!~6HoB1wO7q6<#0Nws<_}WqNJb7aqe#E}s-B*wk-V#; z*A2I-B?LR~SHE7KfhhX>AUO! zES%GrU~?Jbj;I-W#ty=w;|>_z>x9l4Ha(0W>9;Q@hKc77Kr_YizpxM?jU?9{41|iC za+6jK#ipXx-kGvIREo=I3)I-v-!eV=a}`Kk z(ES?+gYIKF=`{E4(r86o&<0fOC;6$*SeX^oL7MtU@(80nS3qKaR1;@e@A%o_1v z8^Ym)hSEtPYw>YBgXrn*gnBzTt*A@e&v)z$if}4c?XT)oZ0dPERAPr7oU4kyY2CD+ zy*I3B6qlz7NX-NTiMh({=J-!V{2pH(+omn1B5J8AaD2lYQETt)uP z(~-dkju{~V$TJN)-0vl6?qQuRV;FTAPel*;_jyg>3=sqmUp56E)=VQ(-F6F*KM5Cf z-eC^|6x3H&1}?C6a-c#u^8r^nG*IPdfD{upKl22K7dZf!;wFYU|BYf^Edx~g)0Jh- zeH{qrZAv1LQ_>#+xt->l_^uPFc#~Rw3nHH=w6KPD!odajUqRin$x!xuTvYh9W)Izh zn1gfXi;=M0(6pM*q8-m9rVr7&bSVPYy<7R>ANU~LFz{z;P=O|ZI=JXABK_BhH?d8` z))fMO?uU`oolSkdT1Efsk}5sr_tn61GtHF@=RD1(;U6kd!};DzWk<4xTfvQO#y~z0 zA_O2CuJOaP42@E6T>adrz1~ZE4hbci_Q#IU+}vqVxhU<(w9nngp8pV)gAK*xtp7d} zC*PzDTqm0VM!d-jY2HBYgw-vC=*$F_(RBH%1%%Y~9geF@-}A=clPIHxA7uB?}sd49Kn&CqQA@Z}jrbbgWwuC{H?}owMQH4?kN_H^o6x_ub zYCNywF-)16&P5?1^y84JeC&k8ogI*CVs|%+I1w4&arxkY`|0}foWTibX`IF8Dd_Mh zhJ8qbn-m~26ALn&cZJ_9>TO`~MJ|vz@ej4=@w)k!WnGMK05B5n>$ypxk5wVHCK~8B z`Up6<2E#m?>&rJf7kVc@ws8z)y^Oa5`yHSUZ)4j&p(U4=I=?r;RVN>|s${F~V5nC9 z3NV=E=g`j#@i}YWtIGRyi6NAzMpA(XD{n%UEn@nr$X0$P_p?{l9ov6yyrv1BX%{;o z)13X~(qzNnqT_rxgj{k=`8v##Sd?07w5<}*WX}jL z(yi!Y&nNC>Aw7a*L|rQ$z@FsT)eE=I(J~(wkwgVU3%;a4ge0i= z{TiY1G%9=gD0i=-TuE3^MJ($rtpc;L=GFCCk2!L34KUnl8K zrpiJ-U6M%{5yCvMZ(Z|OUw*MjDd0vZVz?L@sA(8xF%aK-dmq-hgp%8hbWydBd>%HP z&rJEN7I^e;>rcDdsAv6%mXj4>V#ldTEi83E7FhW+bINH*TLN2Q#0qC$-mGuWky~NN zjPL(FshS;OI9~e&vfodwfA}Nez3Ybrbd%PhN$62R$KCw{fW8bjKIswD?;pMlNYLP6SxJB(=jJ1{oZ|Lx?$=^h-2J z%p^MI8Gk2xJ=p>}CNf0Zi(9)C(mQuK0)<#oWp5fai3-dB10dTyjOrNf*P{Un5Qw=Q z;PV5^lM1NMz^&1S%Ff)fURqyf#TUltzKMYbG2GXo(OoEzI3Hz`z z*M}>{Ah^IJy)f81SCS6NF&9TyN#rMlL4K#PtD5sj3!8`X=!Gp`8<$L+*2iYp0eU1z z`4BAWqYZx{gsYBMSCThK9pv#AP%^lM?G-m5LXevfZfvpU97Hx8MkvH{AHrU-aOY4` z;uw_GJ&!WC*d{NbA_DRAqO#i9-*&^WshY_1V zcor&MvH{U~r{uy0(y@tt3J1BD0&90bY?Pu>w&Zn)klo(AR7Bz(Oz8u*T$#?B9jeJE zVHLN%Buu&DP7zQH#?IcEekU%NpUCi6jcam-F$z+pU=RH1PJM`{yE8=hT+&t$S*sVw zjHa#DDkA<2BZ?`(_FvHcyI;3DD0GY9E*RbNi(O2Tdd=ojt( zH8Qdy-vT3@b2QJ<7aVio-kUDpC|CAAd9K8XYN=bTDoDQLN-IVA6ofYWS{Qqu==(E3ttavqyaCAcTSAHlqAxn}@(dv@o0Ey15M%tZy@R=@Ape&P0uH&#e7 z#T!xbJk0;avolqZPgZFO(adXw(6>@Uz8$@PXCzF9$%_%}f=YsEQo=xvU7Q6Ee9cm7 zYA}P7mWrqvG!RC?xu9C0k~aI7=~o&x+IM@GTOfFJ*#BTJPaP&l%@+xfOqge-!TY*AWiMrDR< z0kKvtwY=7hSVp*CP*ZE$*51+7nO7!NTA$z3KhVFM5uio6AQrn|rqWG1q&8;Oy=1YZnU7Zl=g|7y8s@b#2YE zWyC%QGF5a;DDov_tW3RJDnmfzs$cJwWH#XsjHpb-vdUT!SHWjDR za6$^irRH)B)%K=70(D+ko1e^KupY)*QRX8OqVvJZT<%DH$4)8Qj7tUoaVh7z@ROcR zTlhOLE9Nq5XG0$BDQA(7sV;;~->ow$$HwG_=8Mp!-XiyXd0Kgn3MmY(WqAVGE+<$OPvAHw_M{6;Wv-# zvWNGtgHPolbwb-xGuz79k%c@8r@7LnRF{L>3rTKd*9!Vo6ZR z0A1eHoxWELzpG?O+(U91%Jf;+Ww&1WlPnG0B)BizQ}>VGPT$62BnCKH5iq|NBFMW(EL7Aw%Nvn*}TB(Wqaj!^^w(|$;m~}Z$Up$G6c7X2i-ILLPVCzAG5IF>TkYorkj0QPn6B5l1|NRlPNZiV`BFnw zIlaDyrs_d{(Ok>Ro(8T#gCp89URKnxI%|c<+>F`BNL%rpT0D;v#%aK5H2qgV(jG556@mW4#l<9 zcUb5D8E6##(p7<1T#!66%$9#~Qu1b(^vrI}*$}(b3W6``a-iYD_2~LKW9lG@Gjl$8#gA@?n`R=p^R{A z@XPz=scQbB;(n0(uJg2Sil1-G%6*w+RP^)KcpdpgtP)fcc~OKF&o|4Zel+cpAKlYw z#{5;@%`L+J150R#b$CEPyWXw)BGz-cuY3uPbq>z``DhO7yUNS#2PzFA(_VSvMcgut z2kPB9Ud#Sci=EL;{VQg?CK3y-POi7JV?!Iy&pX( zO#fmM{K3TDsMlhk-2cbh{GBYypU+wZX*{IB9|@<@jb#AN%rSS=3?8mN5o;%2);kUp z>)aFw(c`o1A_`yVpWbOklxO?0vKc?Tb(liiX~-yX`-IeS5bn9i(Eh1f(eo%+*;u$+ zB2a3idPcOAs35@`TWBk?D(O9WhnLpsyN3V3li5ofA6;BhXsr_sJDAwCU*p{uyXfRa zl&g0=n$s8*gF7Et@!7Me@2Rt2O;Nm?>=km}94wVf{XH;#Pmz2sYdBYI{J!lA*Q{_s zc7_9w^4zr)=bkrK9pm-Zq}%G;ZpuS1+Qi{i1$I!iZzi=?jSjJcAti%n5|tO2Wc*E? z*1t#_SuxD|_{H?vL~_BXhDP7U^O7jTRq~{!d}kpu_$fNLFf>TWOld4wclN|r^BP{SE(70=pFx32ZGpn{PilHELR!sVtOgmO?z zb`5*J-|N(RO<=tNIB(F66-+px^KpPn`|qa)3-5hRH>s=tVjS+DJRUMWOnhbT9~eF& zqYGCVNbbBCm2%ga>CvGQ76YS23QxA%74&!n`AWA``e2)neXMSWSN|<0y$L%@@D&z) zHXc9x&1EpWQn0{PO*l|cL-^6mARjefYO<4ahdYBvlFCcb;V8Ckca}wqy^H&rpN}52 zcqkB3-kl=E@*TK(jP>mkO}ltLuq#aM-r#(rc5N(nlQYRD=JK1j*R$_jtRCVGk1(IU zU^j<=6?Y{~EGm?H;ZD5pTB2U{-t0d|Z*G1M&}UESJm(PA-2)4pRDN_M36v?lG4g4C zb2GHWEhr{oJ}e^rZRl=ka4t>i8q$u*|jItTAw~}nW zaN3=7fb`G7!MQR626wm(uU`!}y;bz`Uq8r71~@g~vS z%Qk99-&2*R?hPnOgsFcNxq8g!B#|cxRl1&X#g70dixs9RXS z_FkT3Eg@GFG<#c4#KFTjnWe+-h%Ci*5S^b%SsIDw5MG3_j^(KAvKwx@U7K)HoXGVU zzOG0eNu=Kr$0KMVBvdHSxbhNp4ep1T);T%H2qFKkdzn1*XSe^^k6DL zifD7D^kWIaRi8J@dhgx;rvyoF#+0uly+fCCORDsjAg}r~{aseAZOe(a~J{HEM6!t}bP|2!ZVzVbo(P_Y|6qT{MQ@f5&>%C!Oy&F|qrUK9I3_NhkJ6Ktn*`O2!!w~)0X-Xv|#^Xv;$sw}n zowKNNoWfSR;pm;}74s;+%DX==dVZRKE`P7fC9Ch9#EjTMluPbeY_*y`7F_Lkm>m9y z{-@vMpK~1cJ_F~U<}UMYemawzF`yE*N-5j6zpv}gAMVm|%efbi_I*g*JQu{8>k2J% z;l~X5bV1isN(M3;9*nA7 zYw2sC?i|z-cxJ9V_{gG8q7s|c+l3tLx0x*df>R$sCm7^n7WiSx z393{!y5sNqv3YV(I0{}kkPx{Ql(=V~B6-O){Z6f5CJ)6#cH?)YJr%z5MDRjOHIbvv zu1TEvxPdP&;l=DTuRq0p^aBvz6mvDpfz9kRwA?#vg)N0IA?R?0v(N>YDQNQS^f_KT zfAch9C4Rpml&`B4<9c)cr$@;jxBC|>ZCoGR4&km)lODW4ybbi!Xo0vVA;U;${s|%D zunXBmiM$JbmGa+<|K;xhZ7P5O;5<_ zhzbpCmHrAi98!6=|9OHRSTX~3l%}9}YP@SD7yCG%Rkkr11$6z`|CHFThBNqBy!f?s zO*vCvU3@~7Vh#prH==uOH%78LE3=8Pb(TotMwZbTT?R?X@G|(HB}9b?oC}j9G&e?S zQuX+Lvlo@!UK|^)D?}{Nvbt+OJuwvR z)aG^Z`T(Fv7WeoFRYpTt!rb3axhelao}PgMZE2DixWSWoTe5=&aWrD}(W?iwZx8br zeA8ny?lQEB21L!fa0I4ep!73bHB#WG<%tXoWK0ZD=Y&;CpMy6_hi+VL<2{?!jR4MR zxGsIp)HsTAslMwfHyX%yH}4)k%^eIpFl%rXdYuWzt1ijUzRgCzP3M8suHCYi1XkyUOdZ$$& zF@p#gVc=3{@N1Qv{}^iK(J}HKBmJS*1Rge-gK@*kBiwA?A$G?h{3CL+9G@?I zv8*AW-=<+)qd6U?lN^Nom#qp!-?S8tv_4H$lQ}!@u5h0`Ha|%t zV-=7?=FM7p@sWuF1=+S~vLc}tA%hI2TQ66JrvLDVuDNFltieCWUeMyYMir&=ncpB` z>QCj)=#*#>s^IQFxcEho9Sd2%1Cv3(U~zgwEKIVA*T{)|gaNMo=^pyF7=Fu5eI_Y} zUz(1gw<{dcZ7KX0?bn4=K?LG;b%hj9;4r!0dor_Gg zKWsoKGp(mJE>EK*IBVBT#dIzu-^{+cvTC;}8>tw({*`6d;x`u1o>5L}mm@o0m<0y* z5!b7XZoFjqR=E99UM9Og)BjNhm@rH$Hk3(^vM%vk_`!h*{mx)c-}j5beO4vHf>jX< zrO#*hPjg&alluy7bsskRS=2~^D(v*>N9R^f24}V1bvfE!8}-!ht_8$b_4j|V3xM4t zIr7s}y2Go7Ux_ob0ku#?zd3~9`S;_n5e2@FUr!Ie#o$%O<{7t+?w!Bo=>Lv|2`GrPJD5F^ZfCgywI6*)ZiXBx@+wO#vA}4iZeyPH@wO1@Yh!(H&(uhMhQN7Peb;>-F=*09P1mEIQ*H|d?&?&(VuAFZkO<~T0 zPg}kD#5bJju7Tk;j(_}63XF~I#l@O+?h^=UF0p|}``kXKDn(EBhfZnZ)iak^ zSDu_~#Wlq@4Fw0Q(`lVsW}o~yIf8x|`sCpHcPWDY!OC3SQP5{ghO?!q)zGX{6{Ru* zEG_I$w)#J(M`>)DXQB=T%S!WnA3RzZWi8j2Ln<{ALu)GkNKHMg>0|cjN`YIS#{X(X z4y7~jX>Pv}rs~AkY^xR>?gMom@&i9BsZy(j?eoM{T|{5aK%#~8N@BYv3K_CgG%hpj z*7?1RWB92vaGF;6sM^S0Rr`k}_edReI;ySbLAfz8wOFu9vEB&kka|m$@Wjln4N7G} z!p?pvf0Z+v##Cn!I5U2cw?@`#r(145t2sg`Jt6qv!vWa0&Caf3Z^NN3K$)rA*@?wS zV_h?X1w!R!7&myX`DaJNQOpp*WNdaX^eysbs`p{=6AqSap!Mq9)`@cGR={mBNcSoi zDquWX?{}W&*RPIQV>h&tJ=bQlW(tY7TtB_C+mR5rK)Nj0{HkS_aUfW;9L}qBRFOn9 zFHGso?(WCWrT+XDBlBt~ho_R8U8QO!gDr{-^cLNGe70>DPpA8xNjYuc*Ek(@4#q<~ zgo+55rB3^fvmEpyHjxF$LcA(KMDtj)=R4GiNuhn;D5dc1uZBP`z41(XiWvWZIbsYb z7kjA#(ihh7;F0>KL--L|3@>Xc_+g`H0+Bk6FuYp&ljE*xM+`D!;baf`C}GNeXV))R{6Rp?D@juaJM%wH+kU04M|etZ?*-A&QPZ*6 z^DGHpNpCHGB!iNBvtvfrk-|EhNyzzQMyo6-wjhamJW`ol)OQM}lgIsO6T3UXD&BQ` z*|FuS2~*}$@xw!Ww<5CMicDpu*(P6aPGb47QGCdB6risv+_gBd;lOV}H;OQ}X&84s=)6Xcm_?G}8dATPyc$QQlrT$z@S}%v+&(e2`&!pxmlUMi#{! zy{6w@5z#t?rT?NT0pJQFm5G`L!;+)&g$4{PPKJ#kcdB?LBQvQ|hZN9c($HIuQ|agk zk4QgKL6Mfc*C3rv^pl+6eDMb4r7v;CKJQ_5$kJZtPn)T0=TugxQ@FSEI2ETz&8f`V`Prmne zg}!~Q%r?80$>m+Nz9#nQ+jZsB!$e(`0p(f+e1XW{?5#WJtQI-)#PfhcQIpFIf zBK2l-*aw^!2@BG5$v1F%r;RHIm(lVjhO-zW$Ulk4W$e?G%X%tR#Ug03aF*`ZY9Uky ze@xV#8=;awptz)H)MQ=dC7uA(gl$-j?294GQ(^nF;3KGvK$~cM)|NfzY0;{AqhkG4v|E?jfCyvxckj2hjyF@QbGGtAgjcZjb zi=cl^*alq31E$+t<|4qjI?TPmKM8{#iO0=Dy#xXuEhZl zk5tre3+Ll!7K@C-x=atrB^Cic7mJw;ni3}7>(mC(_MJ2B+^caaMOooWcm|4Y#+{DK zH3fq38EoJJoMF+sj}WlQ#O-5LvUA6+ z>}%OE(MA6w$NS)f)T!)g+N+g0_8Nil|MH#R@`ksFH$OgD$_mLYU-n6AUkl-G=H0$hAxoxvI6$k`ozeG;6o^H=mdlcvwNHxoRkshxQJ3`3CkN8** z;<9*ip58Y6ilSR~mw5LuWW2gI8I~imdAQ(EZwU918w6l!-&ojUgRQZp)3u&AB>X<7 zC;Wc2%FUU{ckeSzqR?#j(QGjm^lvs;jKG%ppVx)Ab&#Gg>Gw*2CDKnv4w2#&_YP8^ zGNote@OM*LAGQzDWOU{B)EGuTjn1>k+M(N`0(_5->RmoE@I_iHZZco48$_t%9cqkW zyhLJhBLu{~_kn*ofx2giWDs?0|bUkUx&F8uZ|76QJ`FeQb zZ`p9v8#|a%MkE{v$cC(93a$K>)~u|YuH2hFSNK?eLddn00D7~YZs$dG>(A1;J}z=5 zc`O6Hg}M3tlL5zSO&(qP!K;%}cYgT!Xl>&azvjYq`69JpV~9mYP1Dw7_Z-jn?&#W9 z_v?lLHDV+xFbrr%OVN-b69=jxBP4n7sJ+5AUmwD>*DxItLtVt~xj_ z{101i;njp6|NpLlZ7>+!FuGx+w4+lP-8c}CR7wd^M~`%L!|2A50-}ykLQq-|)QNx~ zh=d9jpC8|Q&-tEv@40`&&e`^UzMjv=+#{e+)fesYeoe_>n6#O zYy8S02mae0lYURuUkt?eSfgJ!o3=9!Jay4IXelS9;BS7oP@F$(WMTF_SH#5{emX(L z+>zVxxIZZUNr$P^Y`tM%)&VNGaQj|9yjf- zB|+73B*wiPJY3KwO?fgC)`=xfiH`Hj8^;MYjepde;dCDLzSn^baguqEac=J#xr`$aTS~Qv%OFK9|0Qn#3UC5zX zlN!Uj{1Zd#G5p_M3qzBH!azn8^&2~B{5#N~C7!C!HjYW@it1o-ayryOA4p?uF6=*8 zou;?r)}p5R(2*@w-Sh+9gW4U0CW%oF=K}@^{N_5>@CN&k7UhlsY|Dj$qyi=`iG=CT z?*EcQST~TH>aJ6c4`>aH#OshOIVPEg?tkdu8n^$)2dRYx(B`6RoaO&YhNwcFa@6&m zNARs!@BU50;|VwQXzx8P<)lJydf-*Q<~v&PD2*JUS~5gr7pjiVH9v$2IVaetUcVqK zzwySaoaigY*v%Xf0>^oq3j7^@sVTBxJa^5V{DTX|lVk><#sIjKBGl9n2uFfTK)Kt; zL2^KalW?p@BLN5FV;%_fiS+FDN!u!LC2r&#O%!~M;_k0z3oF36zTg_%$Xl7$Yq$=z zj)7hj_Nq_-iO$RvBrz2kA#?^&Ja@7KlYkdvHXf9NMZL7nSwx1T%s`{)&@t2dMf^x! zVjbm5cN$w#*v%n~(ee-X=E9qDTM=9m=<)cH9;)m8USYg?iZv1FaArGR;zIG|?}L_n zRg0Qz@{gm2kyJy5># zZ@{wxmv@dcw{5wL2)K1(?BtsV`{ELZnW{`V@oiue`s-qc(f8+=v)IHmH305UGzXkl zhh4u#Le$HUH7;*U-upd9(uWt!;8EWB%|~KwVaX38_z_T206=WAG z0EM>(oP*<+3;zBl3>6jXntS&x*Y|Lw#edF9Ib_VkmcQEO>%utAI?|`Wnf6zi)CytT zq|VmKPB~5J3N>oX8!sywmz54zN#pXVfAE?hjEm*mhA9v3sttiG4jfwDztqm4n58J) z*K4(^56h`~%(pHk#)HrV9{3xnyf3Weess9}Ee+6fzQ^gUe>j}*NAQB;M$de6=<>Zw zTF5Xu1z!TPy1Mg#!tBQFeMq{|E`b@r^9!6h(oEXQMmQFwcWX~rj}D}mM>U3yD2!5E z>Uj{%h85K%qzmZ4VuDo$DYuH+$$eNS`zs+5tT02kv$5K<*3vHPgDQ%uCK`obK6iF1 zH81Y5XmTmyt3f(}~ zs1%;?tHy#;Li-#ucr-Wq;sW{Rwc4Y%^PDDcvwdOxM5kQ6mwcDU=;Pz^&w)>??TM>p zsv?K|k9-2Y=Sgt@?q9~xGomjnZ6IRoy;fp->;`M#V|S=fN=$3SpX836*o3o_9_m}~ zyW=+(D1}v}{SDE8mev~328hcSE|3A#!zemHs&`GE1jYmh8#tJAQ2xPlo>@e3y4RD_ z+JasVJ~N{{g~E@^U>`YZZ?3TSsA_<|Kn1ChEZT#tPSNsX-Qc#0;M4Z=e0J@UBJG#I zIs1sphk?bo>rgSG-)TDZ7d<`Lb+p^O_gTNc*_e_=O6?c1c*eLZqpc&N%2HcX1hX!@ zaas3IG2R$3T)>^4i3;!>a;Z)fo#D#A|3_(H#8jwF2s&`L{*IH^{$+)>V*3`h*MU$b z$7qenq#3}AZrrow-Oeqerwwkkzd!ZJC3aI^Qlv5yDMgfkn9SR;DWA)pXej{!q!y?$ zSeE2*>PIf27M24@Z7wh92Z|+9K{LzzYo+-8`c}6osy?G_SNW(vGQ+z|nI|Sxh0AO&evtR^QWqUF{?$mp1a{ zmNKZ@8f#5_0=?xG3&V2Ov(`ultY#m+v!((q6#+05(EqKsO4&`jD}`eShOH!-@aZX% z2m86+2gngv?(I+tc_B+jJfkgG84aKN4f%&)SoWa&ZhiIUd$HmENK>Yk>BjmcvzKVo zm-BJsPM4rU7nA|wEP({Xpq;%pgi?qgV>a>2n8j2|=P<&!stv$FK|DlDVP^OM^VG4W zu~Ls5DjVjiu`X67%EGa;lW zEfsSrXS`(cnqSivgF#kBKJByS06y|Y29BDD?@3m6K>SRzCa)2&Us1Y9)a-JI2eO?z zsM7wDVD*gw?neg)MXZ(QJJ&m?Z7=WXxgrJ0oi4gi9URo{)pJ8A{m1jF+m(AMp|1+D z2O)P4KQYAL8=1e|*@C?LB35qa^EkcwjSms;82X+g3jAdyE8ZNe+$KNbbh`o9L$85{ z#Xn?21ulHkI539z6#@k5U;*^smIsHw**vLG6M7{*729;Bmj4vwSNU;&#EDBc!JDy8 zgZs-)n=AD$lo+y_mo1`m6{-1bxqbEU@n>l^=kKhaZ+4)1>)gY}uVq@l9!&NewOV)z zef{m@m1I@f`K#9S(N{HUX1e?Z%f=19ON$);cy$!&?KCOFWtJ`S+Kqk`At8D5gpB*l zaCzGEDm_2x$Lop}!ShQ$#e(Beo9|1$js(X&`Z@e_Hs@C={vb7UtuPmOF=c_sAM}tv zXJDqYNvDJ7EByE7?pkHKce^~xxvYF#{a(_@`F2kAhhLAaSY4S# z84t(ZAO4f8?BoktBmp3XSjaEV{e!hi7N-2iZqb-mt`@g6E@ykD#dZ99NtFL9a$fCL zy(U+Mdv#-`v>gT&v`$Rq=1C=_3M2|8CCSUnW#{D=6k4NrxVhDeDy#B^N_mp%NR3VT zDXEtk4T}`yo4c#zJ0Fm83yDO9Lb;)yp01J6=i>!(l;O#t!OGVY*>m$t%XwM(i{p<9 z8xr;2RHmi1Zk~VM*hlV88>lfjvi10G2G}(aTw+msJh337HCzFpk-$@r3 zspj#HR8J-KCc}^~oc))5-m^RU%sSjGGfaWnBw`4bS8bMvuDPiqNG^`6nvt1%uXq^m zLG^pTEV?#d|NJ(Bb1y=5?!`~I9l@!0&t93S!f>-ms-bOuHX&AZS3K7&O$s*YE_XKZ zra9rw;CWP!xAgX}LP1pzq(ETJ58`LtsV9%4YLg@_zmSJ>eD#IYE}J!e-0X(lahamyO-1J9%4eyL`QG-;iHP>Tfl7}BS38iW+AvRH)h+^8$%?p-$`3>T)p>xh)@&gU%#|=%ldoMnj)mP{5fT{=7kKVx3p{UN24!<;9%!;p7etPfheX!V|6`sY8 zeUOLYW)fqsx&1Nf73xu=6%!-KSNHY->m=$Q16f=oKN>rF*Y2IFLGoqyV=q!m$PaOw z^MveP$ASq-DKYxD09Hi7glbxVd@D!odU}4=B@5tz1{NlIJP?!PThy1%e_8((*iCT| zZ%#1Kd29Po*IND;R&|!&wejJR;T<+r`?qOZoduiJ#RgP^cdNRIYk0Zz=UJ1ltkn7W z1JxHwD{B%jmC|@pp0UwI?qc;$dxFY;k zT;RRahLljJ#BxoCFpECZaCdYJQ_$t($~+p)~}w%(svtt`uI6g*vhmD`?s8|DssAd zd0IYlvWiHzqwwhAbCq}c-i^n4NJhzQ0nPZ2+p2PCdmUIwS|(qI1nTvvxvvquu19T_#(sCj7F-(Yza9FmQroPSei2AwV=ndgl zRd$5#M~@!j6V;~s{&X3ciPDO34XE5_c@`J6K8-A}69DKl1(V}}rr#pp6WFDtRiRw# zhB1r_fW>`d`uA93&>v-YF>mT%Uokx4(&GZWWo`Syw9$R;O|y0422-F# zN#`~qTRE+NQLBR%E})qZzh#F?W0(UnaFGpCc{AwbQINa}YcPj>h6P^r@}9bdL!%!3 z;qi~5xSof0>;^)gZJlAVo*=(Me_ORFHW8CCv|`Bo7|J;R0{J|0Yp*lu8Utr>?stlR zGy2`zh9Y?a&LVSIBv(hbablciOaf(S1V@@>_d9 z&f(BJ%#gT8eA+0Q0_DMYYu2%VK-#E;-M6larPjA*S;*!U9rIpy zS*gk_m`)w{pqVO$xGHL5-6T=b@qpOat>A%;b6&6_?kqJ5S znfYr-$9IT#RL8JA3Fo=< zcySGANI`GV5R2_NN<<(z1C%QUW_Xq{9Cx=V5MhjgFd&uk`FDl^X!ILwVQsrxfDu9) zlTFIa246-R30^%A5$TaOZetzQS}a;dh*t^mFsEyfLf(aj4{WmsBbJ*mpXn ziRm8`i$GBR61f&-LZ^!aJ$Mg*pw0kL#*;*PDwRg@!cL1rC&EbHv}gc@=Ef|L>iTHV z;g_7%>VmMy`4N~OI?VEQH4*V008QP!CKSL7(tIU>Y5bnl+mK`PeknNPD=V*9yWZt= zN9G{LNRkSFPv1|-N1z%C=LKI$q$W^lF-`HbDfH{Z`;M%uRQ}0uq(g_t zbBy8ZmDPu(2q*xTBn8Mb8_M*`;uAf<3$V3Cp?&+Mder$8o!SY628R~&LOHrG1C^~v91;|EB6q&_=EV6s*BoKHoQqNGe zDINg9#h%E&WZFQ^VvpWF7hXU$0QK07dq)jC}bf=*H7bS-I-Ca>?SnomFejQs z%SQ;KW+>`;EgtY_GN~;)vnxNbU>CmWhMjGV$PBzH5!w19cAF>!7xCi(Knav82~-e^ z={iSb)EygJb6U6ATmh*0DJ*>2=gO;apM^KvRjh9_&_2Zzv%@&v6d=RON+qil z#gLJDJ&MWeOw!ct-Me#;9rvc-ux+pc28<>H^0)mblbJjr4ys{H*-=qXi*75BK&GVs z(L1tJ!kCHvbh7~sDS^r_ylC*iLe&`7u3!=hSLBm0dmGN+YqMcud`SntoTO_y%Wixa6Zf$5h(Di#lxywFFU&*$ zupH^`lQEZ3C4ym1avY20$!P465vMVbA)zVymN&XGjG01f{+aA{Ssc#Ikz}wFNKXW_ z5tDwt2oL-mO{8KSE{gWv68M-2;W z_;_qjcpYB4Pk$jK#Q}|GL3uSX%ApWlwA3q#o+&F6?^$E9|#5jgfZa83oI`c>#qowBwpw`0kyQ5bS1=2d#~}PpvfcQWIO2e zC8%hgNq49{TM3&kD)GTtbH<0pn;D9W#Sf8 z7c?q*!Rjc{vUOABtKyvFM7|f@OmFHCyd{-0O1XDB?II!aQN^0h!?}Y#mr{kULy2G( zl)vP4knawd9&^#dlDU6NcPCMIUc+i9uZYmiC^gAy!j47eS6>rlfQ+P0rQ8|A2bZ4Q z_j{qNI9JNuE73NZ zSEV$V*>qR}kAPL=vpu~n-4akJ9qDQ(&EC?5m@$YsAQ76Dkk+8Wf(yHqzKD?_fD`GW zBWd>)=zhWAqQTVRKAxAY{SXhS5%3h@u>8#FnAW(vTfDkrmYtrA0HAQZjs-oTxgU&;h)(NN6clRvXBvNwskjMldz!8kV{Z!mB&Fnne{&cDh=bG~o@dBCepMTM-o#p{>tR+=``)oNsfq zYAUIpbD*8FfeX@*xyr>9<9E(x&kyU0TdG>GH9Muj2w;#7sss6}qILG(p}7tx38;+= z#7J9h2ig{p8w)T109j>%>N#+NY8b|k8Oyh6#z;u9H_QR`r&P{LxlGbi2O>IhKulJn z;7o3a&N&Kl2@e#RxFV|8Ike3RDkIm$OW)U2o?Ot%h^!ybGj z)q1j771C}SAHj(7;Kf-m&N9)LLkqr=tn zrT*w&NmcSCZU^=V9-KuprK2xG3xfe%Kuvim;Db{D-M~;hvnK~V)4T=LCE(KF=tEF$ zQxyuVwio>xCwi$&e{KVXVV3KjeS9#<@&30ip^V}4CAMA~z%OQ#g7m6i_FyKYfsPjR zVy(_o0j5SngWYt-fl za=sZ}_o0N*y@nFFCcvOPDz9O;DGBEXd45;1|IP-{rviB|IA;xgTS5%=f0$#rBsn@= zoHJC1S)Q?x26=Po&3iR}P{4!BHDVkisC90NJ3XdLW?{XCypqDA-e5rcH=n_3Y(M}Cc zR{q`AVaRA<4y!wH+O6s6wU`p50F@(a`4lG>MXt{~xZ5m;bfB+U-iCt7KAc3Lz#-u7 zmbE1F)1cA*sie};7p(c4R|^=b_BJrCo3~WEIPrmrOJIu>aR0tv0*w=G zB>4I*u)%Y?3myj-b#Sp3h&cr8U|=KK++8-jKa&=?$L{DNuGn@BkgFv&PdV(>v0&tL%q58P)75~R*d{TJW21$o~dr=q09A5R&rUJi%_8uSX!#AM?4 zgm55GP62ReNkC82i%!GIAxNMStFx9R1;GIQ85Cc*mC7vQ9fEnzT1RHc&z8P2F3L&F z#+w3WaZlQZ!+Dg@?u)6(VW%{(@OxjNXuJ4;oxrQbi}I!(|L;wFuQ8 zx{e~%QIPQGz=rL?XZt|fNc*Qx9ww4??~JNPdo=FIl(vL%n1Z^Q&ShUMpiEPTCWLZR zC+P3>w=o4*^xMBl0syQom?Et&DJd2`YAK*Szm zsq@ZgP2{LxwgAss2n`vsS+Su$8%TXJ*s|`dA@8}+4RqH@2yB;Z$4@+8vg11fUpjnw z8Ff9>0|t`08{a)56Vw~p?f$ZW%{NTQW4~$KjsE5AN><1KUEck-Iie*jkKN+sOE)HH zwHre?KpHK9v;)A6-sby1935hyGXXFA76r6bJ#ha30vHGY;G~CU7Q%s{ap1PQM4etU z)-(~&tNq+cQ!<$x7^5w4E?rfw1T%c2QNd{JCd+Qpk*nkD}Xa;B2(GSqwAZ3al1Y? zGrCV?@8@!g?H@uPk9=z7`=VM=6bqkyBwSw!m3iRCxVOZK@iAKiUm|th>3eG-PU&=b z&F6N3YXqxPm>+BmYCQ*X@>%TStoEqpmfBR?PN}g_R`vsq=_h=OO=Ce7aGqdl$e7I!8XBBhOjV@R#F#3bxCJxmh!c)Z_b4h@^ zO|!rYcIbVhw;di_Ibn{xN^fFb0`LFre7JvFLnR6x0oh%ZCfe(+@rV_^;&{zJ^!vXY zk9)ITb}RTp$jLG2B=Q2<7`@W9Q{0qOT^(O-idQU=Dw*WoEeV7ER&Qxy1{n@IA0p>} z4J+c!P@DLph0*wUpg#9}=jvpMre&sNx-*6^+_J^yulqiz;)`vFhmOvdWAA^tlI_s! zoqrV}=R5P^Pwu^o*0nsBziiE;#Fr^J?Y>?zY)SV2P|c{9lw_XtaijxTEPhlf8fyPE z?U$x|)485Pt+5HeY1*CR93Dme_5Mz+7~6`$klikqmpj?-r?RYVNkeJMqRqu3tnFhZ zU%)DH=c2yrqGq-P0f-9w*XvWjY{ydZ-t^)r!7Ci?7|e;YKA{@x{GcD(PH`9hcbCubYlh=5haBFD*7m)7z3Yme9BQrlB3r{g|+0Xel@iqQM#C+wvVF^ zkdV-o6hnsZCzicBI#t(yBPUJpSKb>U{><&{Z8~xCT2J{XGL2%~`I6&ozX}+}ib^mF zpC{cz4ymg*=_TnUE3$s@OY{9+VEjkaxiUmyYzY_BpO*X{-Jk4Oo%p&l73%fcP?%3x z2Y?3vRgqLoIwKP2jZo#AO^TqK;i}e9Ll>9>A1@K0iEclVIXrcj&Ujp@GZ7ynxR+C| zsIiaW2+`VVPza-z=*J5^E#C!&(0zN>kVT8D^Ww`9cxg)~9qa4B^xU*)Te*jydq%^I zF%P8DrOMr?Cfx(rG+wi`+YGRIWoIU=N4bux{e>P)1YG0s8e=TDB|HDxxz5O#Oo6=v#ia8%9 zd~Ks{RlfWhl5~9Qvq?wVexCbIvz>~{QZYT_qn>7S3i!?Nz8h4#cvX*1fSOv>NB~@c z+agkJN#ZV7FI{?`6lXB+#xK%!#Vl>?DkVw|_ORmJn%abFQ}-vnrtm>XS|XDPs_A#-uZkK#@xT0EsT}=Jh8y_X*4`$AR#Zy*eXu-UGtWsjQ18s` z_-ztZh+}EMWHF1?HO53HWw?AHYa|5q_o}U-r2dibrZ-33%0y^mQC;%Bzk!g4FqQTR zU*Ywbyd8>kq-i=Lm>iyIHud`zgqclx&PpWcW53F=eh4|aLVG3L`w_`m`gC>n{+~mN zcTHlx*fBv9VNUXQ9POW95w|`z1=2ecL6>wBvr-AQ{NJGC+V8_2#90DajH^wI$QZTI zo@+v%OgoGyaL2C4uV^`PByDjha9*aUuz2&ZxfK}Pa0euwluFp<>+~<=doKDf-fRuK z!DlpQB$X-z9;>)Ul*5Sf&3H}dPNif^lRintl@LPtHz5DZnz8zSJImyyOl7T7QvYvf zS+|3Lk?@o95w>FxIJm%aV3ojdKV9ft=) za*u!f`u*qq+28*FV0fl@Q_cIl9g6_ zW^6n0MWcPUk~z#_uMSqgz(=6=wn^2m+za0;&DPiHJNJVP8nm+9(13&)&Fhpr`qpoM z=O0|aGCJqo2!Zu}7t(fp%ht9EDm=zi~d%FwpBdp+cZP1smqO_lkN9%(= zyb7-EzOtAVQB)B5>#W{~y`JUf+}{|&zRrxZP?yhN&(rsfOD(7y_x=HB)wAz_IQn6* z{ei8qyR>RMR58dl>&HYkp4#=KJzR9Y$4-x! z&Mvi|uvL^1SNJB$T-R2l*uTS|v@oD=pn|D9e|H;y^(j{1*1wtNM!!2h1MD;Dr9nVg z?nH?%4N?@32MM3;O3K=E3_^7uFBwWo=J4e1`lh@++f=X2#5#EDi;OxsmVN)>&=6o)9naF*CL3c5zAijdvob-ZU>~=s z^m(?*p=%u<5ugkd7TZVT&Kd7ix6j`OwP*JiwL5;hQMN&!sW_QkG&&*kF824&R<0+R zG}9J6o4{qN*4}it_*qB!$?WD1z6WRGw4##TMEhhW z`DN#!tptZ<`2M`RldV2r#3$4Ag>+QN^4%769$pGS_gDY3nkl=3Q=3x8t45ex}L#Axry#i|DJ(!$vX}|IFW9s*8y4CDE349Ub#~IhpLMGatQ{m35Y9oCSh3mO8@A1E6dB$CfZKhU73O%*MP65yoBqTgay{7N|M#^`b4E4)6@DXlAnab z0ex1~16KYa4)&-7!cVb;$anr_^siL%CXf7?ceIi@$5&Vt`}VkBzBGpXqGQva8cApD zghHrC#y5646F4F_b$8B38N>=lVhZq^e5$Zcm(6b}%aS0e`@OtSdrEdC-c#hKMD|E~ zm)dvuM^Ryv#lV#s?=`%a7{e;k+SasqX%I3|ii1P>aCcw$4}*W$a$Iv2CuX2s5U!m7 zzgW6naTp zjG_e<#~d^|FImM3PT3{iO$o)9D0%5f1h=z%+)rYi(-3ejW#;)B31Vgh&Kmf?s+|a+ z72@Q{)ALSY`Jh38zG}9;$*q6!^8!#YvKhA2A!j*__=szKYGih|XBNszp6rio$+!Q` z+!G7eQSLl9cte7hUHgQP^p8p7R`0O@t?%>_cS#)kcFd42D>1w#oH&fvG$3KjG&ET{ zZ;wRhIuB=V#$<-y$fy_Alall|hYi0^cz8l!#I<*>-1MJiPP#Q>ALcM_vx9>L@U)1( zOk1%SDq!U*5%-wOpTN2w*j5zFG_wfJ&P~xi3|D2;h4QW%X)l#`RM@RKssj6N%rZal z<(20CxV8@3Rc$QSGZtfZz;gAmd{dFnd8Nr?g6nn6Q#HO_PcP&ss=|CweV}kt6DA&< z{aE%$CLA4=$-2+>q-#Xv5~Dsa=506nqM6Rb008{gD|}5>vcrJIG54G2m~hrVc8r$R z`Z<|Pe@GF`BR0Zrc6P(0cQy2Z2a}gfl#4p1&lbzVEA)W6k)U=Ft0ybAK!4opmz)~t zNUHV1BcAoEafzo1a|LJreSgOLu{$IFVb}*jEr0d7c0=38*L)6!zOrd)j@@C62U(ea z(xL<_NwF{>iv&O;$-XHMdZ(GVuj@ZmCIQ=1EdAJRVIsq6LJ$BhQ|Ro`%nrY@)DPJL z8(C7HvE@}``weexk&Py%xrjoWRw&vo>E%1sNELpsR=!gaS{S=rU$D2RX z8w6hs12Nr)!2F1^Pi2SR%_DISL3l>2u_>5)768@N{E&1yvPElAoE8;Am{)^tXV+l> z-uMW+Bn%j1{mVk^sj%2SPRne6phv1VE$YwnU3TNp(SJ33^;MrChCA^HLS=FEHSeS^ z?~{gE^^)M36?+I+aYnFgnv`I|_++I~pWqSL-tN=;xuaOe?@wW>(&u(OEJk;d;fJSz zK2!_TvpG=k`$*>rP7kyDWt*%D4ET1IFDdH43JqoeVg}!uHan~)Qw>!7PiB`sEI!=l zih}|jxUk1D6~bZutD^t?#RJ=Lm*&6fI~XI_JQVnC?R$b&-Uxs;xZb-EF0SrY&K{gs$PhT*lJ1Er9 z0`U0O`1tVOjRehm5Qg|h*af6Bn+Sv;Z%J(52lpVw^fA>~?y}F2sW&hw&d4+>5cB3f zgFkAH)4U!4;#22rvsGq?AmE*U>41Oovb zUSYDmb1B8Th8g_*1?>8G!e4yUdo);f7N9x{et-h7pre4mdnQ6jZ7)a|%!B-E@loRJhqII_nN>*h4BX6$wcPB!$qXzKKYAfV>C`EX*fV9+H_4DI9pc zSZ;jEYgA(0XDIDis;rGc_6q8Zl)MH2UHCXy)fuz=+2oKc`NazG_|y(OA(I$JMnN*v zVRe%9&Rl6*qMn#3KBad=|6KYKiNs22xWatfO<_J z0pQFR{?M1|h`F=O-(m5X)aV$|koFzO`C5}~)mdii1X2eB5yOCyrdhM01R+f7JoMha zGtJ@4jzwGC525JREgamMhobfrI0rW5hDWsz7 ztB3$81f5I4;$aak;5>zQf}Z!VP|}Q1WPt5fiEvo6^gatBR;u{FSr8;DOW_hCJ_gPj zP?DmD$Z2L@_AicwmbQv9JdY-9MIjEa!}JEA*tF6YWFYTs(L5kHl~nu%UD|++@6pKb zG%H)QXX2bKY4hgsT%q@dF-pG4XfTZo9#6_bC3kVheLKo>odZc>b7e3wDLUxr(8BRKS2KykG!v+N7*sP@S=q4yFKwxgs%-fCHc4{W0)M`0_ba4Xr^1 z1s`#A{-%5xnGIHlOG?AlLUYNp7d~m|-QBXM7jq41I6W00)&fOn!f5@$7k%-|(p9gJ2R^-Y;QbO81j0RtOgEQ=6&tZRIaWc(%-vE4W`atXuRH}A2Z#L+A8pMsKjOS2!I5FFY!$$hv$q-}x*%nE=gkg|R8e z+%!OmlM+%_;moUbCFI76Jl}Z-Fc&F26?Jc;nQ0Oz^uVQdG)l$(ON*^d-hVEL2pB!H zR4Bo#%3iNh>#e-kZx|{RXwi(kxaDC`FchUMgVI_d1kyxW#aY;8vt0@cH0$nsTZ#nyu*X@|j|P#x)jTI{kntCL>X1t9L? z=!<*!^a}!f2R0GVG~b)Goes@x$-M?eoJ)3a5rJ&2P@~_i`;<0@GR8T{)~aUc^YqT& z*y;>a>qjI=XO=ANhN7W||K!OerI9O1T_47wLd47lbP6}Ft8jGEZt>JQIsaNje`YK_TAp8NH0X~vAvn9 zbl-zHSag-45|(#>e4&*^sKEx#P(yTe`o)zY2+?jqKVt!3hGl(PgOc9To8cf2@L&M` zX(OIcAX9iDoT8Z>8Xct6UR2vrPno7+1A(PI=UA|NI@G&_QiFXak%NR1%NoML#Y;g zN-~;SDt_}8^yzCraqV>Fa>lbe^v;r_;?mfD=v6w ze5{sQcAp#6V==yod}umYKwx0K69;!&pAhuow9puDBaSP(7d_E$O~>IM#vs5KdK{U_ z1mGwcFn)lVxcz6KZk8}@2rJICY8yhf?m_7+5qh}E7l#u~F3nYkHAZ(BY+KR@==?{r zyjS_yUq(-K0>=K6DXoiRK%pLg-Gz#_Fu-Tj3yZLT*A^}O_(#|GO2qyM2_g&6^~a*t z2ye<^okNV5@jaVZv;QWhS6mp!r6f)5>47ohIB}T_DVI`FGKtC2UaEZ)fNR zwE$G%uguOS$kZRg1#FZhF1#HDNzE?kR)CHv3zrcKS*S&WyNjVyxATdMJAj3~k2bQD z3J+n}$zzzFM*01}(8-_c2e^H20jmnIsdFC(=7vmF? zQ!l4yUj1+2v$Fd3{}K3XU-X^-C-6D=c6fAr^8Lrp)3aYcM?Mezeo4!gA9VDPG<-wE zxlSaSTs@kK6fuwEG#DGp_;==I_yc5I!^Ufn9&9Q!9}h+vwSv-n0{q&fW6irPE2v4{@XE{CCX! zyEuIo!mhNoLEU=JgR@Gr?gUA_dmMf8<=tNT!>hJI|6K$={p63M1fddWa9Y^LI8nr+ z(sH0{E9~i{EHyb=X1h*QNKfb)&<-%LjY+-jJ`Iw4omVd_tS*snO>V6V)%Q z5>5XtHRRy%)3~d<(W~{9o$c9Li_@UE!COI39|j42&T;(tm6~@2VeMJAdput&eob58 z$)8V6A6`~5DGs-PbN;k&)A8=J{~TW2a>`)(@87s)?XTRg|%EamilqM>XVo-u?u7kc!2{ z!~6?fNI8Yn?d{v5{z_xzUwSlH0>#fJvY4h1;bkQo-5qDA>DI`nIDzb{{X|A4gwJ2R_({acJitk?B(oFAGpWD;K^vq z(y_I3X1+-lcpkft0#%#^AjEjR+)GqIcWQDxdnln*SZtbnB>WPHPhdh*tFa77dn+5 z%Kp^*lCBRPm15oigJu1rLq+`b;?xZNu7ZF$F>c4AX{8Z4$e?snU9dvE`KTdyhOW|7V}MH-zDH z&#Cdm`oOg$JSZz;SO6n(sKmoKbtx42Z%$*x_n}LVH7@Ju=3agH@8=^D1LOSp zdfBMg8CmJdxuvU90)PQML|#5ir`~(&37P&6`C_6NKlJZ! zPFPTNV17KsLkt9w&KJ_WO-gc~#?xLj2BAhkU4DVFJI1mMECfK3py*K=R@MkCb<``F zPfaI}@qlFRJ zO~}(Ynufhk&gsR9`tV~S!BSL?p?RW8T~RPIxK5Py1cdk~^1zzUTL^iM8#QYg3n1dF zButu1Om#=WJd|otE7PevaTG3^P2h#<#N6zCXMr6L#rK6N!HwlBus<^;OpU_FIYcdP z7&BC29g7e2CuO~f-VzEb$(N@+DP3VJqw5+lwG5Boe=2KCTWLlgcrSu?S-VjaVTyO| z=oS|W#e?-JFQSA;%Lnn>YJvDfWF(;Iw|k1V0qV+~4oDU4b5rE{YG#7?_v+70*Oi0` z6TbQ?w!1?+1~0f1K>purQHW;K%kl9DpU6644Jq^0xx|8O2vq*o1Oi@Tn}1FL3TzFl z`LbGFxkUj|R3HXd7wm2@D>ook10-c#>Fb4maI4-8l*YY1X8>*5w~Y3a#Btap`TArq zV8WY0Wpl=qe9U`&NWkugzKu=K&2}!=AeZNgi$Rf)RvHZ%Pm^E3BzXc%rg+aYZ!Uoy z9Y{V4{V;h+l+1rIO^jpva2ycQivL-MdUS$Z7HUQG_#3)pi$721xKJ>w%j8p>Np`69Lw+#hg z6zE(t4+acuMazDTTa0JG*g>71B!hYMtSlKw03ixMI-hs?uyFKAA(w*aO2!0&wwG&k z$;g768EZYST&v^1jm|cQGR+pTEL9{Sc4Bbn@5M!i(v@ zgQEw6q?9O~g3=%;j!~mWNDCvSTS7tU?goocL6B4t5P5#5K410zzTfZf_wu=X_!Icy zx^r&lJkEVKy@gSPLDS3M4cDa5%3MRd!7~=Ty%bo~qeZSAn%W-A99P(_=S-G#53%z2 ze!#t%N96a5UW4IC(?08?sHmRLacrqetZ)@68Ng&XZzVI0gG_(uJCPVFxfRfe7eCpK zpuKTx)_By4RX$LEQ|-paa0lRvErsXibL4`gW~3GHePx~bCLbN{S_IOf6|6P0Hj%m6 znXaDw$u8{(IjHfGzf*P-9mwS;%Sy+mtDGQrJ936|O++A=g-QP!7nz`KSgn5no4RmW z=k)MBHqP`^kfZGLC7jn&iP-xPy6_Lyj|Lg)S`xTEl-VxgT#wqW{Zlt614KXoAm9U# z2?(G#$0%dN|3}@BAtoA2c>F6U`lB1FYo3VL5`&`Oy5ZSlq317Nc6N35^hW24_5FYA zhS84gf9i&*!SAO(&VHWf?3_c`&~=0^btw@x>%qE$0;Usay%+l6MsI8qpOT~(0@R;0 zrxDg(TnCR#7BIicslK`pr{C)Ds*#LS`elt zn`6Z-^t58G(qiD}Xts$qX@+%=nI{TYvDm20dmJ0tT>Yx$+$-{N{MCg^kj6(*vu{RP zYTx-uEuOQ-dy^A&1D!Ajz5l@o{f$}`|6jUcBvb0PmZ?wUhA#)?LHCcguTN>C^ea`C zgMRCVkv#q9&80)lz8APX1sitXb%s-3I=>NlcP)-gdp)83Sk_$E6P1oO*O41PkMk(uV7K?lQB~*ogj?7qTue9`>#!!SAi1dasHh3a z>y@veGfr8gkHx0qTLA?K&0u+3O0J5fcpx6dJPHC-p+_iPo()}y&tfC+Yg*i~2j-_Y z$-m9FOxB6X#fhao5hsqPp(u&-Veb(lxpi2pguKR^qOn}vW+f@_xi`{t3YHBBr})4r zN5j&ka=myNwF+(^^Yl`cwCYzhpk#Jf_+}OL_5!&7*;5oxXtr5Z#DufGTEnFRbhX0> zluH#PIEoCXM0UbyD3Py&t1a@u!kulO&yNMfB%6fy+Fx3;=rn!(Sb5j78CfT81344k zk8n(G#1LPdLv(jiu7*IalSx@GJf}T3kGE-$bYzY1VYtoxSuC|<-+N$1`c+TUM47In zJQGFx;RtfTqkdR&!Q;!A+(y-xaizu(R4dZZLvKQZ(evxn>#Vr1dQ9SPW?;yOEk9#A zfSkWNoss>{++VqZk_(Cus-wl=<*NaDfZPY^i|#E{@8&LO#%=9Aj<)6Xq?=Rfub#Q!>z@ilmf zxa2yiDBgMgbNZ?4k~a zOGpvIc6%kdzb);BH^^~9%?G<*_^ptL#;@+13iPln??=g5kCOWi_HdlSrPwF)$t4jQ zKXvw^dlorqGX{J46o|Uv>nH_IpjTi`?Y{D2KFSLvClrODuqGvk#T{TYT>+$w2rQgs z5U7Uf40&-JM%6zE7O^^@Wd?^a>{&qN4(l(LHd2WZWWv z$3``x$+PfIsvaqy)IvFK>!MfEf^9K^V-u_pz!fiV%`N@eLRI-$a_SQ#uSf`d@D2t5 zcBkVNJChqRf}x^xKRa=mMgb|BylI}%JM$p-7Og$JE6Pw_QQ? zCr#W6W7BCU9!eE3sjwbuC>hZay|rw@*;qQ3^BePxPY8@;51i@#fq79g9_&DgVTcw& zL%QO6I)nH1j^U@33q*U!ak>6_)l#GDOvTNSKbT)%3+8OOqx>v@Xb*{)w`sn34kce8 z7{)O;Q3wZ^Mf9%?NV=eY+rwX&&!cx}+?XKTUZc`~*7PYi+Ti<6dwl8Ef`@jFKJ2+n zA8Dr3tGB%OTJ9QjkTJ6Tpum&r znrnfxSg~2wZN^`iM??t_?csE)O-$@{oV}P>E)HQYj3o)D6aohgLcV$%Tf{3JEe@F^ zzAuXd0df&>lshNqOeqigmC!1u67oKCkC|! z^tsmBg+WE6X<@f>tNWw4dk|WOhr`)J=_V_Z4O*4sUQmn5o#xj8+dC~QQNnl30}^lV zwrwUxV6w$0KdL`do&)S%<=#}->p1=>tpD`1l+^hpzY`fTUkAK4hL8)>tG7XfxkW?< zWr!PL^ylUt2YpQD8Fu~8;hhp%EPjNp0iKM}3QB>Ts>5NCmd}SH3-}eLQQ%k|XiUy` zz-wITyWWR!m2h&ukt1?XX^)d{NHjbeu|fjT&QO2C-Pds9H46wP0KpamU&1)q{Y0BB z%xg0a5od|jGS|caWNAX`Pd3(;{S1!oz6si>CSv~k&i8kiKbXIByh`FmP$kES8waf8 zwZ({-H@|bwlT$!Nk~_y{x9zI#!}HM#hkl`7si=_&>fl0dIxLAAJ@G@(30u^2DZBjj zuATPpyCKmI)EwXUdKvGY9Sri1KKu)gQI z*wmR6?WPKCZ-u}FkZNwG>s+RItP%$g&EJJ6Nx&6=2ni8@yMF`l%KrwyNYVcQV1fAm zB><)nj);Y*vok4%pCBk(kU&(Nx(Havdht#-Hwgt7G8Zku5gE%Q6-89Fs-OgfdhEXg zkoS4G*r(MvokqSk8kt`@xA93m6UyeKO2+qZoqMXMO-ia)#N~-9E1Rtp<9$yX`v-ur zR9CyV7XJf)!}<&kHE-@CcYg!$-OKwx5C_{eE>1?#QQBK<)xEHOyytwvKXmTf(Y9Xz zRFC7(&n7@KOMdw1m&!feZYr}G$$O*U^>MMucWQ9#`HZ7#YY62)TKD1B>R_tyzW_Kc zP4R7evGMjhj$t*j-IboWKLDKOC}P}M>x*m0CD!H}ynOLsw|cKpH`nInUw=7#qxgr; zCEmxdFqut+u8@*|UBIC}nn_R6;%}X+B0Ng>I(i`{EkNPd;?1uI zr2z4r-$y`1@yTsNaW=RB311W_wo>3Y|HJ?Q2oNU>bYC>GD)4GBKT0;cMdrkh6Q!M9AfdHpre++=e?_@AGY9-CtVBStL9IR?}^x;8>57){taMT?_Z%t%@qELiftLLi9yB zuHNOjs%C7YQ_bvgr?6+~d2m7^=OO4_NOx@N6UkaW;cHP>?!W)sG;4Ny=joy|5rBMM zlU00=e1vOK$P*MNfymzcK2 zVb`Oq9IN`az}2>qw~&daI$CmlQhl`S(Xw;&%4hb%%Y4wwc*C^=6Wy*w5*AL|#Ms>l^NHLQW`N111iX)-EQHiJ-&aCX+on^vR45f@dX>ovPLXURutm@Xh|VDJAwaiXfcRw|ALmYJl)^Wl3{Yz`PZu-=l?S2zoAvCVI2;)%D5GgOhbW)WODumtrw|y zrG5Xhv2d<*S9=uk(A^!0%U!v}AN5$E$W$bj^bxoCZXp1`KRTEJR5^_7MqDNroR83Y zc24~I5;}-+OxZbh9;Y$Xx@iB%_GTLdHBwKW4d9MQ;Z7H$q5)+2FcV)xveN>Er&|{e znfPa%ndCTWPG@ZJc@E3NuO+okf+$0Ed6N+;$W9`(Ty1r#vf=2i}QRO4>2w|iY>m#Lk~;7 ztIK<)Xb4+{dcdC7-M{@ewBXvXYy$21J2g}vz1w6MIaA8CQ68vm_U$H}0Ts$WO_e?g0=+J5W_`{Tp5 zF(moAKy2roGhU3zPYg-B>5KdPtnf9}xfz=;>fohlE{*S%D~wX8<5XMJ`N?x@j0)!! zeD{OzY*l+yhcV&%FAzB+218pjHdTM|e*clr1DKRQuNL=+UBr;g@}qRo225IBHwHjD)mLPbzvEbS8yV7g}hOVlzd`bxb8vBNsv)TjIAvRKDEou`Jl{{6!bT{ zRR7a)s{U{6ivCZ*RrG&LaQzA-Pk+=)G5mI%^gVr?48I(w>}qlt3C%CZne^Lna>6kP zRifiW{iox+s!MJ&Pbc^<$H^bhSR3qI^bg1BRLTv)mKY|;{C1ofv_542aGb%sM*r1u zvcz$=>?$+;?Kt1H|8)+fW=zKacASZ3_C&`i^GWTWj`M9q;4i`D-4FZaIP-+G@;^Sm zY`Hd9H&Y?=N}+it87fIU5XO=3y({9OTz=Ccvwu@ifc471JI-(0alW>{9Ow7Fry{0+ ze>hH?y>W>jbt5J}?@yf=o_#m8StlMAAIknbXD6}6)G?!eJI)pCG|d1pkR%=!BVNj* zS0ghyomXv1?EmRF)6o-9zH7~Pu}z4h6+4lrFWq+R99XPZ0SZn$EGF8oaDO{#Ad0L( zkZICP=Xu?lI0fQ_D8OEC@Z3`B*d_1(h1DD=zeepaf-pJ5H@3 z0`76{EzMNQ)F`1@sA!sd#r2AsXLLpyPq!)z%g5a-D^0?F$j*$TF|pmzJpL(d~!6!7{H&+Ty8FH2qy{l5PY zT>s%X`5zFv<|D+_{MX`TiGqvhIOPLm*r+ABGYo3l^iUogV^oKZyI(I*(<9IedE7H$ zBp2vu)wZTQ06(P4a!9&A{}NodJJ7dByPXu`XZ!!7f*J4!2~Hl7EEkip45Kt={-!{CxRkbuBOnIG zwT>|+U{$!($YTB}+2sE-Pm%v$u$Lh!_Fwaq!hhu{Iiml{Q#$^CK|o2t3-BvXu@7r1uA7Ybm8TFz9OfT+%G`hCDT&6M z|IAa;K2fR}g1=YJpC{3Ptp z*kQ)V-+2lHy?^~g^>tRoe_)Tbg3#vsj6Bln{-NIT4H}jb6Yh@kKRpa$o{~eiz1$kT z`jkh$W$#y>azQLO$hl`4$6~YFD!cqV~V~yvm_LN;Sv>V z8Z1Qx+*+G{OdXaL1HNZ`ScnKc9GXdaMCx9qN=2*wO9v7JC?ksNK$I#XvDAgtUa`2q zShcmsuqbILYdYwnRZ_Y9dv54;HFp+H-YON4rB1`VG)aX#*l;+rZMww0E@V~rvn5PJ z?WSALHJuUgK&YvGQ{p`y+yz)2vIlmv8*mGXBxs4=EZkw}Y~4IutP)BqCHl-4O{_6V z`}4Q&@^0U1_}t;oJF@rkLcanvDM$pV`Vep_O`O-%GRNyCek4xX z{xgM~-4#LfnLTqQl&%|p4sAgpH-xpYt>KE&J<&0;yEdzd#6w#>-ay6r1NJXlc`b2| zN`rSYmzH`Es=YVCpsYL8Nwv`!TO4V{z-|r&ODna`RDFd!U~PGM>M>zh%0lDBqu<&&4@XBQl5pfKj)w6I zN8kUIrz}SR9tJpQ5QnH>>k|86l2!;(eqx^D-cSB*A44Wflx$p4PVx5UTr~ zIKTI#9A9v;2f~WVYN@k;ND}Xp0qEOeq_rez(%Xxq@7T6l~Ved(Ue~rGZV(1Tn(y;rtU6AjFHKQ(HN`U|HQ!XR09eE{w-`Z z{!7zNP~(40%>VUi<=;&^F;UTfHSKDDH|@m#Pn&ipotwm_9f%>#_jl8dkNle=F){zu zwCm2XQ!VWCJr}EqRVAjPL{l!A3m@tX19O?EZI$`l>{F+=8qSr!K-^Z7{&Pt*aFhsz z{%P99S#Uk-zw4%Ahs(a@E}>pAQ)xk^>Mz6fJ4%V|pqI8>s^6$8ycytFJ^l1tZKC_> zw}6`8O}jqRz*-xF8~<$Di6$Gy{d?06|3I8|r0kxhbGOf9?_F!rzKwb$IyJ=K>Q7=` zdg9Z(6D&a0;dB3od!ZzCv3l&?(XIHOoQGTMf!D-|m&6CqJ8jxm{|c30IVW?Cv;LWo5{>~e;C^2c z;k4Ahge_&a_HV-5X-JHsQaCB@2yk()B)AeUiRpz1J_b|#S{#w^tFe;va`?#7-cBq^ zCJ$Z2-Tm!&EmVymy%WaEa4yf4xOu<0SkLppbf=!4iltskguwe)GbvMKuLPHcn! zNP&g9fJ!V2?WU9lpV^1vcg)R#PfFt9>M#M=ktc#Eg-fFtSt{e;1t%?=^gcUdB zEmL0Q96tS|>Gg4VxYqaP7PYAfRMO)GSNqKK%1oG!wBQ(i zq2{gqvl~1#xDaS-Yi`V2%Gq?*JZN36p-rg@GeV~wzZfzM07{likjuO0im1sGC1^xi3={VZL@MZYwO&t=*1oVb0yp`+548!OM;0<|Omnz10(W0$MS6(^+lS_J*lkw4Gii`fK@uR_ z)qgID)CRBnGHZTVuXO!TL{qRKQk|yh7AF@e9%DxxQ$WhPh9#F0Pz4BN#IjQ-vu}hH+I^lQ zA=f>Kwcyd*ay4oaiRuB~YPw3UfDc1vAH;k6gk?qG`k|q93Aaze$Uicv$<_3L17KIl z0Cj323KGmx^x9sB0u02*D&@m?im#n#@@WYjCgbDZ^QZIa6j;z)N~|j8+c=-*)GZB9 zxFx;HMT!X1ALnt$TjUFx>tyS_fcJLaQ&4+h*fv}z9Q}Nm7H0baUi;w}*rW)vboPmlvdQbH<1@vJ==ZO$zofnU%I9JfS+_7s!r1k10{R%p%s|E_`P> z9t1~K_H7dQoCzfLp&vkZM+@KJ(_jZ#+|{p(gp8C0dwCvm`}zuqe&U(C~#&q$M%3G#-59=cD{F+vjL$M4-7z zatpv-U2a)kWBj=8x|XKV)x?77qvn#hkLvD#QLFt48kQB|J8ee9=G-(>vu62qN&+QP zfvc^^w#Mw<{&lX=BYHBgJKPa*5bFI-wn^oi1eLmRwG~8JYo{vra7YXbJ?e28xK_L} zg!-$!S_dA#$E^;IaIkJ>`pco$pZ62+m|+cQz}_!O3B;ZU2X}X65epY8gm*>^Y@W;2={h^0i!cD|i0_rF}ZWH*{g zKlxMQf#~aa=#|2k2~5c3lBqS`jPNJd#v>Ee?cNL2uJuUI={SvK%(}vshLgamX6mqy zciLM=TjeCO`?^*y2RZDrKSfVgSe27w_06$B0rG$!0b9@x9mkApWvxYT33rjFMa3g$XA56cWd@>^{)tRDPSP>~*93PNCw}3}d?x6@NG#m7@P5gXwumqN7^T*s21Y9Q^wEmYrRz4gUxU(b=M_8wR?=3gC{eLh4vl#qAr-S`{UXPb{I0(Wct1n;d; z=~WmgH}!HP6LZhU|18<#Jwx^i|(yy+|KQn?}o`Br2iIKQ(K4Pp*G7#{&Q zv(T3ud8)B$DSc5rKeB7m^l@Y|ukV`(L}}UD?Z*IDgKPW(Da$zFdAYHuE!;P7kj&Ah z10V4#D&jJOS-1m|Iq%$`M_`!8(lJt%c3@pVRoTsn?@U5VUFPbownEo1|D_UM>0q}~ z6&ty5!wIq$`q&5i!K_n7rjuC!@rdV8|ZG3}3xI zHB>~ER4K89F38!@DbB7<6O6l%iVkKENK8K+OF!-_Dle}xJ_M;O$JnPmNxv`SlwSRD zi>CC=K}Ds!ga~px|0M(E=;PV<1aQN)-lyC0l`KD~o=ltF&?SwUbPubm6`^pKnix;b zdMe($_Fg^T@G5Ovkk-+vUWnGn9h2{6ihCWjk6ho1j@rl7n&m`X9U~1_$?OhxQ?}Zo zM1pfSU{bxOd+4L{`Eb%s!xF?^?)&zTgqI7ZXA{b;FU%$FK}h4d{xdnHgBSXBRh5Hu z3m#~)_+95lUg?Z2uG^A(xfh^nQVdOa?W7U+iTQS2_XwoFaTgDQ(eoRxCIAuNi$jlo zo#SABqANv_S-3|Dlk&L4-DE`zr0EUqxoj-<%0iYe(8Q#dOB02Pu#7IQa?GnIuDZyo z8zR(7qC_kpR1&%G4>Y#!Qyp=7POPoXCKmhQ5+6HWi}?V#>25n6Q=FD^LmZq(qoGi^ zJO(7la?0@!7id14bK>Sw-GW{W$8P2wue9zZAd5%GBOnRlUKRG~-I;V$krk-5AK1Mm z(HZo5J2W0)1qxAB;?|$Ie${AU#{Ed?p@5eVnIBH*bxIe-&pr4+s>bY#C*W>Gbi_p( zG7t&v6>@+3(E3R|iYuz|42cm}KID*&83Qn<%wB9#Ji{@i;fXfZdY9ma41`3QUg%OC zr*dkZfNpn{;QS6i6weMNGrgQzJjv8{JkNcfaJf8e4g1BN>q`2%@4QCtHmS^X30&{4exX!F7k(Aa@e|rQEvz7LW-Fxk%C26!G|=t z+l@l9ui|$!# zeBYo+4tWKKTVa^4Mw)kCdS|SlxN6Zuty(pt?XWs?0Xs=Npdbn`iu0<&kkOl%@!FG` zi3Rfx_WI?P&;r#j0I%Kh&`>mC`NTtYxGs1p|bXn^WIzR~LFVVEm*zrj;989V~MG>xf`hi~x-jKo-O&Fh8K zb8}lekK}glw@%^aT@1D%q{q|nyVps*zaLm{n(b;yz;{KA_l@^hMiPFadPzCr;;KFt zJ+Dr~008(KCg>_M>FW_2^ig2)_9B&!)f(1I+Z9(WS|Cd|Sp^y7W6p)TWjkGlK5TmV zUH_nqZDEYs50g_|PU}|Z2=)|nSCpj$DPoz~=8;ZXWLj=)gl?ga*J3Zew%P3uk}4?} z0<(X5%W9yBUu%kREef-{v@VD47ro1M4d7t+9-E^@t{>=e&sL93#?FWX|7=pxfQ89v zz%r3Xito`fUpxS$`;m;Sl=UNkv2Cny^FXk_7b6+IKBmw_{`3&CVZP}vb0Lqy7TSyx zTK`tdyz3jsYV@A@;X0Yb=9>WZ?m~XfWihjpEh(R48_k?*w_Ft9dZ5PDZKLl_kIKcx zBf>Y-k5}gMEV7)bimG;b!)5m#Fj`n9zz3_2IXmCUUSPVR4YL9ayB@>Q zUb$L*?_um*lHoHY7Tvt@KcI8~#fdsXvn`i;oP)tOy+obw2R)nz{PGVvk2~KJe517P zO~4w9@O6A_o-DLWtTdI`uoj8r*AHjxUuvAf$$F1*v{m9vALol(KlFn=Y}5d-JJwrj z$v`Ss0!hjadH#3rPbyCp=qsOU^yd(EH_~!%(!o()i$G9Ph!RPb^l@wef%K5D^I?Dt zwvACqNX}QVd4iKerKo@HMTCJ-$6@2_MSkl0IW&UrL<9hazy}6D1!Vf7`xuS(QEqCB zH9^fh9vBmMfp5y!DRf@bb?wt>^<>#l7_~P#P*LTcyY0?lQ6n@3Uv2FjOkJ-kEyEnR zJXw^&TEWlUaD?BOMdr zp~SB<84K8n3vHm^C!awWP{BPEiRuEAEBCb1o>bFo3HsCfZ#Kbd0DJocz8PU z5)~4_xDN)ekht^17c=O^n4DnVG{p-W1 z6+owv5zJr;OJ=idL{!j?h5Ax zk4$RL6`(RI^1W@;S7TTl6XjQJYOTJ2B&1i(J|GMYxf?`@#o>qv2PRWEza@ynLOT19 zlFf^u2n-Ds@SH5sDgaaF%F&vkWAoGL%v$4MoXp6A-Ooel7Da81fZ#MA0g#dwh#CgF(8Byi4k1+z2Hk^L;8Lgx zQh-LOfQ`gQtAZ>5kP;>-29=zN!8aNv;sB&%Ua5S7Ozay#G6X5rJxUou;u>~ zfx92R1Uv!|p9silSjo*Y78N5%G$N$*gGkJXlMcx2jLyUa!h_L)M{UgN4lNL~!E_wp zF~}L}_X*0n1by@g+~^9X9fbI=rruPg)|(-&;KtOT0ID+fNt3|K_{RiHWb6undXl81 zGqcI{mK{?;a2EKo7m%hk-fRQnJbEtH`AclHdrY-1kgJ0Yu%wz0QiU zn50PN+ej9nbv&?raxG%J zfo}QuJ2a`_<*vuJ{C8O}KoUa|Ed>acCjb;|_^B``mIBHHz#a@iv&#yXdnl>G^F1U1 zO#47T<|OTk3$-m^apaSZm4bWb7z1~3=`ciesA9gZq8R?9bS-@hP-s?=XAWhP`U+%3 zg~GZ>lsbzf6!Im8DAS%@(5nL(sa2LD`Si@G%7-cI>m#yOq7Yuy=Z%vQ=WdnJh{_^7 z@G`-Yq6H*u4$TZs_UyW-lVZDWSd@g!tu_q2O3FU?{eFiQt{?`|`i$y_E~Nfm%@ISw zV|aCgi|^}UXzy?`BnBuR3*ODHT=A-kMb)hW;!9b|aVwSZoC`Zk;JQ;P;@ArP^Lp~> z+Q<8KNtgyda9tO&A#<`mnz(%336;-Ewr6+%|4<%HXe>2sl%Z&h0@TJ4C(tp4k5;NJ z%^XKrsFiM1*Gv|M$25T)?SOIgVmGSTu+j6=K*s%I%6oMU`@r%n{4Ah31M!rnvY{W- zoMl+nWaxW_Zg^{$C_9jmYunH{3B1G#3)<#w>ug9x5`XuP^Znae5K}Eaui)(Xx>&*k zNyTu-S6~WAVzgHn)i#>WpW~`9H1rg9cd=;=9~$)odfR=3e=4@1C9u&X`z!B%86IOudg83PU`k1Sf@vLyt z5umIW^K*RP~4WZD$Elt^w zgv_wey7EOa@yWBgPO4nUw^yY0H(Hp^iBCYTG-$~`D_LpgZKpb8rrH<)j-J3cG58O0 z;Em_tpTg{f0kI36BuEcff(2EhOLJXL;FfVG*(jybep>uWqfu4u$0rb62-{zZ=sn*Q zUsgQBXQ;bk&y-=mava!v8=@=%*_7>YhEcDhTRvj?OP3l_;UGOW%A67Y5D(~O_Y8zr zulMJGQ`DfB#h_??-xIICST>o(?Yi32!JqR~BP?R6me~s^Qe{+IngGvCI!_@lz&>P`#|Aj`zsAlJNjn_p%;F`FxZLRG!iylKQ?OjzWoYtn%Kh z?Lg@ngcH!+Z8$PxG@K;ax-)$bLh3adjRNFUWD)lbiohKdYu;U>LQkLH_p=;rfDgYR zQb37XM>l@*3_AQ8_CuKNd6v+`Br?qiu=2T%Y-O~)l?kVH;pQllHq1kl z4ddtmNsob29cCi%#7S>DLClQ88?gM&i~{?tvM5x>a|TBMiQs9`)nFFxi=}?js_l(w zwv{=ub9#yp*z@PGIN(n`C^KfRyKYt#1s0v0&4ACQ5Q!W)R-&~YMysSzTg(HXd0;>K|-Hmk50pNT6=s!FaYtgmgT z7R;=`XEZ;5-jpob-b~DkaANp@KCIa2*vsLO`mveW*(3s1bZ&HcVKH%ewBXJ9)Wqb+ z&8&F*ZD=FC#NSnKTenG(fZ-4cW-w2hl9mVkHGzL(G6@|xyO$0n&ajX zpA^x9kChX|OkrQjMA+nG+2g!5qUx=5)rFbMT?_1;2kvuGeej_7wVu$vQsOz=54SFg z7PpND#ZsGbhlXQS?6mM!Q}&C+V!;w)4vm$`O$;7_)WXB%)2%6Q0uGJFa?cfeqI`hj ztgjMPpXNP=G{1jocbgie-M0H)AK(iKwgPHU`WAU^AiTNwD z)^FV05(JGv9xmb7C|3QIGuI+pbA}D}c$W{1x^cX^S`4Zhks23Lj~~x1$f8st$8|=3 z%3Kdnn!7h6`LO_!kcIg~lHni_**c#F>UOloV_85wFdEo2iW73^JP2c4{WR^TRwye# zd`R1QP(43;qa-_Mh{DOf#OcWRA^8}^tSwo(%k`RJ@bV+Q=ux~nKmf*728z(Dqc10y zpmUSM+?3(P%_}eDRE{evOekIIGUX+3L|P77aEBT@)i_#y6}&Umu$7wL;Pte~U~&I@ zH;jI?@^1OMaq5S{_BKX@{jJkBJ%_8bPGwk=j;98is{IqoVQ~wz z{VygRR0ZfwStwzHTRERzC;<6ZiQW3}sY;aQGx)W(p=Y?N2Q*vRir|=6@0BHjNj5Nr zTx#K*G_M(kVO!F+o%k9~Agcs}_H~CY^6wee(Sv<6bAiKD$`T_pcDEOtK16OfQTN)vZBHTCK+_2HMd-snE+g!;x#4#pivAdd5a3JtZm$q<^rFO!;T0}(;^58Z2;|%`K&hrzXQ1ZfvOCFzu?m%I z*W%ycGdmB=&Yy`N$Jkz~`KzBtH#+IaKt85#R-0wJ>pf@I7PDlp7Q>l5@wt*f^ z!b4Sltjnu+A-H~UP0(a0+w6tAxPe5_fkVKnkT)a_6y5CJNny9|btR(@DP1G0RHb#o zpfkPI{+fN}%{jFCb;5}Rm(6MR3W$n^ia{I$KH`+4Q1`v#hGh@XRil1_Jz^raN}(z=6ldUNwwN z#6MWU{;x6@Ez}SVjiQc)bqZM9VhHB&GIro6-?@2OWxF>T=XXiOOr7cbgHf+Iwq?qJ zb=3}Qx0JgvR}II@dIR)H?JGSv4ZPAXKd|(EAjQO7CIIO_mqwy9t1fZRIrjFc-eDTO zz4$ZnD1!GyT;%qwQ!Oq?UzDXX;nZGhwb`ljOWiuzRpFWAWzA8|_wVE3>l79~g3Pag z;fWX2qAh0mpti_C(W5P^sju>A)xn*+;dQUX>k9x8&3ll5tDUm>o!V9!ck`?%=_c2h z8f3btQnXWPl_^#g(C&@69Stt={&MuCxiT7s@b~ZxbLgcyQ@BDfpSB_n9<7m@a3$vx z`I9fX2B!O_+Lu%OT_fRA9qPy!nysMB)^jR1=2Y7ykNEo$5CV6Q6s;x!ci{e|INdl# z6f#nJY-m2$blI0l0k%Xxa?d#Xg9GC+=_P*hz5l(`VSjuu58fZbE?aN?-;k-X5V_KH| zBlqSTp5sQDuY@lwn9pm&b=c_+hm|fQo6n0eG%sTx|7dV|9dl+1B0e+iQ`tJygM$9n045K4L1O6>k=7K_fVq=DnB{ z^Ho@fD!b-Xwfoc40P{$JnHwf@so`#h?XfT0GSWL<5{ldmV2q;^kPF*UOZ)&CW_y8N&JE zbFUBin21ZD;>D<5b3NblHGJ(eGkrDt7m3I9k1QGJ;FV=5@m1raw~FZ0rzF`0{i&Jf z+;!bwv`nyz9b~vfB&+2u^=t`vMz`p-^xv|m>2*zR4K}4W=V-kFpRWysb+AG288rZB zs7oj}-+OzMzSLE5^h)`po_D@AomAYPaw*)tk1pujursgsl`oR3O3`J_X_h6+x-lPQ z#Vu$tLX(dxmF<5vU0m*MEw6hs;;e?U1yZ`YN?fbkTyTZGqz8@^?R2~yC={O-}`EZU+A75 z4!M{(Yc%j)q-mCPyex_7OuQksPX=VlT~~W#i@hrE20U9X#5+B=45CY_DdGFR1BuTW z;rDk8FpV>~`b0fJp%Ltj=c!Mh8c{Td!^loKwlRi&F247$Xa=Vj?f_h=y9 z+Xqt*?mZ;TP~Zkt=SmXYj0WMHd3|EJt?G6CZ%(Igi#z8#KSyxoJn!1}6_vP#zjn7g zb=&EZ!>rqClL(1Tzqgf`$z62F&Y*tQGEYGEi0|8rr!xIrC(Kb+robiELhwu2uJ;=hke_NTtqneKmDH{}`9n9n?J(Oy#UHsUU{X#G|Qoij6^#;%M1F{c4( zRA5xyz0)+~neT4Fd>k8$TFZUlKpx$O6)#c>EoD{R7+&jECpR(kPz0aTKx9zHH;j3K z+%f9m&kVx?Jb?B*l3H?7t#cAgV3c`1?XKJ6b=M^v;bch3tx>PZ05=aNq(}Ha4cqc& z;wJ!DKdNK_?CAi27uRov8r^#uedALD`zfB;&-}t;V+U?I?v_K0dbHn2pi>7wCfd+D z>GGWiPlC2M#XgsE-Z52uCTqy|$enY5?Sh#&i`QYow`e4MdVB#37QNwg$RcL=mQK z2$NCu+8SSb1(=E%zXc>t`328y>XmMy9!ud#u~B)=`20n*|C9J|Ky(8D7;YHeKBqn8 z5})P`mXER%v=Ad(Ocs-hr-+f428L163cNzcen`K;HQ(^L4AI3Z(mqOwp<_r>+)qiaTZa^IoaPOQxEf zYZgj@Y4PC^sLVt#bs#Qj&+bvjks;fv3EC(llw8hr5k`EORM=RY@1EP<;9b66A9R_4 z;Sv~vBq?vRP;-(Bn*%ElNVa6a^>QH&^*H-)5)9r!WRD(h()l!O(ix@TE;HZHVUT){ zOQDU**+M59z|9Jx1-I&H3pcm0-dFI?a=10E`Ru(kLmdLk}t4 zF?8e5DGsH8AfSSPh)9Wqf{29PJcsYO&M)Ur*w3G$V;W{g_HnqR?ft{2EFhs23oLG7TY{Mgl0+$-FNIW?Xr=B=aptY%twE+LZIosij<5CF=hy$QWlsN zP+1+2_j&;O$^rURheol`Y(pW{dPET&pyz?AiI#68T;hWlw z{z3|aA^>cM59v@qMkGXAw1Zx%^^j1*r;=l{sOA0mv72;~*`{7vWQ7=S1Cgx9hN65l zg8!Y8ZhAmfCL!gJyle&o)b(wQG~^K0;qcNlGFauACdT>D*10ZWr+0dPku@RDeJn&- z%W`fCLYHb15WT}CEQBm=W3o0UO{28~j))Y((Lr07aI=g-$-h|5!QIYpQ$3`~cia;T zUF%Rc;c3Cainn5{kxgwhyS;WvF)q6#@tnZW0ZKX?n2N|B{G{a-|F}ddqCTuxuem|s zLjPfKOGE#|L~KXbnqG!^TSrQH+yWpW4Z8G(CAQzH-shQQSI^}8My;8Ko}8hW*N@*o zEg`)&f*lc}Rk0FqFh3!baNZu7TW+W#6j$v3quA=(y*RrBQUmo@~foJj>lUk_i)7aAnA^iQ9H;N@> zzRtfwq{B#H)X|)2sG=x#7!xKt9?+O@(iH>AGbpVY`s*{QJkcLMA$%kcR@H_Y4{vqZ zJ8Y*te2~h`{gkbT8b};}WpRH51!UHTo?b(vv^bcspgIvKKfE8FKugCxX>`x?Ca5?a z^|FBZ&fMPt!pFR-wAVHV6I6;#ccN96hlcGB#2f;ffrf-QYoi48eF;E@xe!{lJMBZ{f8HWc*0T8vzAQ=RZDxg``|CwG6D30Mp z2E0?&k4+n0AH}Gqj-Pz)IFP53Hivqg%wED}$;BU@WSlTp+$h&>0iwjD#-8^qDMA{2 z0Bk7>rvE{1|AOAnOe$SLPATIPQD8EFPH;nWY#0?c#SMV{D6ZXjMxwE4Mc%n}IPtk& z>jnj#a=H$O32odpG!E9Ngm@N9c2^w`3{YDV3?EATTUl+6u>Lei{!hpL9q&RQL*zbG zKTCxjsyd(~3Gt5*2xJty2bV<#lSRDn{;y(7lpKox#0DhyHUYr`7Dio>kza2SyIk^T zckG99B;5lrFUFsi&Efa>Dx=u-ggpX$MQOGt3`NPzu zVeN3Yh0Gr5?DEVdVS@Cn)DcS|v1LBBt+dQL<4GCo7y8c!>VTiugrWQCmf1v* z7y{gm8Gpv{N{?$~Tg54Xxw+-A#%^lrlj#V1WB$@x3^Lm$fz!1E0lsc8uEKmc%Ww9g z97{xRF9iJjjarVBIxGKoGwl+%tNSEevy$XP3x@rjDBNeT}4Ue@7s% znGPc+aoTm@6dDdS zMXe-MEyc=mk|wb*UI?D{H4^IWr{KwvbFuU#5e2%ZJO7kvr&M}uV)CDGrii||U_{`N zWckbToI@+nq~o1**7tL@v$f%Yp|F;gw@V-?_?6iLgfbPXMgiDV0ILU-J5*i8p*FM7 z+hp0l&scgNKIy}r@G0&~dxhhKF5~t)y;kB@K*jnIc6KSnO#@1bDX_CG9_5+o?_2iD z5hc}4JQ2ky4h}b~(jqGN4!n5!dC;&ln5v?TKB1c!@mE%wL6v?@KiyYI#>8vC2v**P zn-bI5h{;+m%ZcLz zu8L^ElVpZKq$*AkwNktE(OX4R8^mmAU^dSHY)w7?-;BWoA05BplSV7(j39j>pVgTA zXt>}z{+ei6uRO(*PEAl&QcyoHdJ{^49oJ1PNyKyWR7pyyD_=rL)$;lL_l#HdKdcHm zzG%z0HS!n;R`71(Orh~47A5W9MEVNprfAVZ{!7o(N**1-6>&B9X63%tm?9Nl+M7h*Id)Th_x$kd#2s^2 zjcvBK=1~Jc&3P7S}-6M2Lo%tL!|V|4{wUVliX-5vCXQmRD09rTITzm})+E z=>Nsn+;@$6k!E@Dhzg6^U7EN1HC+IWD_`d$kBBb|AVM=qEK>lO{GjPD{#ir;(u&IU zGrbrDJLU~G!5BP+bT)kC230&*QdI3ZOB4SKY{(a;xJg{QCut!xZ#+Dg1EN#ll8%ok zJ<2m6iBk=UQ?TLAS*I87M`{%$SG^naC<%4be{l0cO9LVXm!5g3)l;95*|boKs&UL@{0!^*s~-zzZX?Hx438y(`r0<$O^hV%3A zT4{p3s?>mKTJ3apUVKSqn;`2nb@ScaB(yDgAJ~cRt-aLu$ocHhHSdR6>LtM&mAqAk zxqOn=uFEl3ux}resTO6pyUu*xVY#VTkm>a$wF@9}*N1ZYCeXuOZ%dHS~_LMs@y~Vh>U-8Yvvsrp0^{744b8cA*7F6TJ_cT7eUtI5;s12X& zIq~b@|FtbVt3q~6+T7*F`&{8g3ZqA3{u)&yU5sI0%E<-8MMNWy9Ntcx`)1f`UE5K( zFY^J2xh;#l1^li(h;j1jaYE_Logpv8cD`7NqH0*!i_c>W=Y2yRJj0=@|BG1Cq@>_$N!?9$*Re=umKh4a+qT^n>T|F!uCR2_&b(>*YMknPIu?9G zeQ~|>AwpP4V5$r$MlKUWsa&?8E`Jp>kg^#0P7Mc$CL_sH1pcl-+{l>DwJVBTQaz>g zWY7HW9hx_lKRxjZ`Y-^j)_Ud)_E+FvH%PPQQ7u#v8l!t{GJjvj2)n&O2R1w2hq-J+ z2%D#xvawl?{aI8_ejW5@-0u9|2HMGf42^IHUWN#l6eEOUKix)i!nY2m_l*tD4kq15 zon{iKA)BiIOaBQIDFTvACBv|do2gbG<{WGwBmB)rspxc`TZNfmEPNcoKu;0(YHLX7 zM+0lI;&!gFdyd4kNBR%!=o-tU1f_1A!05_X#KEoTRMgI|lfEVvB=hW0?Krauz#Z#Y zQ&D#m==CP{&g*`yv>ezNnSIHt1gkv-X=mZM$Jz$>-ZJUkn8+FV@_;96XZzKfJAM2nj3>COzla>K-+Sl4jdW|2MB`15 z%6pe_g@^$vk`@?mqQ{AdzmLb01#WHU1J5Ui^o(tQ@p;Z45S+3~0}Ukr05&Go&+|f& z1YH&@F9jrR+!G8=lFDR-9>Pr5IC#>qaBwl$* zo9w(_suzQ(Jrh#~bz+%x%H1D$yByMPDUAR{z&8sh59PGndvB!JioIkdtF4yOv!*Aq z^0kT^=^Y(jeyjPsQj_T@Qt68%xzlC!yG0m#VD#^@xxM;OZ8gu`X`ZJgdTc-bvl}nJ zBfFWyi42qQT&|aa!SZv>$BIeXG|j5Ksc6N<`zE{m(dmyT!XWbWbuV83z@+JBG}oX4 z+|hUG(rnfvErw7jwXRgLQ`K9VK|K`u!=@!7;d?u+>vEHJAkgP$IfNI#b&LX>=)ZUa zLgCSq2_VXVaczCf%Pvc^t+f(*QT5*NjhJ2C=|-(3&2aHomiL(qdN;3sF>vwuH;mfs zFU`YOkV$BavHQ7*mZ}BU#QO;?uRNFg5;rUKMeb%KpM}0W?XkeuYCn&+Z=G;DCX91z zyx%+e?)+qvhZx?XP0btt`3!R%$WR7`e8~S|zmLC9wFRMaT_AqusU?Bt>ZBVTP#4r{ z_PxpTjCT_>_Oe2bU3|7>`mAbmyz0${_D9ij^iYVH8<{ld!b z$p-VZ{K-d})eR}=KYeG$*1PvurH!WOfh;X4nh4j1?;Gl4u{b*)NwQJ9_e{wt-aXDy zUBmgx-@M*lA9XVT-CT&6We~Cmo;xZ6oqb%b(Eq2qw0_k>XLPUUwBIIb<+t9l-P&`c zPLpt0BMtn~bq^lh`JwZoz;CnZhE7sKhn9z6>CSZy*FxB_E5Ux84|OtbwWjYt zk5ZG80HbgAf|6~5lbH`bY?=O?ee`3(#hFl?eRp&T26emt2a?Jqtu{A0+sF$TsW465 z8HABXNFQklj;^-!aur-v?U%MY1k8`I-kH#O+6wZigK(8a$lr4xZL3P+CzWpyd}kR< zT`?TWl=t@BQ1xf#LHlRAo7;ue7pLJ(4U{|h%dPrVDJ3wtp_pU%M}e~EXufz)xr%*` z?o+}BOFK=1;I5)r^kS8B3!DGkR{6J6`r6~@`G3EQhf~U=XvX~gTuFJeqE%?_Lg`nY zZ7GE(P5M#N02$cnVT|OL?BY@Lf=_XsGA?bQs&JD3q;|7MYV`l9hX&DwmQ2w2bR;d^L16xhnk>j`XtDbNtOS|8E3_{FCuw`wl*CuYR zG%h+ZPF;6SZO8?J9%$&m1hT|&0ot~;00Ke`^AXgptN*edI+pzOhC5vE8&AqR*>#jj z;cu^Ksi)%_3B7dzH+(gSR!?XtH{j=)N*tP13JWR=GAAXN*lpeV3b~jF01jzNe_m&@ z1=&9y)C#!BaQTFNbN2pViga0>p;u3nWfIjbLUR}r!)1d*_z~@U;IB(2rUFplrg)?U zg$&Aea#RlW*!^Ru|C_NeV^2)X*GCNqUVWVV!9pBIzR|N#TTek46@$20Axx4i=8B*h zkZe<4l<1eNAQQ?}gl18o1?!_B5(JP&5tL*z21oSK?-Wn!y?b{j1WAm^zl>EUQ&FhC z{g6u=R}ir5r*_ZAloUAq)`{v@pb)^rg;27>I0|hfr<3brKY0qGt-;^Tkf-6Pk2}?n z4R?ENZxU|yUDoi*rM58=?;@0S;}S5bZOCX5qL-UAb*EPdUkxgW0A`K|#A+nRV|Y$4 zA(SLpe1&XEq#X4MA*T&NRgAb4D-O?stP{A$nNA{UA;nQq+Jr0=kL2da2CLv9ulI9R z@UWx_tN(>Ve_qg*xaIP>xa6MjSm;IO>*gA#h#umdxLorTQ|{3XpsJG1K+36?e2{=KsR6 z*F=ZsMcFu19*zJpz{7wiX>aABw3v$UU&9_KL* zGJvq$>&HOq766ptxwWT0&lI4nCqNtlIQKm~RnwopKWer!s}3Ucg0JYjQ8{NXZcQoQ z>6?Ytw>u1Qz_gMt1A!aA3&2)h`G|kBjXIdS4g{LRE z{bBL-#V{mJMHI%%uohieE7%LJ0)-)mH4@}YlK-=5ToH2vu)_jVVP+FWxUA zq%ZOrlPJWpyfWwnVp-*2A1`z@-0vhV;9mN zi76$kq8JG{36<<7HQ7pGB6YAL?RQymt4{Lr4C3WjsEeo+tjpDQvVnwTpJbIInPlKV z^kh~4ZNN;5Vy4YyoUS{?x3S6iQfbON}NNuDNIG$7nK;c6xlDaXbWQyJ~az>oujGk`F`m+m0`g?3UF^>=y5TW`5yUf3f23batUi3Ijr!p4U^GKYmiHA zM02%GT=QaN#-8YezlT#2NrN#H;c;yz^7zBbO-pI@jFImF{@qUXo=lwTTW1 zmFy;5ORYh}Lvpze&2pN~rsWe8sk~>)daXs1Ny%t%8M=eks8(^Pmog|UnyfYMUGL+L zs4piajpL#|qQ?KZNVJNyEKG;8ddNNdROorb4b&~b;Cxi|q&vwYJPrSP?{5i8MV5TV zwTSulxry+No2zArK#j7hiZ@jwyF!zY@udN+aVI_cKIAPQnRsQqWwQl_-jv#e;iZDQ zA9~uavge3?CkE!!J+BRn!~HIq-1hZ44{L_@E4)4G@zdy{nE;z z>m`7S*lf;cX}>%j+u-i>$cSSMukJ56ST;0F@ej{u34Cn?o3Sa3L-W62bo`eGyi9|h z`64qz#|xRmNG@q=-i#_-cl$;WZk&{wjbY zfYx`1V@9Cy)9#_gVCn~c*8K{JF@xQ&%~kOoFm_cc%}oFoHh6#0hBvCsQzX@8Jxx@3 z=+VI-h%(f$HG?gQCQZ|;gPSV%iu#@-xhi%z`EY_v-rK`bL&&&zN3m^}uIIZs!Znb1 z@k>lPwH&H2GE_?C$pXe_tIA}7e%q?*-lR>Hc|js~kjJW?Wp*lQ$ZZKjSB zAuWe^ivy9CGFY{dX#sjjK$QG=uYHzQPz+zZ9Qu42J8g!py!bv*=aYFk<#LX>BbA0+ z8q}_6b;(cD*?)|Y61cgW0w)I5#w1ZTZoOgz=bDfrrV)uiK8@*9wDNVJP+?2pUm&G8 z;h9lhpPIJzF2}?d3bX*34;~uMXCI-X0*&+|TxO4PIrO$|2P7C{O(&W+2NwFHYBjwU zbyTqhzH0A`VcMGj`OU;fh15bohg+fuii3s|ODBQ~wD1~P+4EA&n1UTfKgQLw#pK71 z&r(*`?5R>P2Y}@l!2bt7TxcMoxIT(O!7*<1IxyCSH}r?gkNhij#jBFnTU7RLlQhw` zEC`9JT1yivlQJGx2lYKV244=t-BRiEwaQq*lr|MmkQY=nqv`bI%@6d#33~NuOHa7) zE0|;0-mtR&i_Lz1_1BEL0p@F$Er{e0(jCqoPw(5 zJ}JKZPThaJ79f)d+FE!aPoNDX58cx<7Xg_^LK%G5AV2>PievToFe_&b@C3(1_nyb&pY z1yOB%`bC|08OSHKantdo(V90}=^>#@NGsFx*!ceCT!a;Hk1~ml3<*#}!#FXOCYeyx zD7{B>dwE%_@3EV;pUqPLHgoNBc^Ne$uTp=;%p?83b+O{y-exD2LN)Qi2>3TE*^S^# zhYB$haqq}hBd6!n_0&U(x$s>6otgg453{x$l!%hMn{Td!p+o;5U!4F9*5t3kX-jWS z>-c>O^6#{N`yS2?eJc~B&!~A{w_Oyzgo-t&%8Xtt*!@O2XA|?P@Pzjy8mf%~u%kEr zq}?J1H>(Wd^8l-6#7{W<77n>vw^-j0zaErYj!~^5FuZuno%#KxR0E`sZ>x z?MWD`#nG`X`RiH16gMjaNe|L|hTz1WH0Cyn*(A(3w-5B|$iaw-6y068-`p9!==x2w zcCXABhUB=~@z1))fV*SjMfKM>Yt3KLOpF15!zidr3v?WQH8YJ*#@s;u7 zLmgAo9mLuBWC`(!Hzo1qqYKMx>z_;5D#q4FD%+E9s5kIg`TvJOD{R_qc>DeNi;wZ= z{qL?m;w}lHXJO(xeLh200iB*SF1;aJ&N}YlB9K_Ng#+_w>3KBn4l@*Ui8{zO&=)c< zw#@(Wxh8xFb5O$4TF9MI3A&NdmSL5O+mR>N`4B9$SgAtKI0x-+vP@=B!{$r}euUH{ zD|3;5C5}D|&D^Qe*3K_p4k|Ksp(<=-lPFuv88x}J7geE!52)RA1AaJEtYg;y4H+fB zrrtI6vD3j~lgvHMX^DfsQsCO0NMjpYC7W*<;D7|wzf?w%7wn&}GmM_ynOvHI{#AW| z?)A4ra~t@dD{+ASVqD;40)QT0XO(%vAX#_EgkAQ%WrZkzcH{eW_Yh@?IdY^ zd^1%N;@6^^lGD!*%73FJ%baw6$AWqGlT@>wfO>PNtoC`NCYzn^wB zBh%oEyC2!KV3lXWP*pJN)K^w$hJ9t;KOHsh{jD&`?y4r68sK=V2hE-8!GN@eEaaqc z+J;fG%y2?%eDZJnw6aj~&O6t26zB~ZDphagUNA|hQ8dd;A~fQ1SbDBt3mZOf%=2W6 z-|1W6_QvCeR(ee!O#)rQ6RJoM2d}ZuHgiD5zlFE{fe$|jimZ6kHI{<~#;O$1RixFL zd>}^7D7W^+>d+zgs{}vOfVSZh3HT(V{F*udI9t^E5qgHzneV$3mmiEPx`Fmx)!{MMP&r zYwhKl;x91Vpq}RdS%weusQJsnTR-^HQIFYoTbABQF2epj4VuqajQ@T{rqX)Z=<1X? z)qcQ^{_If#rd0s739!AP{1CeZe3n5xT5l3a!L{XYg!n!~h|~gHCzzi5;(7|Kl^o*Z}P)NwWq%zbBwAfKW0UqA5Ip}jN`>r_6rDk6RP zcPDD?l#?Psb7J3@|GxtFDPsQH#86)O%_C_Mo-Y@MP|3563vX*SxAG&hk9BeVP2M~z z`EO@m44awgI4H`49I@xml0GbG1z)%QOX*5R;HTdbumWI{Gi9aNs+JTmZkrZs=biQLVZ7=&^loZC`Ul(;TX~kWnZ((>XWR| zX~-mLOGu@Am8AuE^1WvvfiQ25-u!uhqhV-BlF7Ci>3-dn=*PpkLh<3^Uq>3QC|go~ z-AH6Zs9tNLhC!oRd-*Xl`K%nvJbI3omHr?i$4zK(bwPBJY>?16yY(KK>d6Ogo>le@tpBs|Gd6Gi2L-H428B_F`M1Xtir&lBJg?@177z264wG8F&jr z@L&XBRBtdSo;sRXf2YWsq-Zpbbpb&J>5rvyHMD|LE=9{_@QI!^#KHscI*|_P#u}&` zs^3_sc0ZB#IM#^XLKyW9S0zZAIJaDDp6j>Hh~!D)Izh}vVz+d@?p;=898?2TI!8%y z@B}JKB2X0+3+XYmqQL@8*;W8#5&^MX02d|gO$YcO9Rw7T2xTgY_2?i0vsqzpplY|} zHe5yyh~GpY{sn+cp12kojct~WIkrk;i_25i?WlI5jw8naNI3AM>~;xA7b!ygV@vw? zpZK&(z71L|)3SA|x}}<)adSQ~OMGqTHm)8U%YJgpnL*w9Bam272uaUVwVx4!pYlNr z05Zi}MJ5^vp;);XVa!57qNA|TbYcUQHVK3Y<$TJsd5c*GfFJ}6DFvRCIX1veggs&U zo&F0J0hBv?Fn~iF17bu1=^V4hNa3+cSzmW0{7zm!LJMVmXnQC-lK6VxnM9)`@9(ef=?xT9avL>^ zcLv6`+;!o~82RSOCp|wV@)699mj?*rV?DePM{?|cXJ1L2)itD;3sosu3FrfC8ch6K zx$qEmli=cp0ZwU4gH<2huHt8HdorS*-n}v9Ew1E@C#BrHou&BwXSXGoMEMJ&PeCHw z(Nc}ilIEF-vH5OyX_M;QInctiEBs{h<10822*1HSq87qiKUr0MY|ahzk{c7brKq1gI% zE(l^V(oWrc*d1C0aEc)XJic>6{#Ar0nBG@L38@ z7!m6U>N|*g9r?iib35t;`^U@3JDWzV`tqZkDP02yw#b3m-O2Pa1nSbM>eqXCX73KR!~^8sQ+ zRsdp+m>-kQ)JTW)o*Re5O`tp`zFkj8f)=EPiYVs}5suWg~-ubqSdKThNcFM6)3OUf&f#t9O7y+OJchwK@{;cb& zhXM*)nHJWA7YgGNzunuCb3uAJG|R08P7Smi)c%~q&I7r_TRuva7s0@8AZ9Zt^? zV0Iw0ZJ#VW{*e*0;Zn9S(hWP_LuVnB`U8(mNlayy0)R2Vu~(j-Xu*TJ9KwkxXe*2R`W(iIb!_GJLq>$np8#p<9Ggl0zxzUX+s5tHTJ1krx`w; zngk}2=iI!$gPuw^&W{hFv(!3=+UA2r0{kRkU_Lm&-kO{o7tcQ+*m#>*MjHG|faZCk zD`+{(q(Kc@32eYjm~CE408i*wN{Ak<^DkMpV5xtvDZ9I~^C47oUz5p-M4W4sisM^~+G^Kc$ zM1w{`gQlBHo}?WtazOpJX3FSvCto6$6|%`=C6vXjWrYndK`Y{}J5@?}DImqAROig73%)<@ zW)G_Z;^J_sRS)?lLEH~aIpq+pA*df8WtJ{Yd>SG?pXfb-6>x1+uS5V_6EbhpyP1Jl zehr-_R^w+H*8Vlrs4Ggf@3~K1aP+6~^Y9cY0si;_Cg>tP%YzUHX+v8&ytOcGX0eR8 zRF%0M;M+D`-6npvpE^eS4$~U6?|mo-ro7$0c36w;i7?Mso&+~*VSYBna1HL)DA7o; z#KH&Nyl}C($7Sy)={vO`DOepyYH8q@6)UFZrA*eOmNo&O%Yo0m4N;$v-e^M>z?Jd| zi?Q@(8Ivf_hZ4YOI13xO4{-I+q0>2}Ykn!f|UMB9c?aLJ;g=1F}6 z2G>48bx>QvZBWFT!?j$^9mQ5;d+j(7RDBU9yvLpCpGVmYQBw3qrvi${ zEC>h~3oMBRqiTU90j^quO4U>929e|>0D#jtrFgx%g$N?mJ0kRbgI0KRhln6|hsw8z zJAB2p%q1Luh}3t9xAGWJJ&d-*1s%d#?@QaZ#+EHnA|0KrhFE)IMyL0anHsHSVkBI~ zDXsUdxmZ-Is&ufajg^9mO`GKwZP(H+2ZuZ^A>6i*T+~!;-}EsJO=NM45R!}C45!;b z@0!aPd^M#|_R2g7sajl}J{Vfi7m=J)ha8C-mY`LrUz}>+bd%WvzVs`AB@3vAXjNMP ze6#4TtqD|7VMr^qb^{c{k9P}H2??)XSkY9QmBO*Y-4-|Gv!_B#&f zq2Nyxz+Y2Uyvk0uo8>Ms(nJ)-g%s3O&T>0VXJMoGJ=nCMLHE?9Gi0%>a>w!hy@>fu z&Jz~`wOb3rHT61%HaU-cSXuKIF)OSzehLg>Y5`KuaM1dyqYhiEh%M{~jk+52%dVBD zF#i4OyrSfWop+_m@(dS|VrC!NUVf6*3MNP3U2bqQdXzzYrw|IJSa8ffb#hh~T3ZLX z1l8>!x7iKlAUI%G>;xYJSpaR|liLTjj{IfDifC;pWPHUaw)?SP*wPj!T4YW}xV9}j zDJ|j^bs`U9^6Nrt@l?&E;vopO5-@$~nM#^myxk7Kfu!_yAj7c6un?#T|EOr*?lRgB3LNu`8zM8HG14+kXU_;+%Wd!gC&Nd_7+F=sN6A0D-wBbXo72yqXgy78?FbQOSe+FNbhMQF{T(u+LST z{!1_|>#oWcmL<{VCIIRFfi;jL_NstKk+&}%ATmQUavY_GJ7^;TnurE-?ZLWL!LSm_-BeVFf|lfg=5wa%_01V!U#adE z`ag%+g8{`Cv{fHgYi6+y8bmPjLd<FODSj6KhHFq0fp!zXVh!>Z zopkvw^1icCb0hAq8#V#=9h|on{b~`{ff&97G2F3GWH{}R)9Fe%XE9jxg0l)JrDoe*6N z#4rn@`Wa%n05Kp!RI)xAW|ebaLGKWN8brCV8Smwx{RGd`%GtMDUex2}i5xk+TkEXA`_x zBYk+t0^AFA`UihEq9FBqpmvE~rQSF{saRCJjMBd6E^J!|&ocynct>fHljq?ITnxRR>mV0f2+LQ4lUlI#$ zzx1$#vs*^_et)^%SUCqCo8|E0Y87T=(#< z&`wd=f4myXn?q%2{Be8!x6&+PyE*dHDoL@|A&oNpUH@XIE^S5j$o|V;Dc-|x3Sw;q zzEgWSz~)zjSqM-zn^Dwe@V@7+T_Uh40gShv1F50aHl3G-dH;u#``^9V0SV?uF*85o z*-Rtc&h(a_gPhzyfi9i|9Huv4Dln9mvS`xY&Rw54tx~W4fFf>>!%gB7fkbOC97LQ6 zCbIw>G*4HBs;Bd-6Q$x?zXAWY!TR$Chs4{-tY7v1RY$$z+`%-9<7 z7doc7&*#$$BPqWd@ME+fVCu)3u;>Q0o*~Pd zPLb%DAx6-EbCht%*UE(;Q=T}6F1G_Etk6p~~U-#VSzh`sB+|D;`Dwp0AsqOo#UKP}=FO}{UDS4T- zyu3ehO^(FyX$w1akVD6_HA8=E(h5PSN_t)6c^tZLSgOggxmaYwp}^`@Jt`In#YT-C zjj9ypdxO!d(%Rf`Dwua;%6s@-bOpz>^bWn?cvJkLA(3=+o6Q- zCQHIUtVD{dG#$hHQ&>9tOk+2ZITI zP5(7F5>td88hsJ;X4mAe#I{C*<$pdbg~`~(+Azg1)4>QjfPBjriHjONYczF$qk{J8 z_h#*<$)Kl^vWpvKBNUZ_93NKx3LY}f{V&txI)FYTASW<6Ppue=N*4vQ>>lkJS}SDbViblAZ;o&MHB!; z61~g{lA}a2k-Ad}+WPK^u^1)$J=18~=PW*#I?uAm-;IeGgY|Mr2$98!No0N9PG;HhLDtURAWsRJ# zgl4E8Aw+)dhbC+8&T!Wmi_D;i9h#|b;M)ojGTKBvvr1wDQ47d@E4sA{Yw! z!h4=*i3mY32p_+oF?oK$BAcnXn+W4n*E@W#4c8X%FVKo&;&149b`=nc@C0toP5XwX z`41Cd;75JkA4o2%;L<+H>_}gN8C8CT_zYXgO!qIO;eMAP6m&T2~@*wDBEesX<#f|2^XtFn%m-&8!Fr}T9?|It4?w3{zxck+16-emy#Vh zjT8A*h&lu02dUBsSa8@p8FW8D%sQ&l8odf}^mNoOr0Z;xnWnshE|z!o^4DComE>J= zW%C-9q{&O|Vjdx$%$|yw%#g8SC^tgA?ki(&#)CdNt6UMYp&=CXARt`N#*mcLzE+~}dB%<4#dR{LfA>Hs zy?T8a4;E$wp^Ro$1!&^DuZ-ZID$wfJQdy>dgFk&+&wWv;U&q+rXm!sHPQz4-N#MQp z6vDVQ>6(!w!j4rG_orZV2cST4Oe~dw(3thVc|!yp3(zta*q5dGL_5R?&KMg@g#m;n zt^l%ZI_0kzx1?RTvRDtQ`+Iqp6H`*`ct}V3fo?>MFta8Hh5cm)(+HA;J5rMzLQ1a4 zrb%LuoV>QR`}t%1+}_S!!szDc*m2JO{CV8PS-f&8a_MTA*zsPEfRK%kBUL9) zB2;l>GZBWlD`*$qr0X9s@w=K%)gBC-sT|+mxN_(68F^?Hi&l(gt!&V`D&=?>8XzAs z#c9lyn3SV*IvIpSZ96J87`gpDjT>}*soaRh2WajOT9!>db%PPXRG{o9 zaDHWL--Y{p@IAdA%ALP@Jd0!n_W$Gmz4Y)0%nq-@!Qc5M?ybHp&K;g~K@}S>)R>ZF zY+Y0q6R*0@ZO3Dw^Oa{cW5t$Iq_=3snP0s|GhJdVlqb4+*uqT(N*=T=a2J%jmFcic zSfUh*yUD2ylcoD!%WcB;VcT{mG)_}O_Qc|Wq`7)isXeA*sgBPrQjS01fymfbJ8T05i3915CE}Ur_tLwIYsKeKel%8<@&i-Z(hweL_xA2K&_Lkw#66ARg0ibTYe| ze0wXydw=!Xl?Xg$du-NyR(tQKjKl;dWL~>o z#*rSvnr+D3iGt9lV}8@yl1l?0UopldP%wGcOq&I_up6y?B^hyDWpBaBZVia95@m~3 zE1<9yy8!gt^zd7TSc1&k)UObOw<*h3vDEIU-6AenSjk@}UgEnC88Gi6Eo#FrX5AUM z1Bo@OjBjB#`fum6fBP8$nzYw!zd7_!M;nSx4B07BO<|0>qS)SjYoLrAS){)~-=+Bq zq0DpEFUZli`Q$%-89#I>bVGGl=&h)*;fB5aw_|gueF=u2nvt_ZY#oY>a)vsGuu48d z3}9vM=iN)6SWux}PqP2y(;PHl62d(QYi{Bu5u2FT#e?%&`2zsyl`6yu&M^3PY@#TH zoCyKYZRKHzG2-Us!2?*Dn>=V@UH&Vnf6lg%$@i0f@}Y74cuK8KXf%Do%I{bW&Ha64 zm3WFT)!|CVjSrlDdb`q-NHy{E10ts3#h(4)(3#UTQJ=0vvY4Vgt^#*bJX^vpbyc^> zhI{(QG+vMW@OG9WEL1p)OEal)j2!5mCUh``OgdB1?Bq#FFX9z(zp=%ki?>Mx6@g0s zyr$oE)5z6{O+~7DLycW|NXd#^mBM#ttSWvmvqdomcqJ=ZJlqDTlmcj@iPZOdw;%kk zX?GUj{wA1}f&rtYPt8LB*ceIyJ9kKUKc0drPJ9s9-=^eVvJ@uEz7Sn)T}m8T-jP!E z!;k3NQ3UJsPiuYmuj!LAZW@E7LiA5SRYuT@9usri4|oZ~EaTkcI}Ko(cVa6giirNSne)UNfo1)jUSH(Vp z%&d);n}w!Y`T&FCBBHg_ZhGaeCBwCkQC4-gPDhBlmOf{#kg_tgOx@+#Jko>jdKxx! z^dWSFg;(u+p>5Xp9(b5#!uduxl<&nYdmIL)pV^s%@1RvgoeZlS2g^crETBd@o+L2sdr*8^^EDqBdawBpQn zolnkp{=Bp&Yo#|l%rS{AfJ??}lp?2gh?R1bNlYaHwDG4yOMBV6*bg$EwfS-7rfuX; z=&Ky#7To!M0m;|`+xX7bk3U0 zcJT~lrgh~kPRcA}5QyTx6GoDHwjt7-E%XycyMocgnF~GzWHU;&cNCHFv4FRcw8{ed zMfsW&*p%;Y^vg>s*M*<}?Ji&2j@sNI1rJ$n*HifrkRz%VAiCh#{ zCNBKoQEuM7j}E2(-gf-Uk)lFJYwCRx{2m=EYrM)+MfxZ!B)0$n8>72tz#aIzCbj^k zS@Y(8a@Hs%z;}{SV(*%ztBvPIvXM)yVpQYvq20ZczB@$$7~VDCH1sah_YK#30+@jr7`kEThM^mW9(q7pzyawT8WeHpp@;775CKt8QE4d=q~V7m zC5k~9So{y?+ga;;-Cy_G`+e8*T=#VkeU=Ie-H*+Dq~RHnkWS_9JKl!{iPnM!P`9Ss z6Eq0a_tpeyMIn?Nkp(5zmo2lviPseK{Y5nyZ_ zFEJ4p;kD0y*EwHq6^k=rx6?dK6yJZ?e9=QR4)kZ1b}-MHc3bRayztQJ!!*I(A@uaPIb-yk}-cW zLS1kDeiNMpWh7{cb6Ls@d_AY?zw;?MFyx8kM>npG+`HuO!Q}8KN^aG$-n6i8@_W^9 z^QMYKCPUJ>VPhb3Yh)~|`|Xbc(yqEelc->|ZQ)H8kq^eCM?(%h?_sa)U=YfsGZ&_W ziX?bmOUHxF4R6N1SFe8Wn)wd=#TfRQ8M3R)`lFwe1b}!hV(uLFN@o-Os7m1H6YOvM zkO9N=T)pwA7(wk7yBvc2v|TbeL05Df3@b$jErJz~lhv2uUk^kWU_oM4s|{Q zzsyUwWVxnT3%p{zo`nfzL<2}Mq^v#c708o}4lBn-*to;SS~5n|V3&KV5Fs#T$br=3 zokvM|7%3z}%p7dtA9WOv-&U?c#V2;hT_mC%J9g4@sK~GFvkkyPn$6nTn2dA`LFL`; zM0^4n&57AI{wNM-q9n3|+@;Z%My(td8tzwEpW^L+L$J6vnQt2-K}`a`U4cszDR%Ge zeD1^2)TCJ@qPZM2jozuS_`rbeEYC6WePJdvr%y+M^yL?xNrp*pN8M-6Ek{#y^uSM3 z)j0Q=*+1mwVh0b>Mgk5H!3tM1~ zEZ#bpOQ1hSx)mkz2xnf#;+~EGQsH!XqKJv8wSifE`i^0o23ve@+VPR`N=Tz=O$B)FGrU z#{0!jyNz#rUg`>2!X;G%z_gSF9EQkLX9)U5*Q8#Y=Iie^0juysN%#Re-^*W2l&$s@ zCe>zls+V7-sq~HplqKRL4CqZ#E3FbsaQY6}=*syiTGW)<1Jj!|OOUH@^+V}a(^UcRr=+hlNDzRx*=)y!2aJm#%Ptx30Q{z&pX!GQr zFw&^5iwg-u46EJrj;^VFLAz&?@N(x$M{MH#<1&`m?8N9Q^agUrN!JPkV#PwPv)2!; ztI}-evt0D$#rssRuvZ8zR8u8X!xJN5eC}8wcyJztFh*d?-7n40geZ zy_?+wi#As9k)#C^;))_+4;)3FZNQu#n^jM@hv7OUPC#6gy9i?@g1@Ilxpf=!?K~&C zoySW2wlJ<*5Z`gh#!Ur_2drb9oN``(J|#bG2xNe7+H~%|AH^k%N-UlX&I7=slU+~r zg_)W-8P=pJzg3x8X*t_r0@xnbcRktPLG3V~)zA*YaN8?RS}kj_@Ee!OiLNt!q*6e# zv=qJcyb95y>OWi4RzJ-5Z7}^2LZU1s+!Uo9Q`_>P_YafX9Jnu`F3MN{q5G$~=`cs9 zukRakuTDZoX?YK`dLNT|0K3C=ggyjvv-WGAPqPX8m6Be+6F~H|p)mR4Vd9gh&E-$T@mg)M95K2?G;>$Z|Rk z^y6QW-Yp>DRR*kNrgCup(e23o&TDd-s3+oP5I%NzN5zx1yiiZGuy)K7Xw3aH?}udU zEix8R1^|_hSr4TKe@sgg>k`$tXp-XhDADP&t3^&I35;&oG*2L~yXT5<5cEc~@ncPWPf4e)=0K^NCGtR+0;#i=1Kp z?v$*D4VUk%`uj_Q1^|6N8dm(I{r48}&InF<8z7^5R77Brk6<5e>S{_q4?X9X%c7l> z@(VhHs8DEy14rIjk4Y`GDj7W&VuVOY)1qg4u6`1J*2clPHt|A|qtLpp6%VQpg&GX? z+dJ1h(w(R}o)~2sPbRclVa8JDM-ywqf+b%(CQMj}A`kT^Q;s2^TjNh0V5=Vy%bR{V z2tM{>2u2D%|2i+pk;{IqIl;ff`~(OUVeW#9mP9q8G6YGY zfC702@yL-hRJQQZ%oKiq|S2%<__<_EyKggLJ*kiex$9R*gwuc1-ve84@H zyPzw?OF;c{`VUUwefdI)s}{MTM1lfDkm@n0kQdB}hg7@599>sHo1i?`#fLK>?MwMO z33T-{oy6zW8c{bTG{}Gm;vs_AYe761fQJC7aN%DU1hc15ho(s{vjpJqo&E zakEoW~+@c~A`Al7XN9SPvKgo>3%1Kj`|n|apzuG|lRVdS7_K(%Vm z01weUez)=O9RvdiyX~O)R$wHE8p@Ro55Bc{MI8&JKZYC(E=PTa-OdhuW-ot#-5ksCUSj^6lRxu0VwA z*GraJ@%qne76<&&OO($bP{&Vg!YhmTMH)&mOZWb_$iunnlVucSSOx$HkJ1?)-WK^% zoGUDIe4=CtTI>VVh=5x4o+$krEdH&D_DXE_PyX6degwEQ8x;8J$ED5amC(qBaQ$1$gLWOYOb0#4*M{=^Qr{Lw9 z2b2&_BH>YcglWi9_;628-N`o=56FeypM{0Gy1crI&7-5uP8A6~ql>p8Y5QYE5BIA8#M>tw3%YcPnW3OPRHG3R zOvARvp#X*p;AFj7>M#xSbsU%s$5wRRBAAK>7K5;v1~J%mM#UbZ^!UjPlZV4kRu$OE ze9D;aMw%|iF2q_)^B*`1?|hv>CYN@`(tnSm&Z0H~e$V*yUFX-C1lPGk()hG^mN>AN zSN!x8;bG#59utxm3?MkfnI=={?uNwzjDq{mD&+r+Jf^w7KU;1>$E}m4*0VF7H7YZX zy%)0QvKYTbdooHrLuVj(Azo=95rJSA22k(Ni$-s5_X|JCk-XdV&P ztv|9KJ=!{k#*SV#$K92)2SaG3Px3}zP-vIZaAYEukWhH-1W$=5$wjTN#gPjY!Hky;f13r? zA8c+EYI5BNQ5-KgM@y&`S?67I-fWK_gx*V;ud~=+nygT>@#i@O#Y1-u9Q!y^)xU3!KxSVG=?%mrCocl7jTuS;X_-_oN0h^Msdv1U6B>y za2Y=~-LJds*{`MSAE@?X1vX`NUR17^nXdZAf6>Ol&0|E z`tDQCxN9P6RB;Z$w}s0)f?s@8ndU}tFP7USM^1e7j-I^vQSAAwf`k(_4@@3Gt-L)% z7%?z6709`ed46^`b~U2*J)YI)zn23zpU#N5{x?L>VBXZNkXL^m_Vs$!u24kBCdVMY zAU;nF0HRvz#?W)%aNl1&8*E=p>G|8Z|60F^5dB7EglJJKuKFPgq}}}~lKNkL?DrPa zRKnQ?gowhUu!9E=%z4Y1^|qe&to6OAzSHGs5#TTW>1{+Reh4z{&#`QNQ6B8W;1Pfx zOVIZ1UT#lR-u+Ryy#`pqY8kBJGODf#{bja!V)WnY*~AhE)V|5FzvBCNi@ooWc&3?- z(Loa(Ozd5~WQVmkrc`Ch>;}Yq{qK;z4M>`0DoDu8HtymB&;O7`BsVy^^rY3M=+?E5 z_Ny1Y!+1;5z>v8jv4^f$3vlAw27!p%3CP0FQI=)2(lA4MhQn9faoq1-A3zks(ot+c z#4E+e4{B)LO)*piBT{_b&^^0sO$8GZny~jIyFkFUoeQ9E_8J3e0T6@3VTMYd7CNob zlr2=bN<8H`)5wmrkG%VUk-aPuE6y!mA)tW8)83{+q&*1DFE6j_M1BLWz|N zRPR8lINq1VI2G#efWK+rl;Yo1Bq|mkBJqhDVKWbAi|L8Uu4DxY@_Rp14W}+CP7uTm zg?6Dyx;{)3SS5mDHzFUx_*)l6KAz^gkz>F2u#1- zjGFT^_-d}7vFFII@HPEaU^iKH+UCG^&#&;7QbB;qF(B)hh#%Y=2aUoU5s~tj6~zGL zzA%_R7@%-#5r7-J%M36yG^;%kW;#1W6$avT0xNN4%!=7C4PPk<6KX!UWq?Hr>sMxc zye@zOOUGjF4t*OXD5FO#YB17dqo9T(Mi&drF5qA6rrDM-Vj@u)QUl&xIXu)DYGjG%fxPFW(AO&sZtlRSJhIVG^10DaoR(Z1>F9 z5*W?R0DHULG`F&)4blmu^Ak9c9{`z`yJL8SJM@+DuA#~p5?yQF^>tsrl9i9^Zw9bb zRU$_^N1PAdh$q1;aft!f>D+`qk>Do8L?G3DT!NZ9=Nay6<(CCe#wi`_LScMPX$a$v z>j=~xl2&>hP{RPc11;<$E$F1PS?&6{jjzsz24WTOxe(!W=q5(J9D+2jTsv$)rF zzBx^N+P33Ri=hROe}_O8V+fz$)=B*TUDQ%1Nn*HGs+T^oOZAf;qTZHt=EX~H`t_J zo(Tqj{k{pFBJMen-m0^yIy1ooj$>}f@l?o%>EqttO3cf7x=xks(=U2s&&-(L(Q&TY z(N^cOseUzEv?NGLVS)mVPv(j9p;#hviFB#UdZ z#7hkb?D1n+1CD{0(<`%ztk?_K{*x_9KF>8&C6uqf)Tnjlg#PVP*~VW>M$Ao*ocCUm zP`0cG@_Oi}%R#x21H{NKb@zw8=6Y-=Uf!J{Q!+`GT`T@^zq0x5k@#Ka(RpEGYNeyd{CGU+3Q>r)6G@ zFn+rlgNEs?4a}+#8vCENsnus>zo@|gEC~<94ODL?Eb4`^CMRXwurjA{n>cOf7YbgS z6=rE#?>vrc_$*$Yu>LU`7|gw0Qt+i>=Wu0Gi}W3F+$VPAgcu&bmB9!5GBk6J zH?+PZTX9{Xq3IRC+w=J%sil0phC)J?}^EHrFbR9bg|E|Bl&)BgSIgx$~G zlRYXsCrC88}0|Bzf^X7;L|roxow-tQxZz|Iz_euzHn# z$TWR{sYwht|LNTI0K&}Srb&SUL%08ys9Bu4dyXNC97x~XgSzoi0^-QAZ-|b1pA>6l z6A#<1WoKsbq?Uas3~#G;Y!3E}Yhq@8I|N!FK{&ucOXv_$GWRQ=Wd9@WjufBj>a1dzQS0gpo#QrD7v4Kg(4o92Bu;9e63dJC0#z8R(v8kbQFAac4DVpXh zo)#)He8-TkMqllolsmipcFd_(^Ae!6_<4*mZz+e!A-8biWn6^+cZ1;rG18THT=UyL zY0APRZ%K4*pyN50BXzvYqDq(|lKvP`c}~aIow!Xh)K4V~8KiC;XB-@7&=Vm)-f^Lc zx#_W#c$$@%v`+HLMd*-5W9DjeM+O9UCPe^r`o9F0t>naI67lgsl2NFg zF({GIBtO$8lKT<=^|TQ1IAn9d<%FDVRWIannkM2`fb-!$Zm`GZyG7RL-^rtwNvF)G z5X0Ux-E6VnJkK(!%UPN)RD~BwDTLrbARL2$-5)=e*s5-&zQJ*A_q<+wkO&Dc*rfpNzB~I#VwRXO$bWWN7bAay#I;V^7M*V zh@_iBrueZKGebQk%HAB8yv1hRXXV!-0rsf~UTowWl7jI`VSxm{$Vjo}#V)t_2V}~J z(gjj!_%FIhlk)o}6?^kH4*=%R;w8rGbcSX5)!}7*kI266iAC%F84LNTRNAkT>>fH* zBso>U*z#YY%J|wO=GJAy+C*oCwcFd$>U~)lnN3Hxg=R8?126ipUGoa(ZRB>-7PSlQXla zQ0!grrZ;HHUSb1|z4?_Y=*e-^L2 zVw}Fn-L~ZORHQDg=#%b@m-zg#U+NcddNDy{*3I~EXMS<@XdW)}1tMB}wRFbw3WXM# zf^S(tGm5omO{?XlhH<1N7WxhQPzq zaT~`S&onyM@SW25&YAYk>BpU~es|)Akd#Kk^agS%wbc}vy3)i3N^7CCj7)wrrLnrR zg^X)x@9XPr>?-LTX>EBhnl@M?Av0Vsg_~Na#*Jpa$nTO&o>?93-fF$KBl|XaPxkP` z;r@2P$FIj9KBs&t+$;V5<0$nKANp5#3P1Is-)@XQ*)C#M3qg%UGc1=W8gvUtr9xPr z=@sGm1cJyI`u1}{&&MH*GO4zHx%+e+a&q?VlQwJGx`Ix{nrZX3!sR>yZZp5ay(~;5 z1;N_Clf|zZNY*E69k96AHE3KvL9|3N&6bkqwmcuO{AX)xGLy5n_F1y7<3esp;`YyP z^AnE)j*15l1cSBia)hia+a21!ZrovNU|~~TT6@@I`?#uX?(0;J&I$e1YlopCEd_6l zR{lP`@xr87t|Ikk{dfNeA^nP@(%-KCEikY$1d8Lk2@7eG{C(#YU*+c--?CZhI4G-+ zKROGhuCA;P4D-odjz``qy`G__IL#+1i~inRXw!O}6;)xl_pMqrS1j_b2tA7^Y zj{lVi#C*HIC=M4(FX@oyYJt3Q-sKqf!5l|tVnSfu2e{sM5nli!9hLk6m$`uqK&q-K0A>%-ci;m!Xde? z{;sj*!)f*DCiZ5{p=@C-pC8tJES%Q`|3U$@ioi7(;!qSjf=I+;MpbWH=zXg6c?`6* zxeH{9Xq+`q)N9`TWyj##)jVlwaQ1XQ%k`BPM~KB88^e{D|1L!PT*upOxZkTkrPVNK zS`WKr*W4Oa;5vo(n$AsI73HQpYvKCk{%n(}BM49XuBf1$Z5DgO5G38LCossjlcbqE zh|hf_r9dY(neQU)wWR2fw&iMQ5@$Q1*hB;`NiR_S$bRwPwERtz5-HpQgcnPOGLGTr zz@MB`ju5h?s01Kc!QrHX7E~m$dULt&zom*_E%KI_#m$I%+w@(D6`KS7fsAF2Ypjox zhbUG6^E_(wW+LWaGJ`O}<|i}gHFgr*l=(DrB_@I8a9rI(O?;zDCAqiZbZ+KV&#Su1 zmJ{2l{=iCv^7DSaoKb`-YmI0Jgdm&lubYc2`;zjqU zR}9gt@{1R~4#gonIf*yu-U%H4xYAF?qPm&Kpf*3Di|WB z72XhRi`eM-#_o?~_}_FQT8q}=&q(x`>C!aSf2c78ekcRUGy;GzfS^6Q*cr!;-yIve zcWwejGbcH*b4h=1rZ@{2|1S)d^lt1%^h%kN}{t(72 zPu4|`JIEWvQ9}J}8Bs4sMicjC{md(0t`A*^=x;>^N23L;f)(0oe*OoSR9eT=!d@4s z`)Ateexy#ebcDf5hf+KX#y}p#3KP73WO8doF`Igs;Q1>`5{TA^LtLW!1EUQ3kqvi^ z(-iYok3^yV^+K)}8B9EPnFe?a80m*qz=9)SBw6=9G&B*y!JMmjvdHzlzfHd{RJ`!f zyk2YCY%!xqL5`j|Coh#2imi(@60@h=V^h-ft)&3@Yu|1_4bF*5q{7zo?)04*7R%Tc zJalixh5OZ!5^faD>$#lqyugCrT{UTBoYX#%e+_F=D$J7{E5-XJm<-I-CUyHFj!v2r zZ+Z#8`zwCHVZ^^OY-NR_EexD>yx``|4oqCUPfG}M6bgJ~r6{N7QUI+tY|*JxtCX)n zC!2=3ZF_pvCYDLlGd;_D|^(Y3$bq1}6PppyD|-z}fCXqV~HgFKEuPRQm) zclSWaVba_<0D>7#tHzs>IV!PWZC<#!GvP7-45Sog(DhDC4vkv)a`Gm>&=UQYG2;9n zuc?z)LVI1pPGP56c`B{)K%une8#6QOLJ`{6z*=I$*#3I<2Ev;lv~TGViJ5Wqo!?_2 zx#j!!iXc7q#>VLLmYmPmg5K_(O$L3}zxVC|+LCiU_XF(-yybS{;oOW8*shlMrR$gc zNk@w}!F`G&dchUYM~)ZeQOg2%T(6!7j#(5N82X$cE3~PoSlZehe7@V_Rpb3E<3yB7 zYiIA8D*SSvj8C@QSDR^aF|e(DNMp0&P}vYvcHP@OKT%%&HjNmKa*-Sh{_C4k#WHhM`8T{>>0>U&+jp>%&~n}7 zg{xY?y-)7-An#@mBYH4Y44n!>)Odc@6~8r5I95uL>v^LuFy zJ7JpoIoI(w*C`$U(Q*VsH|lL4T+bJsFl~PeRcd7DYe)bwmSSmS$VcoowsQVqA zaWi|$E#v4QlVyWXex?RyMHsa{U7rfAQ=k+0 zt}A?j_Lp;xeau}Sp;rG>Ei*MDa)o&+VC&z|2c%t|M?~G75~J5rZ1x&FOGX!2t1s>p z&kWO=r>nHzSLl$13NT9ir1Gj{k`+D?=)6T{4m>6~TUv!l?{ck+yxdN!{hVFHRCRWG z`~|iDUH&yw(1LNUN-EBuzWI8{MnC22xoO=;NpN9i#W_53oDX_xMh+DmA^%MIdtB`k zqZ(qa_Io1I0{-RApVlj}K{e-|J$eeiq#km2VS}W1*fvg;en!yBV_e(P%nGkE?iR=H z6R(>lq0+F1NtjFX0+@{>a5gXQzL)B^2<9v7F4-y=zwt1|ezCjBjO+63j6GMpJ=Lc# zXo8V-w{QEvP~A5>De;QB@@3YbrE!atwCIR@N9|$)Yk$m%kDJv{(k1uS=AdhwAnCB+ zkC#yHo`koZ-@rWYbH-;)y|{7>ux zsCVTUFFjI|JzQ0e*8o7Kz^!Q-1D?g^@5Fj^GQbU(m& z!Jg+ZlY0fv-{R3U>0di(>q|z^8fA28Tjll0`OFw*=?sGst zzQXb}T0VR=yVmk zDL|JvYyg+OrW7DurcFrWu{dQ-8d7?D431<@p;?XR@?$LSk(B*_5I$!=)lHt&CC`ad zQfq-X?@?+~LSpj_bT^!7DFBQJFdkbbW0HTS#Mbl~wx{@>0Rke%W|no%+P|`X)5Lx# zEgVu!+F|w=1>Jm>rlM$fOdY&*!>k1-M(0;usIX%vQ5A0}Y}e>PG4!^TSL z7~45tSobUbKrenREtFF=2RRf>Gf~1`cY}W%tL1JxgRML^F!;4lym_7%DN$k^dxw?` zyXR-$;0U`SVsPLgqOBFH{n36~f5PELg?P2+XmOjN{tad9GxcjAb{ zLVrbqNt{H#F!8}n@Vn$~Duzd4$lmCr_h~Q`1@JOd{3cfXa?FwGXMsz8%*QtUJBw=8 z-vzz*Dr2Ggct}}#geA?8s;Z4vX(5FdB;l-wdU_E7(@Sxg7|m^cP;9TFWgCvn70Wo8 zMEzMTR&T5{x4Sbdrdar+Y--WUXCNfyI9jESQxT}lpTExY(5MX;HR8y7c9Ow36(9KC ztG_JKgG&Sh&hCmRsR(n=x8aNw)-7+#6UDgRpuN?`*aVGDa9xKsHLHguaVN zOv$g)`B6EX7t?Xj;%Mr7{dd%3QET+yMMuP#v z+D#JMv-||vkVUOuwjKS;97$xZR<`^LnsLWvT8t)>prY?>HpW2tT435s1CDam0RSBo zSAxi$?;l*iqGp;K@x`I)81d>epDgxdmOPq#HOSo~zo6`cv>#5%pO(=7Q_SJGRMM-% z;%>@XO2Ra{y(g)}J3WXx^T2H-c*C#uUt+{qPi`SUMo3G`dU|7MuYV#(GpB-S<;Jym zLGH#y34}YiD1*3-fjkt451h*y89=U;c9wo?9wlXVc#2rD#%XPIXUW$}nlTmN2nUV| zw6U$y0lYZs+zj8=pX`apZA=EL4Dxs>QyK?}b;MN`&`S#LPyxb*>NII7c43vhdWhvb z;d(KURk!Xw-dgYnF2DKU!plhAw$y3BoCP$j!6!!05R_;AN~}&r0U-3{y0)IS`@V{4 zKpTzNICE9TNcWAT;u|ImHr#j4K1MNJF0;VbQt9g6UG~r3QeTE)uWG=WS$p6dKEFLk zBl|c>b(oC?!`gSwk?^)^|J-B!g!Ap9LJn~OMfQexke0MJW@38T@o3Y_u(E2s%h1oWmaT2gISh8w=`mvrArbTjkl-R|jZJn)h` zj?w(c96xbS?4qL4&X?Y0zYd9UutEWFv@K`Z-4vidCHV@aEhZ|(B$}?f2sQXV^YLbT zKc7^`+0t-yB9tMerf4^TZzufWiso<0j%ukCczM6)h~e>%e#3Qo(jz(dsmhf3+Cp^S zqsxO`N!*Ol=Y^Ev!6~Z!@VT9QqLsgN=r8RHsb>3D$K>_~6Sm1l_J?*yAzLToQP!%I zYa-@1z}nI=iQQnA2ry?STAl!==>`^6Cw5qhg0vooq~D#IWa@qY#D4PyodG_(9yF=NGgrQh-7$X4a@4}MUU-(nIEwWBo0bMicv<@woMV(xtktoH?UjB+S3T?@U z@urLBVSZgd(?2EE7oH3QS6LB&Px&pxaWe$r54!Q>`gY z8d9l)0StwjVnyLP92~Q=VAV}ZNRULB&~QpEt=~z>siO_nazxuy8ywpv+zW z#+zG`yBK53(6#{8B#&Wd7R#DMy%_G?;ih;?jxkfzAn?Y&+NHwz@&f$Q z%BjKMeC?cndidCz*Vy%@eg(*Wm(F*2{>yBI@^YNVv?c>ae^Z1B`3p%)Y%?khd%JgA z8VixegPs+GUs5f%8^hEA5F_zPf5x4r%BHyfrIgyh-f!);cCS{7U4tk4NDdNzrP}C@ z9xG(r!Y}$+5vv00d#@QhDHq`QkCRTWJO9U%_Kqbk?;Fe%g=C(m0Npl(wsV5vreX*S zs^4LyNMdngP;O3l(lFZi?qIt|rs)w1BAG2T?p$z>_bu(STh3WrH`l>V7q0Mcfty`S z)0d(01nDQye^aSF)f3qU8akVd6vo>s8E8-%caZU4?$7)fyVa(ajTDWv2%9QGttvWz zbbwNBD8zj9;fh8__-~!|o4J3Ng#86KMY$KFgqZ#{`$_B!3^oyYc$9l73_$f;$&vqh zEZ~OSIQ8zEeI>Z&MZjSD4TC*g2ix=e=mj@mx$&25D7 z(IW0YgMX_zBV;gu2R8=YxkOA^MEX=>V94#MGXT;*5A^BLUtHG$8&Kj!0HB!wV2D*q zMf8_CUL^$PjAWylv*KBox)i?SsG(C>_9)GwqXIm>%qwyA`vdd3v}gsj-&aT2%fq;J z5)=9^4-1fBEkyoi%wH|ouOemzjO#%vj1~<(57LOdF=J@{+Bt(a_lM?e#eVXfK3$lI z{Oz${8ddJHr(fT5+IDD0KH#(Y(x@c}uwhZn4POdsA)k3(wIp#pr@bfe6Kd~jHuL=o z3jm1LP8JfrT~$tL6vkJ13blHqeSMd0(mCz;EV(u_5x;9aSpfzK8XQ)KY0R(w`~;3f z-kKdTluUye-I0Aa)}jOo8L(w5$$FnM|M5!v)6Y5=3O@!*1XycCUKe*|G)PwWP`t$07c*#2NlE7$yN2^^8yM$ zJ2RyH%KaO?Td%tcA+Zs=ML4;(8T;FYb- zr1cNKoYue^8l|t->rFoTw*3}1J^$F2c(GAF;CPf_RyJbFN$0FL1ur}6IP%4=g9Uo*@5=C)R z``L(vka4ZOt9q9On+K=vf8k2irmj6*>x(oqC|$i#`moLSif_b{${SCTJRhuBwKPQO z(diip z<}NN35|Hc0;tU%HPxXQy$cPn+31(1x`t49k*W@!N8*F?zQ;nPK+Z#*EiycJj`9ivg z%Of&~U@=SR_wyekV77}u-*iiB9R*#1FGCM5e^BPzH}YgYIhbf)$@kc*YQZbdOK7d9 znuKGE+k8biwBe{GY(_e-6wp}v^0HILc@ojbqalbls-xzVdX6<>zFM_i3YYZo*TA`@ z&&JMbXWN$-VF@0E`%S5df(N9p*(GL8DciI~_o0ta`tG?}H=3dA)@I9D5rJ@fzulz=(T+wv%u$4>?)r zuAnDaSiaQMA1l#4Zw8?=z>z`5o-`)7iy`Jwx?hL4;H~oHSxTSvOEFJ>NkK%kRR16k zQA8JFpz=tm#QQ)kLSRHyKy2`Gr@A>Zc1dx!4&DutLFit^%O6iqyX_93621p$?yR8) zN0_?A`qlP(8kWVkyng+76Wf&*wm6!3#L=W(gFWv1AMD@Nl*FsijL1YNi{p;V(|OQa zsOklTMF}vb+;=<{*KOdYLW3A7Lw7oFBv|VTdWgYit-wXn6XK>$+|#_DVtnK_v~{%~ zWxj2S5v_i+^wRBT#W0v<2+f-pNG(bRTt0;sb71c3%FpWpOx6jaeS+So|Lah|Cv(n| zeDkD|!Cddt!#PDlb-~qerXkXMUn1&;`POd_-zH}Jda6Nm@&(L>lY?tEa;)No&WNfY zWj!dxt`DXyeqa>Q3bkB}Aqdjz3uQP0;Db}McPK1upHL%#iGXf>_L?oa1=;_VV0ul9W2;mQ~i%WFhLiqj* zL@LF^V4K90ItT>`LaKG~Ljg_o$k)xGMyziZoRSK!t!wzs*yX>-J)Yd3J2&pvf0HbE zq=siX`I-Fg0fAaajbuk34(6C20xP4T!sEXzn!7WpSzC1(Na|!qDqBHA(_yKUJ~sCG zp|Bi4bk&wci@(UY;;2D5;Xq}yX#BNFSJHmo$W%40H9YqVBh4b8v7rLU)=dUSf=%PN zbz*n0K~5w{G9LD-NT2w4)-EZ7rhub$79;C8`M;&+IfHFm=k~ZIzomZG!Mr)MTM<@v z){=duTZXc$m7Xe0)73Fb%v4h7U2!*jB5xT93PUHlf=EfR7t_KlGL8wl(s^JWUTSJ% zUb|()eN-uwj#3Su-kEow^VecwzFX;#mUTi;>`Uwsa7Fs)o)~pUF*=l{cgwL6#sGHoc*81oO? za3v~5U62F&rWsj|{Mm3nh%ZK8bFMhYu``Z3endQr?rNL(0T0#%>2cQCBW72@Lm^dbxlV{ihal7EKee?BQ z@f;^1DzWSPtE$U}{eJg^a(!#G$}8Fs)K9Ew*w;1p_*55BPsP9BK3H3lx1&6Bq@>0P~efhY)a9K&I7LrLJ-Y7dhw@S?)?Rn4QncI|G7 zUOmBVk#&OtCQr+ImmNPczxk6)g%_p<9Vbu%amgF>i7&c(hOXrQf=k}tQI0H2ctni| zI{ND&pg>X)apa!*^q=|2H9qJ-iGtfoB)VTe?2P75#udE0k0NHbL)xnl!`gXaFXWr3*jHQie>|p?@BV~$YInwt zWVX}k|6{BhP7luHo9pnW*>g&R_Ib-bAG+cYjWPL*;J|{ep4?J?oQP0hWPBd{Y<82$ z546FK0!pFVM;LVy!WRJe7}l6CXak0euAS)LD}Obqh(z&N(4wAQ|GD+F;*W)F{l-_B zJ=4PZHxF@pKWvhhsXCh!LIecbWL=%Sc6sl>NO{y9it zA)IlqE3B~PA-SPn!uuImFQbXX3Mu(;WIed>{){9>34vWeE{s-*Laj z6g~F>Mg>Dh*?PA11yfMSObP^%&-joPw8q5!c>zw>uWdy#uTu<2p(rc3qi7sFhKIva zu^=x)rHy=1r%`3*)f*3~2(3y!T@Aj}XX4=?;r>yUvL3l^2cgbH(syFgSup{r#??Ty zP;X>0^tLL9kf-hOy9iQ*nWIp?9?0bFpdn=l93?Noj%>cmHv};b$^%6KWnP@$6f#uir=9>*V2h;0W=`7tz-gSN^S$I;P2LGJ+=a`B(B`j zD@MhfOB`vv;g{zi__4>OE!j%3TL>KsFEsYvV};-dfcU&QVlwN0sH?0Bh+^NcjBOmR zNP(Gv#zU~(Y-_<_6mJz8voSymhet*^U`kunuAe7s+vjx|!!&C3I!XSJ^@8|cNh3ut z+i$lll=DOdkaQT(!x&X3QCyk3yWR5b19EX;nY-qVyl)DwVd{Ez=`bWoed3}NCW0+G zWxAeAGQ7j#^4Z9(LlYM30N|vmW==?53G8s7SaFg?u^S9V+xF-Q-tjTxwku#Q@N{f}C9zc2 z`4#ffSdbsxv{tB5i7CuM0m~;{)!Nr;fXSsw8CbsV&ZZNl5=11b&+v&($X{pOMSN^!=2%I@xhnlqfC z!AS*{M#Ws`HMJn)->o(adoV^+9N(PH)drB zaK}F1mhp-a!#-vqOjLUtHV2tVdeoa*=b6R5sJp@y6C%m7pX`}~2P+-hI^}@}W9yTE zR6z__Egt|~PA`rP(uo9`?W#CcuksHtR!n`DO7vPx$zR2oOag0HOhbNTjY>u(O?tpn zA|P)c59+y$M!N{sIxnL@gG#VBr+5CSQ?{pUZ`y!N_F*Uth`F|}B!J#e zw5dxttB$r7ZnLftG3Fjz&xV?b8n|6CotfYENk$hX!pijZ#o|lfpdF^3=DJ?uMDW3D z^jAX1ns6K+t&Y4iY^s$B`8uApHY*(k+*&qo+6ayFDd=&yB`slmuF*O4Tc%3FH|j@I zSsu{oOkaM=W~&l8Tn@|Sa+|eBIVxP%i-&(C84frKyR;>@##$Dg)@qJgH|u6}2~uQl zNDOj_oQHKC5mINo_0uVU5dJ!9GO3|f_xTP#lR!~hK2fM1tcZt#S9#LhYj+xqt%@~W z!&IuA8R#DQK#~~R1gc)^X-?B>;kg6Jgb-0iaTlo7M|=Uq7H;50XDX6{{O&=O5604^ zGaT>;l+=iF_YUCO!>lVSI%wVM?!CG&(N}Kh6m9IJKgbHPkrV2L@i{rApiRQu;lpR` zPy4E`H6;{8isqJrgG1T>4`Jv1mE`|`{rd(~aN^#Edn?XxCC=Qd9AyJFN3PJ)%+zpi zLvx#kd!{&YTe!EOrI}h`S(#>;m1%>|!}odqfaiA(hocRq%sI=?mV441-&PYB9^Q51h5{7)hI~|Z4DwtNRu$t#V z!hsTsck)p-q|pZh@lpSNojq`?yTO7a4p;g)ca)4`e(|$_|hknAZGZRQ7x&b6$&z=A#0RJs_$dyj!Sp7Zxg`H zY|F%Rk?T*k`xLJ$);Nis%tW(?{<>ONXOxD#s&U$K*}Ez=iR>dNT4UnzF+qQ9)#rH! zkUq(?&qjExsOpxb*|MIe)6^%P9P24|Qf#t^-k?-s-Tw?}B9{xC!ZvURK`6R+ob{v6 zcBh>R$0v;|%(|K8V`ysSTg8~}K_1wY&r2;rWK*sRf8hxD6joV6~n?NIwmm@!=JY6{MX z{yd*w+cxprz3iM~;eKDtPuVxUvN9^1hn^Vr+Xyd1xXqU1KW(~r4l0i2a85Jb7$7~m zuu5DHmTlTB8DyVwv>f@fF216S@)4!tiy-+ON{xR?lyy{Z9eGW&BW%b}8z;beAF+CT z=_M#gX;-x%CdivXSkR6b12`0^EF7coQtU2IbX#~J_2pz8^HF8AkVL*qG2cJlu2E{N z81P&Zdbys}29J=Fhdc@l9hXt^cSYUIjY=fUb!_K_7B{}9N`7gPwAicoaZo2VyFAZk z^VHzprWfdN1WT8@-Jn&-FpRmLMrrO?fwe8?tH1NyuMOvJ*1OYG0iz7U7k zU5*&gy(p!Y|11lw8>;Z!aqda|kzOBk=?biD`3J0U8!jPSXii+NFR%W$zT8p168P%T z!cy~c@p`e6m9f>SC61NtQYB|E@oabapDaY-Mb0%qeMmT%IBYS5gq&Dj3r9qS{noCA zUi5$2j?JZhxAhhglsK>HAD6@$B16rm3Y3!>2OQwsmH@}TSknH9l3bJT+7ksqLTG1z zVGb0o*wo*6g4VvCs46wHuFz#b3)~txDLgXA(O)sME?ZVof1_%9>UqL!q@{gCAMtK5lAVyEQ`p@6XJJ>Z^l`F4ODJ9D8C}Ou~=OtUV-&a^;`X z@qo7UWa{T+%p(>utO7|Zvdfj{K@+t2$Fonx{aMLn4h`8}45MIu)}@QDBm zEt3b1j?_hePC+#ewoncBcsdM37YA*ESLp8^CsvO(_U9$PQLwub`ugoPiRSo?7v&3m z3dtW|jw_W>?YZlC4@<5cus!;s!WsJQ()SyX#(#)4+)8Lk>!-Q#mdtlbkDXo#ma^|~ z^>9XXh_O!B%YMMykHgvWV-VHiy}+jTL%iqLJ#zEkBtC)hf!7|@m)1{a%fhX?UTMU! zs-ExYK}4po?%Cx3BEwfSqbG@UarI|xa=8jD)f-0picLdXY^qxyVrH)<4a(miayXbg zQ#m-R`Z;Cs1UPm7^_7oby}x|)sNAIMnT84dI}Melb+8<56I(awW&Q!LMPD?Cc|osu z&JVX1CUo0dIc|?VR{Opj;ossl;wtkx5&f>101Ss9IPDW_8d-(+t67Zq`#BBTaEloS zT!}*>f0`t%n0^LyG47MhSKnu_VWA+ZnlvLKldB*UFxC@>L}6i$bbri;#N2`t+Xi+fIO6j_pm|( zj6rcR_JiN!9*@bx75W!))}CwJ)35aAsR;+-rDVCR%JuHEYfu7Pw?^F0&0MVj@qsW+ zUq!$O3l|}5q8vXYQlRdF4l-xunq+#?hZWs6f5gPTT`Oj6CEkj%v>jAG!CS^1JQP!0 zw7Kh}+M~nnfTtDjW348umpR3lPI2gcgzFF(-(GN_4MZU!`&Xl${Rma36^%Qlrr2paeGShQ%8C~0g!n?#GM>TXw=>uX#j#^D^U0PjZQ=__u zR-2ZFMrwmvO8vuDa(kMpnreb0nAoPKB>=q#Kc#(t;Axw-GQT#J7b2^zjYhDb*U{xE z+S1dGbj(SVh;ErTw`Tb-uCQog=i^&-#<>T`|Gr1cbbInb} zBCOwzWeTxL&P^@4v^h7&$bLR*v|twzkn-@bhA^?=y4j~oe^xQE@#)(XH=vUe?lQ9_ zuyU{hK(3gg!vY%JIFS{o=0rq$RVE~fafb)|%=Ka9y8@PCie3OAC-5{xJBrE2uUS|H z@`HjVv7}0T6GNh$XcQh+wzMDcMM*OjP8meD%uC{uX$q0|OjcJfPnC&)^bk>{FT942 z_vH1IBer7yoc}y3^Y~4G#88kOO#r;Wy)_J!zkF{U5m)nw$5}y@3zK~#f-h$Oqp;C%H^6bo2i2e3mH8tw5d3JOSWdxzmr%?dE z%%L&nE=6>Lu_|`$uV}Sy^USlWlbk>(GpyTOnn}gW^cH_UP_5cQ-Cj{wOiMH6))#k9 zLP%$!OkFR#$|f+ZzNAD>m3U^Y#8-5RE^Ruy#Fs77e!)yoR? zHx`!x$39f^*pv?=FyvVz09X(2=j#%4O16}Bm-skkQ@0ZmxagLuxiCpKtk~q)0(RiI$(>{i9z!(&HIt%}GCxH0`?Ope}F>Z${otJioG+BhR zyD42#{1=uI)z(6KQ*E8CIvLY1oX82sQNdFuVyMIVC<676S$q967P%=!NQ^bhax$kD z@H`AwS0~9(ST$wHkhB=BuAOBcdWQ}|+59#rG(@M_a}dbR8t(1Hdu}-<2jzIs9!O|#>(O1rD`b7L$z8~WwfdBy{;qI^fqAe z%pH)0LEF&M5`h%+%~Ln|&C~NG&(2t0&B!6R@Y;2~F{%<8bz6gGT-znEsk)D|0Ve8K zq$wcG3gn%V;@83s!>J0Ky&g2Bo%RI~Yehh1;qTu0fqj2o!B)PXr!XZ;3LcGZw{7s@ zzMb*LTneEcFioe0)(d%0!Zk_#^Va423I1=N7a5JzYLQD?ei#b;=Hl{lF8_Uhh)Tx?2-tE z|2e-DTVIyU`M?)2-ayH_$6qYIG`?t{7j)|_%c~ggzh;X99*8kf@sedA*IydT-2p}z z^LZ=_zK!5)h?lmU6-p*YY8!sYIy65{V`=-WjoRJn=x?@8#YBa{0^TYg4?K%mI&7mK z5xkX8qTaJpekG^aX&l_h@EvV=HcDOyb>ilz#dBe4luoluLh#Ct z+SCZoQiVt2_NmgGU>T*f+!W_VCr zzP_XW^D`B7&m~lj6zEd!>o5>frgZ7sKL#a53T8r*q!Frv2#IW2$MeqlTI2d`+kxYp zj^--9mREkrWs%%g$LOmHY_dA1Y`w!Et60DC*!Ka=rB8m9MZ)W%?Spr3J}{!A0A@6H zb!a0J_?~8dc6q)V^#Q9fXOs10cBW^VP;>ctc3KkKFQ2@uzlf{spW65ngk8E+X8xYN zcH1a;-eACfbMIp9D9dX{C4Zooi6}gAeGUwF6q7!p9bLNo>Wh)|{Cihh*8pgDPt)yx zHR&&ZaTzJ{$Ub?*r-3q|lyG>Le-tCPYyl@;xdDOA;SV_L51M{0EQ&!EG6d9hNJug>;C=fAaQOFloAXJR4q zhvx_^Dudm>*+Ha?!*5RG#X~WUk@SxV;Op7gxh~gAi)XQ}ZZ=lUhhOMf(}gNun?54m z6j%+*Jh_D0wtdZawZ2lPEF`*Oq+>x~w8QPrmuQ=HpR(fej$y>9=&f=L_CE_rR<6bm z{}9jTQ)<3hs1F}mc(7}vB%JK*W@UA|HCX2m=NFuT4tV~8P)0`W@j_*h(fFIul99g4 zk;ZgE2onm{Cg>+_af4sTB99kkOg6sz%skOuuRs3{HjN&$_rriN&M3mpa}K(94`3B$>*1y&==^gBYsp(2{s^<~Z@;hGV7 z!o#SfyxgRqS|oPMOo3nCy&m&a(l^>a-eB2_`Lw6|HgLnkRWj-}I!X5sXZvC0X5uht zLJJY1*%@O2E-Lieb_#=e!%!CUeFR=6T@Z{*`$D^x6gdGn6ipB2+jN0 zlm_8fkFxGf%FkJ4WuxL9k0L({T0|bk?)slw_z{O{h~0}g$9r86iqcTWNl*-#xJwshN(HyZ_RxWz8<)eqQLI2;F?koo1!Fa`SwC zd(!BLFpp4lh_rXJTXZfh*5y6Oz%czJ+EWVR&eMfpf=+@)01&+h9^j!ZM>lf{Gxja= zBEE4JuR^ityolWNwkw(RdK8!fmVK00u0MaL&Mdrx5ifhiZWAnTu=u~4^v=H(B6<~O$w)_t<<<;^3PWx}BUut*I{N`B=H6xBfrV~kKW4wS zNzOwWMg#?$*B09Nks<+LZwyz?)ZG*QW|KuWeschYe!P3O*Wb&XxE5gzH6E5kczLSDvE4rZ2>C}Tya`S!n5i2Ln5Dq0s^;5qeRPSGWp<{&1%`!WRu>D=k z8%2746zO7v&()7U{0>#>FVrCbw&X?(0gBSr;3QT3!56fbIM&MfUk!)WPFcCLLX`9X z5ww~5it?Pm1uRPBKN;2>p$#ak$2QI%Zy8RhcD#`nG2J zL!`@$ubXb;%cBY=C$17G>@}-1{~4~!e)e~LLicEXZcK*X_n}`_p-Q(3(HLOUQaAWk z4xf7p-)QT1w9mM^*EuVGYd$5g z{kV=Fj!yIfU#!2eC^mC}4^nvkuG@Ji7Zw%}(7ZllUo|3_cpBCgJN~y`#bK>F=t%Y5gLV+ zx#}jMlcS)kc6(Bow+644z^ z5dJqjQMS;Rl3%UC?nu?mckKg$um0BnPwujM$_7{yD$frs+fZRTY-CuuYqqGT-a{1I z#pFlIJ{A1;_+t)~%#cmN>`1VbhcG*A zB?d6`|1|S$?wQN07x(ZFV*jm{Qgz>m&D{QnFvF*fx-De0IBI=92VPr zKEXelJ_&_Wz-VWn>*6})yQ&c>mkC&LU0ri4ydLxO0lm;30STWqJuKrDxM&_ESsuUf z-EHylOx9ERtb8O)D%&v$^|IY?#hyuxv0nL#eEqZ9R1)1mcyx})wlQB9#$>cCQ2y%b zMT~70k^TwJsfa9|gj)UoYRVt1h6@;Uc`&l zN~L6W%)xmP+=Cq4fg6iHzlfrV1FyfoUf>wv=H@KEzt}*2lkn^Y`$b>%``NqxP(zaU zUm+9|asGBNqD{8eW%Z0^Hb3qlUI_Y?2)r>{a)IM?uYsu&EsSk@d- z@#qut=4l6b?m5pmSyj>T$qki;Dq56}d<|lPzF4?XoJ6#AaF8s=A-H!Z1r&v~D{d?w zt&62WrSzXA2U|f;iL5=8bQ`}A6BW7eb7J{LsBYM`0)Opzp7-3QpAwNcgA$>aI{@5i z#o|(O)>)79oZC;bLmj%FojhN%H*w)$=t(K+?J(lrvS-FJW9Xz0Ry%4v&*8ee^CiPjpp>e0?Wd#RkCdV=44?;%_U4PBE6f;78bd#xt-B{dPZ*6+8= zKe3UGiVb~?fLvzfdJeH&eX#5*&x3`Zq^Io87QRv+be~;-4_16S8$5a=>K&h0@>4l) zB)B!<>s4Z;xrth6bwIHk?=agwf3++h$Czt6J-4aTRDO4m2&@Q5FE5#Xsc@hk5x$Un z;_`*kule2n8vNs*#Wz9Gu!FPPvR_sl@ea|rYjm9mAg9KjAj4qT9anbJhQ$tHsyA92v=o55I)kvc84I(Ii zVBWyp{yphLFt2k(^|bE#hE1u{SNgvOFyz0(qogmwZ`?!bzm;)Wc)eQJJUq^qHIEXy z(%CJqDjRDGPh;v#HQ@Rq`tXhXqY2)#{lh2x zpRjYviGUyXsB%x9I+n(T%#U{w_GK^(2UOJR+p6B}aLmzLh~jj^(c7cvQRh~x7-ie^ zUWC5Q`L&X(`WaL$c(@5szgV&%*SR^q%qw&D_Ik6|=owo3pFg6eD87-P_4}R!yTQRK zLLn;l<-ci2TMP+YQau$XY(0&MYF#L9u!?)xI;EJVf9cNein~!24PT8{LHFLX{W12< z7BZm(@3K zHGA3STq(cVd)c9qQRJnXY%QyQq(NDdyDYq+yoom;P4FCxX$~Q-h1A)8aIg1T(V|Q2x9*3Mn1Z*)>@I zsoT{7?_UKP)$Z!BQ&ql8 zZ*}eA@tTV)A?)`9I%8|alYWZyrCtf2T6z8IwU1Few06?AP?1_Iq{ze*j+HKFVS+m= z_;DVv3R}V#m!>UrevsKQIr|9KAxfm_H9Ngr-V^cuRiEDBgXy++iwndC9m3KT{!X)# zx|G~6pcG)r55McecrLK$9j7M%AsLZ(V`aStQH9^Wguy;RA|buSz&`pjD4(V>m7S2TV0Io-{dqiDV3gNmkB$CZP# z9+!8W>?7--kPpvrS||@4t-2}J*ZoNtryw&4n4~#LIP!a@d%Aw&@EO#-hy!EAJ5nPG z-g1!98Rgxx^l5^oo9B0VsJiKfLLjHgxv)g?vC8GU4@UGP*$q{CtV0b=xd6w?!cRUN z56_%fn7jBZKpYmI_&VWjQ~ABrBGoAt%KL)9sL;aJbeYd=F?Wofb?W_Y*g@TlZ`POw z*Bd6DvwrL{60VBaa(;2dDDTJo+%uSfo1D`}CZq)ewl%$24m1kuxc!AtL?L~7?Jj*f zjrHWON^?R|M8*+fQlbi1s82sLbXHX@H5tz+9y17;M6#AJkCbl(1-nO}fSl;dDOhA1 zfk2^4LKXpLUEDAmES^PT+k^uSwEfXz!Dy9iV#3Yjrmx!QWm#2+POWG;{kUd49A9A& zbtQwcU!{s!B^)M9N=njw((T3OHS!}73Y!T~qg9le8i^4ElbFRQSdO%P!X9k%qLB~) z;0Xl^w}8v3@JcHemXgD5ns`NjX8Xp}NN9l4IrEZS$1#sl&$SQ9VS|eX5{v|&4~pSH zfV}UPxse+bMx-Flt?WAu2_UhUL{V78QAsF15(^II1IFP>Sdj5>k_=OIp>}ff0kt?yK0omoAis_IX-T8jE98=NL&D*9Lp3_G#->dl9-tQ?2tN>l1>64#tp)iUGFDH2!g2a}= z0z$w-B1~Fk7@QhgW>MSEW)DYIOHx!rWY?fvQK-at`VN*Qj*NV#CX*<-ZDP+7pU5)T zm7gZYLOt-$aTfPeyL#5gTU_Jm*Z#CPI_jD@#~;O~$BCUx7Pa>Je6B7{9< z*wS&T=2H};3es(YHQkTrjG<(5;$&E~X$0x(_kgYl3Pzna)?xSp`S|a(Vlka=eO=9%JXhmPM@5lA1GJ zfBF5Y36)lS2K#H`R3rIpw_}toNfD!r z_+3ggCP=|ANF)>`l6p55(RB5MbZ4%H(rO{p2#XP#VCS*~HK!;&zC%54MMuFUSw;Y- zosF1h%e>3WFgGJV19lU;=)GCyhG0@$*H>H^t;{25{W%$ZmWaS=D z8b{Z!q~cU8L(gZW-g~Bj3y<2~kfhPt=m6KCGE8B7kAIOj0fNhK5~5K|)o{mK4j07~ zUn(nxW}7y}_FjG^duFWfOVxYlc}%>XfnuvIoShHIli1%Y@T_=zK~MJm_nkd!CiHZt zB|qG#m%^+`1(99%4RniBXkMyGHTUw%EZXX_LBdj6I2I|0gvdM;X)9v!-%4%RD-rl& zTK@KoJgD@#jlTOgjQ?i!jru#2BmVA74_nVt&IH>?r3#$94TC|jpcN4!=LG5@K{g7& z#yAKD1ahLiOeUQ;4#j$1@nQ^pw-dB-CH|T$u0YVDfaf|L&7eDn?H7d|AVb>CS^Kz! z;y`1I_udQN!*=lgOjQVFXe9N(EU^7F_qe@S?;VYk7zH2XkPe`ag=!$7T0pV`28AX< ztejxdSdg0l{ns5@pnYM+-}+@e7z%RElG*oVkY{SFGGxU0BM?SFkYbb;#n1LGQK#vo zoS_M)DgmbQE^gBKP9AsKoheJ|nP@z-MJn>l6B14ofHB>4TUfsN_z)qd2}og~A@sAV zSKcN$Z$sp95Iz88Apn+^s=*5p7w0u9O5d6upMKTz#Rb_^OCxRMwG zV*s+DXad9o4l)yBVLzdum7;EL5P4DlKs!t?%4255GCbFCS|L)Slk;Mtnc;Ipi?g`s zcPB|QC~E<`AP2+y#^>h=Gr;k(#PsWyi2qE^sqZr;4vbPPgq7l~`!PdW*fC!Y{>xoG zJW7=g$Yt=N%bdgvB&7!=h2Eq2vMRm*rokID1p{9o^nSuPE!63~`=D-$1eRz-(VAYB+`MA#*Ybr5VQ%kOs`xN1R;7PG4m|feV$ncg3whqv8`>19dO&r{7Zg z#bbpur3tYy-C&>7oP0bGaUq-AFbjBzJ;VEsCDOAA$86$GP&238OeEC833O5@$i2>~ z?F0j`t~CUOt#1k^kk>yVEMSGc69A;-DqC4YFDJebMI*i@%wVsOWv+J$sqpA} zB5B`r$AYu(h=0zh#PemwY@??s-bFbXRCR~9;sI5PE#vy1F))|MLbp6rbE)a?j;ckh z%L|ZD1lH5;Ox5)13v3ghAnocoU2E^DG_EEDb;|L2gWhPdVniBZwBf`=xS+mS?N@oh zKzFX2mX}5Vo)4N87;4ViH&7Svc`4GZ&_7A`Eg;~O`}i25O@^@P!Q==KRdf!T3Q-|I zWC;Ww94LbX1<+7^JS6#;SA&j*>7epNxka2mfFFgq?O9=l6uaS~P@Yw1d_L_^ z5L#ma(I(|$S(91!)u3pHtu6wC3BaIku#x~aGQdxOND%=J90Y-dBsW4B=z4&mijGFw zL{|tAT#d*a+bicU*Myon#T0BIN11%rJ&KZme7|nq@7jfBip{+8mwZ{2e%CZ<K_LJHAhR3xx}TtjhMXor z6(|ronw+aau13(HrvZQ;TTVm)SXwb>yh&p(dln34#|QItZCd3ce_CubMqdA7E$MqG z-eOa0M&y*rXx6cg95%V6Z7ue+Gi>pItL{^C1F5#$46Z`0T$g4jQ`P1HkyeJZf!ek9 zjlsbOPtZU^w2LX)0ZfH(69IN4$b$t1Pz{PCh#EQfomGy*RM|ZmWJ?H;r9u!S=%5~y zjRqhl9z6n@=AO5R3B>~juCfq_F6CyoUY;nD4ZNz)sLk`YJb$fD zwEiYv`!J}>O-xh}tnlSvViIYG2IVKP8|~MHR8}nL1ezlO9wNl}H$BN^)$$`XQJV&3 zCZ@{+2rU$NLObw=SyR+IfYFDsWp$JqP$m(sm{oE01f0-%*`2i+9o5yW-5XZ}cxW`r zG5h3RQ-qHmYCcvHzU9n4Kr49qQt}ZMOuPwFGQ$h3fwMJu_vbhi6JU4Lm*mCCIx1LK z57(e|l!~IX&=7N4%YWx%&JWm`?n5tS)(E|WOMM@1eVcIuHeB9k`{z0NNv`9WPl=W1 zv;?eq)vAO@XE4AwyG0-XVtF#uif8#p-K?Uu92SbXQG8d&UmXn%HJr?HdhnMmjw>Cv zkyLQ*T-8gWY>Ll`+lxHcJ}~%YaugxC1DaqyB{Ef|!0<=qxbGTfg~xc(n~&A${ukNq zeP*>mRIzNZb{hdq95~HMgoeblGuH0{XvopAiUtA3g6ie;wtj6ec=sxqfA-?=VcxAY zmD1js9i(ynWMuF!L{u4MW=?K)E^;Pjj+!;sNbIQ#pHtA~dKxn~5v63D3o)*QyxD-v z`-m+J&VQVXy!%cZgMuIJEPNHi9Ib&jw9HA|7>^b6ek6vm$+o~IZ?jWX@D1xNb5Xkx z1w6n`g1!@*k1|+b0bseXr#{7JVa!jz*x|@LXC%3wCPki+@tGLBz`76vU(SM01}i1v z{ntKI69H=RY$U_;@c+S9{y%eV&Rt@zqoS%xUeW)|wV8_dAEXtMlB=rg>T^{q8d~a9 z)gHEYq_?SccdK^x4-7s~eUkd9yR)q?V`ON0CS7e}_AdG9-L|FWm8VZAS&J`Ty?(K= zqVy(nVPR|gQ}#P*r~2k(-RJg?J1P5z$C*dF?SFs&*^%WH`t(LNaR_PS;@reN3Ldka)>aF(6iuoReE&p%p%iraYW%9asHAUJ2RfYvMF0ZV%fD# zXzdyG7Tz3I%4L z#OOzGqJgDAPDUd7Wp=*38?^SeyIi4c-i?rH_MA(X%w&T!7?@DI&C1TpE?#o?KA_BW z{rplwW)9f096j9XLy}^cUR#e~R%eQvT1xmTuFK8XvL+lf)OjXke`1wMQwmhnO&YT% z-Cc_~|GXmRQYoh)DMM*0uHDyq+O8}=P${+bap}kUjun0TTBJZ-<3qeYnHw(`kpjhKJst^FG|@)cQ=D|(eH(#bdPnAU-=VYQsvSk?~`vk*XjZ*P_q4+Ewyh7 zm2qwXJU?mugMH08HLh+3Z^{lk0<$v|4n4&l-|xDe@fdn*T}|_zrqqLB2;0Q9u~a&> zjCFkMynp*Bt6%1~NmTun`7y~N_U*{tbA#>E3o9%dvxwor^_f{>%i5Kx4;Pf?HGh3> z^)meP`4ZJsFhtwa9QylU@t@rMI}eeflUg%&KBjn^$(gc`Cv8RlIlPdYJkD8hEt)9R za(90v-K$zyZXKA|sCh~9YSG2KXO@W%?Ougm8@c)B+I0kVRS$YeYs1;+>e17GDr)|= zVY=#ZLI|9deMup;Mc|f$3iR z$564ix!0GE)gJ7|mE*tv_Lpi^$z)7P%6#n#0^Wy@{#AJ6;2733BkW)r(0d|b(3~FG z7Z591X{`M2mz;}z|L<4BpDwt*yQVs5^zEc9?!AAj+kbzv_Woo49kKZUP)!z^VW;Bh zT8NSJ)jd%C{di;+2_~P0BI)4G5H+~Co!Vi}(zlVHJBu>ZrYbd!wtdyM?^@VQ=4n4_ zbY_#P{AakD?FTrSSc)XE-i#MnSbPuXH$@@<6cpxb<|UoEq$*QjG9m-f^jbSnwzN1j zc#Py-X3O{w3Ay*5cGy`y?Uc;W0Pd)>VJUaDrUlu&Os(%PBGK^5ldmya+_{|GL0dEI zc0|B~Un;Gl+AI7>(#&*>1lv})BDH;#W!P^mopnD&CWi5Y?hufjGd43BN|&F?u5t2q z|LiFz?i_E@#m&uvf^bWr)1>kgn9&3go44C}Ob&`_^|`Jx&M(lhKsZ{lIG%|w9%gdi zC9b3W3R`vO>@bqaL%VW#?-ClyOg>N;*B)aKALE5;c73YFN^D9?iZ7?YxHWp~8Dj`!O=il+#h*#Yn@{Zz zu`{>08a~pK)ppC;T54QCS^+m}Mgf{RgP)t^Hz5*!Go4biYDV246Zr54JdZTIvM*6M zCXIS&!Lt+AFPv6wE z^o)vE8LyZ--#0c^$~k&5@&m3ZQ32AQG`%J`7B2PsY_oI>lJG)8(d2Js4z4>Ww_8mr z$3AxCrsU#;&=?ky;{-?vQ8H6L6e7)tO{p7YPIThSpSONdE?ty_$oH4lWb>>xdY?w8 zK~O+$9hTs!6|`L7Ay{;u82BSNUcGPS$LY8K7TuO?I)&!|2xk-^^){{QJ*R2=;TCiJ z3tJU|$@k({n-}aPF5DZisg4u!ex`om_?_*(ZcTU7xVFg@X-)3eY!+D!`?v3zfYZz7 ze(GZ8-e|7}+JmPyW<=wT%ks1HkGSPmgOx?Rm8+tK6DMuHDtxx9G8ZCr647@13rh)v zbYQSLO6zBy#gn;zY4i3xU5$}SMLdI)zH9|VrDx)reAXH_n%L!&aOhwB?QEd>Ta;Y) z%QegGpt8UUCy$FFP17lRCp03>MR{pHSLtHUU;>2s22b3Q<#q{Dsyo#?H&t5TMXP6n z37bjSLB>Tb1*SeX7|P<0U!`tU-ac(#3f8nUt1?Ua1JAp+U!4D0;IxqUVHqlc180U= zY5(siSTfx9>UoM~NeY}2cOqVjjfz^%o{A?hfnWF>1Zv@_$p#0{ z%^AdaHi>YVorJ?Ic7MFy%> zupMtkDCVZixHNb!vj35*vJ6_8wD~@iF5G2c^NXa(o)H2+^+!OS9oaznl&5{6DypQ5 z*w=WJ&=RI+%4eykw(tOzsOUr2=iz{RKhaa;XtmYcy~yy9jqJgNk6!H3v;S%{XqQ7)A$Oe)z|UT42(t+E;gG^Y-w& zkYFE?vjp(ci=i+7Y!jscfJqx23k#tA^t+E`QJ}{E$Zho$$)^GR;w`4$Xea_!aZLPm zEz}nq_iO>nJoqto>z~2j_4m5W+8)@Q*e5Y$ZKW%G;(K_n zSE$u6IOh(iw#kzs(p0Dy7!L6QOX|9kRcCng{W z2}ma})h`fB_Xe5KP;DwihVdlMARI9Q9%6z@@BcC$#!=0dq54EYq;L>9EX0BUaS}?F zCqm@W$wERT zTm~%qN}@K}93(=x{M|+6-7@#>i^Am}^CEOi8K=Rt>B*SS?g+X(GFEm!-rfVkI0$Cf zd4B4N8|{hPNrjwZ6hCob0LJ0uHbKt`VqFw>RDAbsk(9_$%+jyBr=1|ONFwAMgqnKe z_Yr5Gg*}=AFfdVbMKNqB;E+VX7e?gaR3oQCpY zVT?1Yo)f4}4YvFqcp`yA=yYHw5~}dOsZJpV34_tRSa2Cu7zlI8je*Jh*RXp%xQioB z`41m4ZX94-ld+tQ&^f{D@f`>SDT1ZqEyW}{%!-&OfQISO5?RSG9W-Eq26TFFv?fON zwJZNmB}W2{kq{9gC`thZsZc{?p$QVkMDsE)hF(1fD^9-qIaM$zk&V`FzV8p3)9~6z zkeQM`n-J3U&d4@DXCpNyxe+?$2J#T0(MQQ}6u^)xE($Y*Nic?4?*24rOY>X@QVXZW zBk}@E`@j<<@Wa&#aU?_%fJp9xCxFuGbETYwQopMi!&Z>u+B`diX}yN7IzG!B2hpdN zRsB@#s?N9lWItJw$d3gtt^%yI`w%SPd#jYwsoaPmO{9RU2#5r^0!6D30U&||sK>AJ z%zGtpGWhXUg)p63rMd>5pj1fyt`MU#l!=9l=>Q7>%1ua;CBQzwZ~e74&?Z3{{vl~n zG)o5Q=!jF1k)WU<>9?Yh1SkuEQE&kGMG6H2%f-l`5D^roRG?TPnyl3ij;lThLyQQ( z9sX+yB5Ev^RVslM!jw9-{`%hvEg3kM0q}{yF0sOdMe5WUANY5r@A--250tO!;Od_W>@Q{iRaf-KKbUj?c z0-~wWy4=vIY4x~Lk_Ji;>K^Vi2ldytDz%I@wMs{W=IHv1-q%i!Hb-T&qFGx$MYjg8 z)r(L;hU!QJ-C%@kFed{4Sr>1(=kI^KZO-`m&;Z;FsIK4o_I&ln>86iOb+I$861#0j zHdW^M7(uBvQSUaXYg7KyBN0>~(V6Dl}jX{O@;N^ls0QNVD(lwz@w}+iPtN231%BbU#)2+DE&f+~%|O2p6`& z`rRJW=Kf!dmU?Y;nU!_yD3VQQ+dr=je6@k?OlTiC_uwYjIt4|m2f$u~ zzTnxmqu&E!%|m3*!H;^)Fk=69bGHbof_(cClOfp<2{S_Xoycqx$AcQ{H}3r6xM|Cy z6(MM~GN{xk>f=-YbC+^kd1!gJxiqsLMukG?yH7&?4AC;XlQOCW_xl;u*aT6SDV6df zs4xG|lh87Vs=v++QN??w1;6|eJ3O!^6I3?xudD-@Yi}6nCM&_93}L4e zS(4#6B@QuBq0wdaqUe!W+p4V7E?>jO65mcd*%bP|KK5(9$4zDEgWklM!FE>_%F&;3 zFbmY#FZNo>Cy3MAhR+J3Xd@Oy1D;#(AO(`FERd*t!%qzHOKS>>@2 zlG6Hj2I~ZsBo5Vy^%-I-jc6tGGi)6)89>)(Odk6=A~3z}Jq@MKX3UMq-Je!8n2@B7 zKHRCB`aAn~r;c;K z!}fva7apswO`4ST=h@b6U#*ZJ3`h{b)#*hM8YoPx)*o!YoHhR%)<1xYG7z9L2@3b0 zhUhr;=Vww4<^~Y|78%|5Pr;KRYfvvk$})TPJN-eQ8Ia*!Nbc&;EYNnTQ*T7^jF9EANd7G^|+)($PgXn>Vb>B>-RVDvnF&W!L- zl0h!e2zkO=-o18lD3%q%Xrd=)P8b6dd9#y(NElA+6_i*iNq&72^-6*auKj`frh``E zYZy``Ln@bLFeOM`9qL~@8G&dkx11x-|EHp=l+C#rLjBM()%|L-=T-f&JxpxBQu}uMEC@A(f|Pq4?S^^s!0ov($$xoHVEb4Q5M#l58qr z1OP*W*)wY4M~dZyDB#468~0Y+ zqcohkQnV~rg_`B6(3YAR;#Qogxx<+|w45!}a$9I-Y71?tS!q)neExiYPyRgQy1007 zU)EngAMaNqVD3jYZX38R9+sQoB*u4N_wR9UUrgR$`O9_gd;&)AuDss?&*>ik4u@k_ zs=9=T#zctMx-tCX$G%rjwIX3V0)mHuaA6|2aekW-gbRHYg$Ks(ZA9?5Qr54(Z<%l7 ze=4#8yxjE#OI&x@1gJ0i8giZm?p|-N4tqR#2N--jUo-h8=b_@GC;K|?<9~Cb7Xtwv zfCcNT!u!?30{v3B&68H2u4mnSHa=iBwdSxnkKlgeoke6KEKG#;9!)7x=BD*lE(%PX zj`)y&{=+jh5okKHM66O>7YH53k+^BRodr z35zQ0PmVzh^1KIm8eST|$H6*g~Pu~lPc)r{HIpJmFZX$5!`A4ck#*M}t4s_`Z=#pygB_Pi6J(|0X>D`@?**)m3fUga2#z?|B84@ha{!O7PS(MgzSu}ZVVyI1Em#xEr$qqb(v!YjPiThz#v#D_yi%tr@ez#u$>f2y@1CWSWc=Us^0<@Gvq?9y?y) zXmI$ptyw&dyaiQ^~SZ@>5D=684%LUMiSWFu1NW?OBc_|l!3z!Z~i0S z{LZ{iSI%{wb`9M(>>gdw?*PU8ci2>BUsvXZM;5&f=*H2%wT4o4R%b2f`a_`p)^yXXV;tEefdhg_TELKA17K z%K{seBDybuFG9>kvlG5gIoL8`qYf_K+tY<+pYj9a{gb*>`_Tw=jFsD>B^ERP;wKk%OTQ z+p_k@k&<;PiL3Z=m#b|aJv`YC#s=zxED^WiZe4*%-_vugHL4iq>uK=GD&9Kur+W~J z-%QjFoUyAv`$Aak&bgO?OP`8Q`@iWC>}~CmF-KL1AAkH@WmIsxC7Hr1?q@nodkr1k zQMY_`{(|0OeUKPd;Ytg4EdFS`23cQvH+ftB`Zu&JdV1fD67+*NxT(&QM#m?L zzxjk6;(^wjFPfk4d=olGJL&oM9$r9?LFnFibx+{tasIvbyYPPu^W1Z;74%Ln??fqE z?ZP2uPH%DIJa&(#&M9B|`}Jx?_oanM)#=du9`XzQRO}n;wZFpHU1dVMC(=1W7;%a- zd6+m}4cZ7zpQefj@|LWBDE=c4s}Hc4M!FI<+>;e-mx0`r#8UGxc2et2bpE3jqR(yh zr1jP_kh^>Z@+C;IBYY72?q@Bl(%v4gTPvcGY@2)RhSbqQnvjSEKMx0!vGPsG>{P77 zf{15(T4nAtz%>ZXHXT*IeWmZ^)Kz9uQYf#tm>VBVS?7ga*U?ehz{2 zU#*V>7CHS?Q4nz&mGS)hP}euk^*DljfpIKty#)Q}xyd){h39n!77GG4YY{5bW6{|JYx+%GL2G-;>ZVp;MtLCtTwS?F;za zF$)LMR1AuUsiGkPW4D~VLbB%CXL5~acdwh~yAXpPd{Y>m+fPi@E;*(C!(9AjgrO^g z6=GqUj+9CB^bH?DwFn3Q_^y3AtH+8|~TW*4}VqlU<|h>!*3~vsU!S+b0fU1IV?iWucGgN zLww+nhoL|2t#p(-_?n-TaL@2w=f>fqdS>FMs^26u7{7`o47dEse8dDt(hlqBN^{l- z`A$#Q@n=!|tR{6-+Qm@hR|FNquZ)-0%!upG4m$poGjg}}i3m|HccHDYXDid_%j&NI$DSPOSM}EBTH&51_I5dkMWrQmaM zPAVu3=<*^IGDBdgrqaq1#@h;Li6bJ1vje#Uyq7kM0C3G#mAg$UU;&7?V2dJF_P&U? zEg>a|rF6endfI*DUBX#^E@e<+NK>MCxZ;OInH!!wzphIz9#8T17)+{*r9ZrLYD_p0 zmysHallV+X-DSpv^M;TkknmN`LUwQDiHp5Hrix%C0X}YMd*EBJU2}@fk;wCS6D2kv zZ1w!>slOBvEL%j`&VwSqRxx!fami}3_Mq|8gw{DH-k#RhXSetd3=T37LQdztANxdF z^&k)gIZ3Xpnr(^pO+uucp@hO}a zpM#ZbEJUUlBq%XIa}XJpkOC>0mrB5IW7GHVJ{Y_AN*vC5)#S!gR6ajy5PYvRq`aGe zkb6PEikP~^nkdE{j?!YEJIUMQhkXqxoR+>A#}sT4LMTLyf>r|rokSAsh^kx9T_p(1 zkutI^)kFtAl-@+MKMx5LP}IIZaHSE@+u6)*?fS>C1QN;t_-vzbJM=&YQ z-2GOqqzQ3bM*F6cx8JA2Tvl1{0Km4@uwwd#B@M zqi{JO{p|ALIZ>|g2Uzq;7~qG>H)r7n_641HggslJEFMrJz~;RY*iMNZFptaZ z8Bp@XxNsl=h#9)1_>GcUvX3v!$;T^4;#Q8dgB-u5ezqg!#37M+CDgxkn2ULTJ_uOg zFhrw$69i2m3}^ztI^Kl`?eo5^Lfe`kS1ASv7|nG1JZ?=$xTN(Ce?+Ev;4-jh6P*5O zn9Gzhr=w)ZiMFhw-79=nCFC7uiY6X@nk=nRR%pBlIkRDUV;Bl)yXq5mn{g#9bFZO^ z{VTiDvT*A+NdDj5DBhGrL=db*f-gp+VGiT;^;NL{9e}}?s>c}C^roSY=bnL53+f=cpU#k3|u0MwA z4AlwGJX~yFsJ7O?#8LP5No^5mt013IR=Mvwe=8FNl2o3K^U1RT6`=l0ShXfS$qkQC zp~C`v@c-0g62ukYxj>)<5#nxe;E9MA(iO%)uDnZ*qjO~Ari#QFLqjbM)%W4jmYNIb zYl=e+ipx-Ud3%sonkPxj%Z_T~iYVKJKaI$z)EKV;&>ljtFj>LV;v9kiWoYFY0&urB z2Pi3tD&V>(WPp!r191^v3~0%QxvLC&SpfQf03MjJ1{qTj04sKw9E@Xw2jZJ12c^lYSxV`uEtvR7)5lg2oIkLr1UvNJ-`RH%$KQ%$|_iMHSOCPhy9f zF>X~W%+%z~_!JC6E(~a9xHr(dc9dDdDKWWVUNXjv#?n*FHo<|t+)6qq-7-(d(&a&? zbd?1xP6D(o4~gwUAZjl0u+>l9JUus1=XfPpk=~IE6w)^vVh%JvVBLEbe`YjPNw_dd zZWBiK*smx>L0p{gclS4~>UXzvurrWqe*K}$WK|scOUt=-46Wv;RBLDWWc2=<&r5V? z1P)zs@SAJj5@Ei&Ws^=flX@fcQMoMYJb31#kQ@=VVpZvQ)po^6mmSN~0`5LvqU(Dh zAST%0cP}+n2uu==ybu?_E7}?0V(KKlKn&#=J~ztwZvDstV@n)z)O9usa%Ey51c7@) zs!rK~B-yY<>9C#%>`Vb3Tgsvr#ftHRKAkS|a*AJe*-D)iTsX5gPnEDv7ycVuwPng5 zJuZBIk#A`TGH`D`_$@bfVoYlh5+ng)bohA||LjG806ZK?Ndf@A)GZ}?i|je~(So@L zYqx|hy%_&zT8zL6YrO-wz#dI^vNSSJlZe<$f>cN#*T9h=L6!u_gaE6vxF9A|l_Elt zg)j3B%A+rRWRGMy;FgEG6oUu-j*a@Lj0P_|s<((Z;1C-JPSK`trNy(MQ zTem<25!{N(?%%#;&*V(@VnHr$iUt_KMXsv{Ac>$O9s%OOuc$-%7*N0RhH*YD>9042 z;ckVDyY|VY=ZEwqMcj0PN(Th@r^OUQeuv)->=K5FHsU(!t_9XH|`pem5ZQ1s6X|5CrH#X z7WixYN(4W+uqi}w4SS~RmGn>P@hA6^WyeU>9Qm%Z)1W_-y?}P;#=T!b1~@_RZeO5;ok@O zW_y?S)|;1zNq@DLe!jtPl5AO{?flTGXJX&;9GoW|_tLQ&AquviZ~}zYf1&7W(re*_72EaS1>&AODS7M>7FIGQ%?fRG~a^#^s?S0DfGj z0lS}^^HGq@x-VBu%bWFpdd<9L<|#$*Iw0I0n6f~k9{4SHw6E?rkj}C+<31@#3NtB zR?G9#;`N(V4U+FN=NVFa5H`u*gLJ3#5LZ?*h_EW@u?cDZcvXKy(~=u)ZaG{^NDCG+dQltNHGtqj79WVfZ!k6Mr)efW`4%Kh;?UY7F$o~}D1KRn_} z)W*>^r!$3=DCphQWrQP$V>FSf1BJ%FGiG*}=wkt9zwzh?kdgIfMV

      M&W%K4Qt?^G1^eN&;m&Uv+y^3lZw=1Q|ZFSbnTA}V93wL>z*_b-~S4|_co za?N`X1@6?qLa*qq27n`R#MY{l$DIGIJGJbubPeI5+qdKg>Su<|xgFrO?{xW=H#44L zh$<#5ye5Tb%G)ftASl(4Br&f1c8dlYWo&GyZ=jD>H8wCXMB5wd>*?vI>Kj_YQt~pD zRc5vbrK&3FN`!T7T}!Ks64ut*v+L%q?w;PhelBZ!_g=r={l221hxZLe1_sA_3nr#g zr)Hmw$ns$8?liPZn>Iqhf%_E~Z+I0JIV^N}r3oD8Q zU3G=(0w1KGun_VH=TV?k*Lzl-n?du}?JL>$H0N=}pEAuq-aLy`vQtH}q>Zq|Ro%fm zXdVfofKgvJQ2@+4{_*LX&xEiX&wQpn#y{*`@hmChT}dB?B1n}U>k`ysW3?79yZ6-Y&osD1 z0RacqUIM=g_b4s6>7EatxcZiua`4AH-$BrZ6E>!d++@@z%aDk;f`@twRjEEP;cE>g z5sO}_oJqlq$z&yjZLq$4Ap4rO8JXY!iaaG#P!a+KC_%B!1uEaa@7PsU!y@jQ>YhjH zL`}S<-+N&@l+;?6K=As;P4Ta_TDJm6&hmSl@Lt>}j3XUOhT$;Qps>;$!9fs#iDsTa zhMA5Z4&d?6;8UG48_zR7fM+^pMXwweNtse~Z}chY7= zBYZ3WvXU<=WkCAc+}b<T1(-7 z-$C&(S`%~Uy!r;k= zhSOW`tlmubr<~5N-`wOG)q6=*5~mEm3|o%b5|sV(nV?gU_~+4^v=RQDMB^fiKDXa* zg(-X&<(ciUuA=zT=JV)lv(n5YrmcFu)!&0UcH-3JQg@V_GeP5NeQDBCv!vx`vu8e>&rk_bXizrpEQ~iOVXgN^wLfYPsPwXw9S` z?EtOlP5R-zX9J!^T%kx~*$GuB5JSX1Six=O=z1y3T~b1$-=#??VS!eCCaf3J31gd3 zAQguIPj*JgVhLy*m@_gB@bF@XAU>e^vh=Fj$piU3AI8Q#vQi>@Ces_rQzU5=ri|S7 zpiTsvf(&HBdooZ+3LAK3K|uM<5d;&680?Dq_t<|R+cnB+POsN7l|K@*NsNIcgq52%cZb(BH|a#3Z?z6B_&{M8SVi?<53 z4_|jxCbyoR^j3jB2YbeURUvMYZFvN66m&hVHK4|pr|-9GX@rqs$i9u#mFp~&d^^?> zJ;bBBKX*br@)W)~3B9n~*La?ngBHb5Ky9YyoLma8Bso%;k1)uW)=l~p8L$t&axic1 zpxT9?@u&u|fRH(EVKZYRREt+kb8D=6S38f*Z`)*L0{66twLK9G%syEM0AWpSCL+sM zVB+k_XAivn{wYrsZb+(fJ1+F`49$>}AL%gaFZEZ`lCvCV23RtS+~Ly1hAr zc3I&zNpJvnC+t&M^6430LG@CZ(}t4&&G7&`cu3)Tk}X=BML}?h9TiPIHIqtVnN=LX zDO;M2*sPI!d}}0F9!;kB<%jBB=R&6n=rqz4zkaqUjAb%;XQ$qqUGEoH6HgK#vtcZq zt{}OYWFyR=$k9kVMwFzoYwS?fFh5ao+|ZA}B#<2Dg}S2kM3=P@mQu4g(Z5}JwSBQT z6afKBI|v>W;0fpg+}C$d8U&CWiYL{XnwpmW|1&iItE0}<)6>$`s;sKY(I}~{)2eIC zZ@Avl+SXoz*VpU#zyI};t_=OOJAL<=1^2S`9}bp0)O*-Ddb_lafuDXdjW?LPKQa0I z#q*_s(b=mDecGkNZ`X=DR|}V3zFJ>gy;U zsr3Y}gr&&?d~JIc^@w{tkI2=L#PlM+2dM=!PUo}{#d6~@vy3aXByYF443hB~z0~M{ zvYS$m_m681E=hKMxF7x{QN}dDZ4XH2fXveMdr_)vRexlIh1{cdk! zaB^p4hJcv51n20rV?46v+6%W^6Fna8D*1B7cYD^VC3~#h`Cf|3%JbIMjjrBQ?4NUf z+l;2ul1DT4tL~iQm#`T1uXgv3UVC!o12y%Ib6wCJL+jJNO1JYHj#X=~-d6_5&n4VS z(h{uxWO)D0Btqv%&&6}9z0*2Ba`m^^+Hc(+dwbR=+{TrrUmtxmJ$1Xa`9XMt`Im@G zD$M)#B~p*73$}mjep)uzx4QN@i@tW~+Qs{rzSl|CgNGJQvPtJ2UAi1JU&#-72eYla znG9*F+`N&$`=y2u36+*+iKFS61YckCmo=-(Cu;Pf4qoXOzRO2`;XduH7$n8%N< zdu*9^cOfW~ki)56(RK6JM3bDHv_h@+HQEOm2s@gEp43(P@Xljgq+2am>&QYrzhaIb z%4$XHW?`9Qv(|^oFD6ndSynOq@}A^J(yC^c{EHR>t9V*OP19tGGL@ZwFJAF}QnNT+ zaiJfO$uK*3wf1C1yf4Z+(+oaZoXb1+C?P*(eTr7(h@Eq;FY)tfODny}-Q^nbi)bkS z+1TQmQ+{1Ag2nU3+JH`%gXT#Ra*b^_AO|-K_@aWYrqoa?*cyd)}H`UEyc4d-`r%*jBa| z>AaX2S9!LSgS*2hZ!z0Adi~yyT^l3VmckH*)YZ0Z` zG#D!2a%$pOBh{*Nf5&acB{OnCdu_#255v26`7c_Tv^(bvzKT*ZPkb!;-8n>d2y&^5 zX%#k)H`X10vU+b+xBp5Q?L^wb!$M>ug*F9*=e^ z{g?1$ZS8N*4^EBe&zYrq!BZaTNsD<1pb zo1}aL*8bL$(e@XC%Kh`AzUBY%(31B1XTQPuqLFDdDzfFZHxSbFw1!{q*T+mwHQufz z1(V#%z%7?=l{xs*68hOrbEJlnp&FL5M*TIfBT(1s?$u-F4ty75ETokO5W5!f!O+os zJ@X)yaDlghn7Vq~pCSgQ)GLmBp(Zi4)E}owolW7h?4s%0Jf@9*tvx|PHoaA?%}Ot= z`n|1DhHysfM^p&yy4T8;jbv^AL84p6+XD*C&lGl^7D&kKpm17-_Tknn zoBd}*Rn$5C&ZHN)Ub4%o8jH#!6N7FFMwZLJb}x)8Ss5BIakQb*?c!jX_kn&iO+v|Q z{NReC(O^%#F!d)4hIY)>j<{a6Akup4@7M*3rscm*%2IE0GF?_-F zkF@KviGJ67ju;%6pd)QmojbVVRvy~tai*{H_}STDy1c!IBkq`3gkqFMb`@RNU+CW1WPcyO|G=>V2Z6-i83~Uw`SpHuyGX;i!HsVhWNwvM zRK4NUT#MN-J2KgF@NOElp=4OqdJ64yK3?9Ss?J7`0wBc6+(v_9hug|Jh@gD)8`LL9 z{&YP(-4=1ECr6o>P~|Yk6!R^id^b7$snsD$`d-DX#wCWIUmIVmZ|Tbs?f<4ehO-VX z7LL1BI$Fzf>i5>)j}W<$Nw+;=8t-kG=$1jhazxp!&X8Gcms@tT;^?U8-4LP~t&Dng zUmfhcp{ER}VBGxty+E&Rw)oKyVn(%--GJ)S8XLF9(5V^k{-Z*=L%uzlWpH$ypPK27Wcsx$4eJQ0I|9zE=lA5_j#lQrL|E1ZqdgKN|X3S z@o(*Mi(~u%rBH(i$&{Ay?#%@YFD9U{Q_QK;iN=+WX~%EOumL1}5F^A`_Kf>ZH*Nw_ zjb|yMv4Xsg_%41T9^#K}57#}vWqs#ukW$rgUYZk9koNaD7SBeVOFTol1|&;XvJt%8 z$Q6JCL=JFu$&4QeT>@2{{QJ1$Pk({n0!UoE2BD5iVz?0@dCn@pW5|8joS*@=MRBcu zIY~U+gBn`*`IHX9jxUQqMaYrb(azi)28$}qf_WTpgUSJwPG$QD;A!2& zCKNYj`|33Cmg^^xOqoAEC8LQX$R2A4V7TvKY(X(!pihFad8qA$Ig7m2 z>5lKB6i8+p0Mx_4&OENjbAbJNJC}gKbbLc?Ga(gB5;~Vc6=xErSsrHue2G+PSvDX+ zHr`F6QF&Ey5Z>GtolD-3ILo2(Xb?cYv&>JVJQ7NoVbykqey+V$0ul^MK&VnqqggUM zhs?Ul@9&2BFiMcWDIxvWxp`|fWeB3!3IVLMR+IgYD(6jaJ*B-%R84=Pg&n$+X=78@ zi$fweLB3l9JJZiQwktgU6c~0ydPFAvG;_*)j78g}-^&Z@FBymF$5phj||x z|B(2Qf^ft`YB6U4E&@dt>zd!k4Or5T_c86;4s zTF!ti1>go0jvNA27>W9n^JdN|drJV2eH4D z$DtbKDKnjaFPM~pNM1Mk6MWbNK3b)jvD2cOXb3d-mdNfxI*{wM|pk%n>5O2vSbTA!rGE z@m8<89&p?Np8(&a9Qh{VOwKGrMFyDX@lXIB45D@n-iZYpGQjKGdEjDNG^)_UC4UqJ z5m-?YytX4x)eef`8O>rFGZ(^`UFLOK)z8uVF$S!`kS}MO*TEA9M zZ&|XuRw_@=!r{{8*nq7?#@a$cyw+K3CWs}Mo?fNlNR`?Bm2z6uuXjp!77G;d#m<|T zd&y@Ll?{-lUZa~HGQKt(LN4;Gbh{(}VspVibn!B}FlVupj;{VstI!kxP;6KnkDy?q zN}DqIiHQh$$$y-k+Pwa2QopNY@z?$<1E(`#QA*HPQkAUgF}RkGT%_{3Kt(DQB{5JX zRbFX6QS*Ad#&Z$m-bmz_Ac0QxSuHmu0>8#!8E*1|QQ+26DN{}xU953$p{4EA@}fcG z<8%S(5GYha%-=K>Bbawq+Qqe`7G1}dE(tBCy;uaf849UQcv>^vw7lriHf&7*zG*du z@zqf$s*IMZ!Y3M$YY-m}HK~?O|82gwQ+y?>xlE=!ETa6fe|f!2Q(AmABJ�PSd{l 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 Wc`9}r&GFfD9nc+1jEB+z!216jjvlrE literal 0 HcmV?d00001 diff --git a/logo.jpg b/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e0c12a418a17beb49136278b4b2fd6e8182f719 GIT binary patch literal 256870 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
      1. 3INm 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

        7pd%Lmwhr|$-}%IyVe(IU1`qp*9 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�TAy&0RlE;Y7UMtQiiiWBbAFRmSOVrhN*U2*A6 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

        FEw^TO)p=$Unob^``}-?fpx>RKFBznh10% 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%0DK`X;Fc=#AivIwDQP^GD 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%0A;I=e^OD_G1JTb3CBJb z!$N-Rf7i(TF`wZd?Vh@9_HcMtX}Yquvr^ag3>9LFZtbRCvL;J%04F_q_-Fhx5AAX0 zvdN(H9)IQX%wYZ#V;@TXfoJ=c-$?%e^q#!#Px$${{C|~i4kfEi$wm?Tzu=ix;QTE} z#mT?F{sH(kar-;|)OO*Fx-LoQ{ywbu9Y5!M#d~IoMC9G_lquo35=yCF*{n48JDfmtM1bjEuej9jy#GX97)NM6e z>omBzju~MwDSWbp#4rB0g@o ziJaG=hJlJD&3ev82TJ%x2AI;)z?uTRMNHec9V;Pe29^-Vy=tDl{sKOp3v^&XuD zKl6?%gf;l>7bz@q?;!oKXf{{WA9KkM1Q^buGWpMLB9xsT^x zkkH~x#@ycCUx)c0r_Uw9Y5SP$d;|Xg3^n1;1z(>Md_UD$?}F_x-;yEQCP5pai*Pw! zFrW=^y@uElnT%f^EOt zZ~Yc)>~cOO##B$+OPkc;#N~7#qY6>wUPt97sqh!$^uSx)>9%rg~=51TW0Gx&x9#Z3ve{O5^<5B+rkH`87iJ zTWpUGcqnrEADhzrKK-Co_nTW}U<$EYr2`+`;y-iRtKR%R{h@x&VEYxhL;NP`8G7zN z!Z0#3k6Qbl^Y2Oi@&1(Szx8A2f30<_-lm!(&7Kx64fa1jX7Fe20b_JteLmDlFkG+N zlXGodtIonO7bEH0wNaYOyJN^~-7l^;)DQ)y0`T?&j zx&HuFAN%Y4tI>{WHrKk3KiMRYlXVR*;?4YjX1lkEky{}?&O5(46@c#gTS8W`| zq+XiE)X(xpa+%m7q zD-K@;Vly+Y(c7o=uU3zY318DScK-nWJx|h)2>$@fU#R}IwQNM3Ia!4aEFo1mqwQbV(%mn=Yj1_tOh0!w zi*!{uztD0ui6p}3uNmgQ&#(3*{{WM~_)-4=V}^(S0Hx5^`U#Kq>;8Rf;Pd|g ziYKXvTB7q>!d!B5)AQ|C1)ZP#wr<{^;Y~m5m+C3<_phHbCl)$$f{&kKGCEYo2$j6O z#{(48kgYFfg>xE`r# z4P%00dG00FzAAf9yGT{{W)lud&Vj+<{xVJZu~P z0EJ&fex~Xgad_X$muilHjQ;>ESAzJz!}kcpw!<8~NY9|j!S}DCuKxhkN%S@3o-+Rc zk7W8E>0gskc527mNndl~e;MdgIv*@@9|UI{jz5)o*Zd>*{{Y?p0LQ=j_3nNv`|^L+ SX09r}s|8v6GtQ|=T>sfs-u2J` literal 0 HcmV?d00001 diff --git a/memo/Formik.html b/memo/Formik.html new file mode 100644 index 00000000..f6befcce --- /dev/null +++ b/memo/Formik.html @@ -0,0 +1,78 @@ + + + + + + Formik & Yup | ☻ itsyuimorii.space + + + + + + + + +

        + + + diff --git a/memo/arrayusage.html b/memo/arrayusage.html new file mode 100644 index 00000000..2ba6dc7c --- /dev/null +++ b/memo/arrayusage.html @@ -0,0 +1,134 @@ + + + + + + 🔻 使用される場面 | ☻ itsyuimorii.space + + + + + + + + +

        # 🔻 使用される場面

        # 例子 1: JavaScript Data Transformation Using Object.values and map

        import { animals, colors } from "../constants";
        +
        +const ANIMAL_OPTIONS: SelectOption[] = Object.values(animals).map((animal) => ({
        +  value: animal,
        +  label: animal.charAt(0) + animal.slice(1).toLowerCase(),
        +}));
        +
        +const COLOR_OPTIONS: SelectOption[] = Object.values(colors).map((color) => ({
        +  value: color,
        +  label: color.charAt(0) + color.slice(1).toLowerCase(),
        +}));
        +
        1. Extracting Object Values with Object.values:

          • Object.values is a method that takes an object as an argument and returns an array containing all the values of that object's properties.
          • Example Usage: In the context of a countries object, Object.values(countries) would extract all country names and create an array of these names, such as ['CANADA', 'UNITED KINGDOM', 'AUSTRALIA'].
        2. Transforming Array Elements with map:

          • The map method creates a new array by performing a specified operation on each element of an array.
          • In the given example, map is used to transform each country name into an object with two properties: value and label. +
            • value: The original country name.
            • label: The country name formatted with the first letter in uppercase and the rest in lowercase, achieved through country.charAt(0) (first character) and country.slice(1).toLowerCase() (remaining characters in lowercase).
        3. Resulting Data Structure:

          • The combination of Object.values and map results in an array of objects, each representing a country option. Each object has a value (the original uppercase country name) and a label (formatted with only the first letter capitalized).
          • Example Output: An array of objects like { canada: 'Canada', unitedkingdom: 'United Kingdom', australia: 'Australia' }, where the keys are lowercase versions of the country names and the values are formatted as specified.

        Key Takeaways:

        • These methods are effective for converting and preparing data from objects into a specific format, such as options for a dropdown menu.
        • Object.values and map offer a common and powerful pattern for data handling and transformation in JavaScript, ensuring consistency and readability in your code.

        # **例子 2: 用Array.prototype.reducearray 轉換成 object **

        1. Defining the Array: +First, define an array containing country names. For example:

          const countries = ["Canada", "United Kingdom", "Australia"];
          +
        2. Using reduce to Transform into an Object: +Use the reduce method to iterate over the array, transforming each array element (country name) into both key and value of the object.

          const countriesObject = countries.reduce((obj, country) => {
          +  const key = country.toLowerCase().replace(/ /g, "");
          +  obj[key] = country;
          +  return obj;
          +}, {});
          +

          In this example, the reduce method takes two parameters: an accumulator (obj) and the current element (country). We first convert the country name to lowercase and remove all spaces to create the key, then assign the original country name (country) as the value.

        3. Accessing Country Names Using the Object: +Once the object is created, you can use it as Cameron described:

          if (country === countriesObject.canada) {
          +  // Logic to handle the scenario
          +}
          +

          在您提供的代码示例中,使用 reduce 方法创建对象时,指定了键(key)和值(value)的过程如下:

          • 键(Key)的创建

            • 键是通过将国家名转换为小写并移除所有空格来创建的。在代码中,这是通过 country.toLowerCase().replace(/ /g, '') 实现的。
            • 这里,country 是数组中的当前元素(即国家名)。toLowerCase() 方法将国家名转换为小写,replace(/ /g, '') 方法则移除所有空格。
            • 这个转换后的字符串(国家名的小写无空格版本)被用作对象的键。
          • 值(Value)的指定

            • 值直接使用原始的国家名(即数组中的当前元素 country)。
            • obj[key] = country; 这行代码中,obj 是累加器对象,key 是经过处理的国家名,country是原始的国家名。
            • 因此,每次迭代时,都会在obj 对象中添加一个新属性,其属性名为处理后的国家名,属性值为原始国家名。

          这种方式确保了在生成的对象中,每个键(处理后的国家名)都对应一个值(原始的国家名)。例如,如果 countries 数组包含 'Canada',则生成的对象会有一个属性,其键为 'canada',值为 'Canada'

        # 称为“属性访问器语法”

        在 Javascript 中, 使用 obj[key] = country; 这种使用方括号 ([]) 的语法是访问或设置对象属性的一种方式,称为“属性访问器语法”。在这个特定的上下文中,它用于动态地设置对象的属性。当您需要动态地将变量的值用作对象键(key)时,使用方括号 ([]) 语法是非常重要和实用的。这种语法使您可以根据变量的值来动态设置或访问对象的属性。

        使用方括号语法动态处理对象属性:

        1. 动态属性名

          • 使用 obj[key] 时,key 是一个变量,其值可以在每次迭代或函数调用中改变。方括号允许使用变量的值作为属性名。
          • 相比之下,点语法(如 obj.key)用于访问名为 "key" 的固定属性,而不是变量 key 的值。
        2. 设置对象属性

          • 表达式 obj[key] = country 表示在对象 obj 上设置一个属性,其属性名为变量 key 的值,属性值为 country
          • 在迭代过程中,根据每个 country 的值动态创建或更新 obj 的属性。
        3. 灵活性和实用性

          • 方括号语法在运行时动态确定属性名,特别适用于处理变量属性名或由表达式计算得到的属性名。
          • 这种方法提高了灵活性,允许根据不同情况和数据设置不同的属性名。
        4. 应用场景

          • 当处理需要根据运行时数据动态创建或访问对象属性的场景(如用户输入、结果计算或数组迭代)时,方括号语法是必需的。

        结论: +使用方括号 (obj[key]) 语法是 JavaScript 中一种强大的特性,允许您的代码根据不同情况动态地处理对象属性。它在如 reduce 方法这样的场景中特别有用,因为它允许根据数组中的每个元素动态构建对象的属性,确保代码的灵活性和一致性。

        # 🔻 Dan tutorial チュートリアル

        
        +const people = [{
        +  name: 'bob',
        +  age: 20,
        +  position: 'developer',
        +},
        +{
        +  name: 'peter',
        +  age: 25,
        +  position: 'designer',
        +},
        +{
        +  name: 'susy',
        +  age: 30,
        +  position: 'the boss',
        +},
        +];
        +
        +// without using map method
        +const name =[]
        +for( let person of People){
        +  names.push(person.name.toUpperCase())
        +}
        +console.log(names); // ["BOB", "PETER", "SUSY"]
        +
        +//with map method
        +const names = people.map(person=>{
        +  return person.name.toUpperCase()
        +})
        +
        +//with map method
        +const names= people.map(person=>person.name.toUpperCase())
        +
        +//with map method
        +const name, age = []
        +const newPeople = people.map((person)=>{
        +  firstName: person.name.toUpperCase(),
        +  oldAge: person.age + 20
        +})
        +
        + + + diff --git a/memo/axios.html b/memo/axios.html new file mode 100644 index 00000000..604ed15b --- /dev/null +++ b/memo/axios.html @@ -0,0 +1,78 @@ + + + + + + Axios | ☻ itsyuimorii.space + + + + + + + + +

        # Axios

        + + + diff --git a/memo/config.html b/memo/config.html new file mode 100644 index 00000000..135ffa97 --- /dev/null +++ b/memo/config.html @@ -0,0 +1,111 @@ + + + + + + コンフィギュレーション | ☻ itsyuimorii.space + + + + + + + + +

        # コンフィギュレーション

        # Install & Update nvm

        To install or update Node Version Manager (nvm), you can use the following commands:

        curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
        +
        +export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
        +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
        +

        Don't forget to source your shell configuration file after the installation:

        source ~/.bashrc
        +

        For zsh users, you can modify your .zshrc file using the following steps:

        nano .zshrc
        +

        To automatically call nvm use if .nvmrc is present, you can add the following snippet to your .zshrc:

        export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
        +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
        +
        +# Place this after nvm initialization!
        +autoload -U add-zsh-hook
        +
        +load-nvmrc() {
        +  local nvmrc_path
        +  nvmrc_path="$(nvm_find_nvmrc)"
        +
        +  if [ -n "$nvmrc_path" ]; then
        +    local nvmrc_node_version
        +    nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
        +
        +    if [ "$nvmrc_node_version" = "N/A" ]; then
        +      nvm install
        +    elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
        +      nvm use
        +    fi
        +  elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
        +    echo "Reverting to nvm default version"
        +    nvm use default
        +  fi
        +}
        +
        +add-zsh-hook chpwd load-nvmrc
        +load-nvmrc
        +

        This configuration will ensure that nvm use is called automatically based on the presence of a .nvmrc file in your project directory.

        + + + diff --git a/memo/gitRealted.html b/memo/gitRealted.html new file mode 100644 index 00000000..b612ca78 --- /dev/null +++ b/memo/gitRealted.html @@ -0,0 +1,82 @@ + + + + + + ⚪️ git and github への深い理解 | ☻ itsyuimorii.space + + + + + + + + +

        # ⚪️ git and github への深い理解

        🔺 常用一些 Git 命令 (opens new window)

        # git branch

        
        +git checkout staging/name
        +git pull origin staging/name  # Ensure you have the latest changes
        +git checkout -b branch-name staging/name
        +

        # git rebase fix old commit

        gitrebase

        1. git rebase -i HEAD~ 2

        2. change the pick to edit r

        3. git commit --amend

        4. wq: write and quit
          +q!: quit without saving
          +i: insert mode
          +

        # Fix the most recent commit message

        git commit --amend
        +

        🔺 ### Reference:

        + + + diff --git a/memo/index.html b/memo/index.html new file mode 100644 index 00000000..3888587f --- /dev/null +++ b/memo/index.html @@ -0,0 +1,74 @@ + + + + + + 🔺 MEMO メモ | ☻ itsyuimorii.space + + + + + + + + +
        + + + diff --git a/memo/jsreview.html b/memo/jsreview.html new file mode 100644 index 00000000..7d7f6fad --- /dev/null +++ b/memo/jsreview.html @@ -0,0 +1,562 @@ + + + + + + ⚪️ JavaScript 深い理解と実践 | ☻ itsyuimorii.space + + + + + + + + +

        # ⚪️ JavaScript 深い理解と実践

        # 🔶 Reference vs Primitive

        In JavaScript, objects and arrays are examples of reference types, which are distinct from primitive types like stringsand Boolean, numbers, undefined, Null.

        heapandstack

        # ▫️ Reference Types in JavaScript:

        • Objects and Arrays:

          • Objects, like the person object, are reference types.
          • They can hold properties with primitive values or other reference types.
          • Nesting of objects or arrays inside a reference type doesn't change its reference type nature.
        • Hobbies Array:

          • The hobbies array, though holding strings (primitive values), is a reference type.
          • Arrays in JavaScript are always considered reference types.

        Difference in Memory Management:

        • Memory Types:

          • JavaScript uses two types of memory: The Stack and the Heap.
        • Stack Memory:

          • The stack is easy-to-access memory, managing items in a stack-like structure.
          • Suitable for items with known sizes in advance (numbers, strings, booleans).
        • Heap Memory:

          • The heap is used for items with dynamic · s and structures, like objects and arrays.
          • Objects and arrays go into the heap since they can be mutated and change at runtime.
        • Pointer Mechanism:

          • Each heap item has an exact address stored in a pointer.
          • The pointer, pointing at the item in the heap, is stored on the stack.

        # ▫️ Strange Behavior of "Reference Types"

        • What's actually stored in the person variable in the following snippet? +b. var person = { name: 'Max' }

        It's b. A pointer to the person object is stored in the variable. The same would be the case for the hobbies array.

        • What does the following code spit out then?
        var person = { name: "Max" };
        +var newPerson = person;
        +newPerson.name = "Anna";
        +console.log(person.name); // What does this line print? 'Anna'
        +
        • Why?

          • Because you never copied the person object itself to newPerson.
          • You only copied the pointer!
          • It still points at the same address in memory though. Hence changing newPerson.name also changes person.name because newPerson points at the exactly same object!

        # ▫️ How to Copy Objects and Arrays:

        Now that we know that we only copy the pointer - how can we actually copy the value behind the pointer? The actual object or array?

        You basically need to construct a new object or array and immediately fill it with the properties or elements of the old object or array.

        You got multiple ways of doing this - also depending on which kind of JavaScript version you're using (during development).

        Here are the two most popular approaches for arrays:

        1. Use the slice() is a standard array method provided by JavaScript. You can check out its full documentation here.

          var hobbies = ["Sports", "Cooking"];
          +var copiedHobbies = hobbies.slice();
          +

        It basically returns a new array which contains all elements of the old element, starting at the starting index you passed (and then up to the max number of elements you defined). If you just call slice(), without arguments, you get a new array with all elements of the old array.

        1. Use the spread operator +If you're using ES6+, you can use the spread operator.

          var hobbies = ["Sports", "Cooking"];
          +var copiedHobbies = [...hobbies];
          +

        Here, you also create a new array (manually, by using []) and you then use the spread operator (...)to "pull all elements of the old array out" and add them to the new array.

        For objects

        1. You can use the Object.assign() syntax which is explained in greater detail here.

          var person = { name: "Max" };
          +var copiedPerson = Object.assign({}, person);
          +

        This syntax creates a new object (the {} part) and assigns all properties of the old object (the second argument) to that newly created one. This creates a copy.

        1. Just as with arrays, you can also use the spread operator on objects.

          var person = { name: "Max" };
          +var copiedPerson = { ...person };
          +

        This will also create a new object (because you used { }) and will then pull all properties of person out of it, into the brand-new objects.

        # 🔶 Deconstruction Assignment

        ES6 Practical Deep Deconstruction Assignment Methods for Deconstructed Objects, Arrays, Hybrid Deconstruction, and Continuous Deconstruction

        # ▫️ Deconstructing Objects

        Without destructuring assignment, accessing the properties of an object or the elements of an array requires dot notation or bracket notation:

        1.1 basic deconstruction format

        let object = { name: "XXX", age: 22 };
        +let name = object.name;
        +let age = object.age;
        +console.log(name, age); // XXX 22
        +

        1.2 variable alias

        if you want to use a different variable name than the property name, you can use the following syntax:

        let object = { name: "XXX", age: 22 };
        +let { name: myName, age: myAge } = object;
        +console.log(myName, myAge); // XXX 22
        +

        1.3 default value

        if 目標對象屬性中沒有要解構的屬性,不指定默認值, 那麼將會是 undefined, 此時可以給要解構變量寫 default 值.

        let { name, age, gender = "female" } = { name: "XXX", age: 22 };
        +

        此種為變量設置默認值的方法,常用與函數參數中,加入調用函數時沒傳遞參數,有可能會對函數運行造成錯誤,那就可以形參位置進行對象解構, 對變量指定默認值。

        function fn({name:'xxx', age = 30 }={}){
        +  console.log(name, age);// xxx 30
        +}
        +

        # ▫️ Deconstructing Arrays

        解構數組和對象有些不同, 解構對象的時候屬性前後位置不影響, 但是解構數組,需要按照 index 順序解構

        2.1 basic deconstruction format +without destructuring assignment, accessing the properties of an object or the elements of an array requires dot notation or bracket notation:

        let array = ["XXX", 22];
        +let name = array[0];
        +let age = array[1];
        +console.log(name, age); // XXX 22
        +

        if with deconstructing assignment, you can use the following syntax:

        let array = ["XXX", 22];
        +let [name, age] = array;
        +console.log(name, age); // XXX 22
        +

        🔻 Scenario 01: To destructure the nested data object within the main data property of a response object to get to the inner data array.

        // Assuming the response object is named `response`
        +const {
        +  data: {
        +    data: [innerData],
        +  },
        +} = response;
        +
        +console.log(innerData); // This will log the inner object represented by the {...} in your screenshot
        +

        This snippet assumes that response is the name of the variable holding the entire object you've shown in your screenshot. The destructuring pattern { data: { data: [innerData] } } navigates through the object structure to the inner data array and grabs the first item from that array, assigning it to the innerData variable. If you want to access other properties at the same level, you can add them to the destructuring pattern accordingly.

        destrcturing

        async function banner() {
        +  // Simulating the structure from your screenshot
        +  const response = await db
        +    .collection("banner-list")
        +    .orderBy("sort", "desc")
        +    .limit(1)
        +    .get();
        +
        +  // Correct destructuring pattern based on the screenshot you provided
        +  let {
        +    data: {
        +      data: [result],
        +    },
        +  } = response;
        +
        +  console.log(result); // This will log the first object from the data array
        +}
        +

        In this updated code, response represents the object returned from the database query. The destructuring pattern { data: { data: [result] } } navigates through the first data object and then the data array to extract the first item of that array into the result variable.

        Please make sure that the db.collection(...).get() method indeed returns an object with a structure similar to the one in your screenshot, with nested data properties. If the structure is different, you'll need to adjust the destructuring pattern accordingly.

        # 🔶 Arrow function の理解

        1. 只有一個參數的函數 (Arrow Function with a Single Parameter):
        (參數) => 返回值;
        +// 例如:
        +(x) => x * 2;
        +
        1. 沒有參數或多個參數的函數 (Arrow Function with No or Multiple Parameters):

          // 沒有參數時使用空的小括號
          +() => 返回值
          +
          +// 多個參數時使用小括號括起來
          +(參數1, 參數2) => 返回值
          +// 例如:
          +(a, b) => a + b
          +
        2. 箭頭後面的值就是返回值 (Arrow Function Expression):

          • 返回值必須是一個表達式。什麼叫表達式?有返回值的語句就是表達式。
        3. 如果返回值是一個對象,需要用括號包起來 (Object as Return Value):

          () => ({ key: "value" });
          +
        4. 如果需要在 arrow function 裡定義邏輯, 可以直接在箭頭後跟一個代碼塊,代碼塊中的語法和普通函數沒有區別。

          (參數1, 參數2) => {
          +  // 邏輯
          +  return 返回值;
          +};
          +

        # 🔶 キーワード "this "の理解

        # アロー関数で書く理由 ① 関数を短く書きたい

        //アロー関数
        +const arrowAddFunc = (a, b) => {
        +  return a + b;
        +};
        +
        +//1個しか評価項目が無い場合は以下のようにも書ける
        +//中括弧とreturnの省略が出来る
        +const arrowAddFunc = (a, b) => a + b;
        +
        +//評価項目が1個だけ、かつ引数が1個しか無い場合はこのようにも書ける
        +//括弧も省略できる
        +const arrowDoubleFunc = (a) => 2 * a;
        +

        省略して、1行で書ける事も出来ますが、アロー関数を書き慣れていない人がパッと見た時に、やや分かりづらいかもしれません。必ずしも1行で書かなければいけない理由はありません。いずれにしろ、 function をいちいち書く必要がなく、短く書く事が出来ます。しかしアロー関数の真価は this を束縛しないという点にあるでしょう。

        # アロー関数で書く理由 ② this を束縛しない

        アロー関数で短く書けます!と説明されても、へーそうなんだ。。。で終わると思いますが、アロー関数を使う上でちゃんと理解しておきたいのは、こちらの方かと思います。

        それは、this の値は関数定義時に決まる(=this を束縛しない) というルールです。 +this を束縛しない、という説明はやや分かりづらいので、ここでは、アロー関数を使えば、this の値は関数定義時に決める事ができる、という理解で大丈夫でしょう。

        JavaScript で this を扱う時、最初は分かりづらい...直感的でない...という事は、JavaScript を書いてる方なら、分かって頂けるかなと思います。this の呼び出しパターンにはいくつかあるのですが、ここでは、アロー関数を使うメリットを説明する上で、メソッド呼び出しパターンと関数呼び出しパターンを事前に例として挙げておきます。this を理解する上で大切なのは、呼び出し元が何であるかという事です。まずはメソッド呼び出しパターンから説明します。

        # メソッド呼び出しパターン

        以下のコードを実際に打ち込んで、console.log で確認してみましょう。

        const object = {
        +  value: "test",
        +  method1: function () {
        +    return this; //①何が返されるでしょう?
        +  },
        +  method2: function () {
        +    return this.value; //②何が返されるでしょう?
        +  },
        +};
        +
        +//① thisはobject自身を参照している
        +console.log(object.method1()); //{ value: 'test', method: [Function: method] }
        +//② thisはobject自身を参照しているので、valueプロパティにもアクセスできる
        +console.log(object.method2()); // test
        +

        # 🔶 キーワード "class"の理解

        # Class の 基本概念

        A class is a template for an object that defines its properties and methods. In JavaScript, classes can be defined using the class keyword.

        class MyClass {
        +  // class of constructor functions that are called when the instance is created.
        +  constructor() {
        +    console.log(this); // In a constructor function, this points to the instance object.
        +  }
        +
        +  // 類的實例方法
        +  myMethod() {
        +    console.log(this); // In the method, this still points to the instance object.
        +  }
        +
        +  // 類的靜態方法
        +  static myStaticMethod() {
        +    console.log(this); // In static methods, this points to the class itself.
        +  }
        +}
        +
        +// Examples of Creation
        +const myInstance = new MyClass();
        +
        +// Calling Example Methods
        +myInstance.myMethod();
        +
        +// Calling the static method
        +MyClass.myStaticMethod();
        +

        # Strict mode && Class

        • All code in the class is executed in strict mode
        • In strict mode, when a function is called in the global context, this is no longer a global object (usually a window), but is undefined.
        "use strict";
        +
        +class MyClass {
        +  constructor() {
        +    console.log(this); // 在構造函數中,this 仍然指向實例對象
        +  }
        +
        +  myMethod() {
        +    console.log(this); // 在方法中,this 仍然指向實例對象
        +  }
        +
        +  static myStaticMethod() {
        +    console.log(this); // 在靜態方法中,this 是指向類本身
        +  }
        +}
        +
        +// 創建類的實例
        +const myInstance = new MyClass();
        +
        +// 調用實例方法
        +myInstance.myMethod();
        +
        +// 調用靜態方法
        +MyClass.myStaticMethod();
        +
        +// 在全局上下文中,調用函數(不是在類中)
        +function globalFunction() {
        +  console.log(this); // 在嚴格模式下,全局上下文中的 this 將是 undefined
        +}
        +
        +// 在嚴格模式下,全局上下文中的 this 將是 undefined
        +globalFunction();
        +

        # 箭頭函數在 Class 中的影響

        • 如果類中的方法是以箭頭函數定義的,則方法中的 this 將指向類的實例對象。
        class MyClass {
        +  myArrowMethod = () => {
        +    console.log(this); // 在箭頭函數中,this 指向類的實例對象
        +  };
        +}
        +
        +const myInstance = new MyClass();
        +myInstance.myArrowMethod(); // 調用箭頭函數方法
        +

        この形式の書き方は、アロー関数内の this が常にクラスのインスタンスオブジェクトを指すようにし、関数の呼び出し方法の影響を受けないように確保します。

        # クラスの継承

        • 継承を使用すると、クラス内のプロパティやメソッドを利用でき、さらに新しいプロパティやメソッドをサブクラスに追加できます。
        • extends を使用してクラスを継承し、継承後はまるでそのクラスのコードが現在のクラスにコピーされたかのようになります。
        • 親クラスのメソッドを上書きすることができますが、親クラスのメソッドは上書きされず、サブクラスに同じ名前のメソッドが追加されます。

        サブクラスで親クラスのコンストラクタを上書きする場合、サブクラスのコンストラクタ内で super() を呼び出さなければなりません。そうしないとエラーが発生します。

        # 🔶 Static Properties and Static Methods in Classes

        ...待補充

        # 🔷 Array 主なメソッド

        Standard built-in objects-Array (opens new window)

        # ▫️ Array.prototype.push()

        # ▫️Array.prototype.from()

        • 用途:從具有長度屬性的對象或可迭代對象創建數組。
        • 示例
        let filledArray = Array.from({ length: 10 }, () => ({ hello: "goodbye" }));
        +

        # ▫️Array.prototype.fill()

        • 用途:填充數組的每個元素為相同的值。
        • 示例
          let filledArray = new Array(10).fill("hello");
          +
        • 特點:適用於不可變值(如數字、字符串、布爾值)。
        • 問題:用於對象時,填充的是對同一對象的引用。
          let filledArray = new Array(10).fill({ hello: "goodbye" });
          +

        # 填充唯一對象

        • 方法:結合 fillmap
          let filledArray = new Array(10).fill(null).map(() => ({ hello: "goodbye" }));
          +
        • 特點:創建具有唯一對象引用的數組。
        • 注意map 方法可能對大數據集來說代價昂貴。

        # 使用 for 循環

        • 方法:傳統的 for 循環。
          let filledArray = new Array(10);
          +for (let i = 0; i < 10; i++) {
          +  filledArray[i] = { hello: "goodbye" };
          +}
          +
        • 特點:避免了使用 map 方法。

        # 使用展開語法 (...)

        • 方法:結合展開語法和 map
          let filledArray = [...new Array(10)].map(() => {'hello':'goodbye'});
          +
        • 特點:避免使用 fill,但仍使用 map

        # 🔸 Array.prototype.map()

        Array.prototype.map() + (opens new window)

        • map() メソッドは、新しい配列を作成し、元の配列の各要素をコールバック関数で処理した結果を含みます。
        • コールバック関数が必要で、その戻り値が新しい配列内の各要素になります。
        const array = [1, 4, 9, 16];
        +
        +// マップに関数を渡す
        +const result = array.map((item) => item * 2);
        +
        +// 回調函數中會出現三個參數:當前元素、當前索引和原始數組。
        +result = arr.map(function (currentValue, index, arr) {
        +
        +}[, thisArg]);
        +
        +console.log(result);
        +// 期待される出力: Array [2, 8, 18, 32]
        +

        使用シーン:ウェブページで配列を表示し、各配列要素にはラベルが必要な場合。

        const fruits = ["apple", "banana", "orange"];
        +
        +const result = fruits.map((fruit) => `<li>${fruit}</li>`);
        +

        🔻 使用シナリオ

        例子 1:使用 get 方法获取 Map 中的值

        const userPreferences = new Map();
        +
        +// 添加用户喜好设置
        +userPreferences.set("theme", "dark");
        +userPreferences.set("language", "en");
        +
        +// 获取特定键的值
        +const theme = userPreferences.get("theme");
        +console.log(theme); // 输出 'dark'
        +

        例子 2:使用 set 方法添加或更新 Map 中的键值对

        const userData = new Map();
        +
        +// 添加用户数据
        +userData.set("username", "user123");
        +userData.set("email", "user@example.com");
        +
        +// 更新用户数据
        +userData.set("email", "newuser@example.com");
        +

        例子 3:使用 has 方法检查 Map 中是否存在键

        const userPermissions = new Map();
        +
        +// 检查是否存在特定权限
        +userPermissions.set("admin", true);
        +userPermissions.set("editor", false);
        +
        +if (userPermissions.has("admin")) {
        +  console.log("用户是管理员");
        +} else {
        +  console.log("用户不是管理员");
        +}
        +

        例子 4:使用 delete 方法从 Map 中删除键值对

        const dataStore = new Map();
        +
        +// 添加数据
        +dataStore.set("key1", "value1");
        +dataStore.set("key2", "value2");
        +
        +// 删除数据
        +dataStore.delete("key1");
        +

        例子 5:使用 size 属性获取 Map 的大小

        const cartItems = new Map();
        +
        +// 添加购物车商品
        +cartItems.set("item1", { name: "Product A", price: 10 });
        +cartItems.set("item2", { name: "Product B", price: 15 });
        +
        +// 获取购物车商品数量
        +const itemCount = cartItems.size;
        +console.log(`购物车中有 ${itemCount} 件商品`);
        +

        例子 6:使用 forEach 方法迭代 Map 中的键值对

        const userRoles = new Map();
        +
        +// 添加用户角色
        +userRoles.set("user123", "user");
        +userRoles.set("admin456", "admin");
        +
        +// 遍历用户角色
        +userRoles.forEach((role, username) => {
        +  console.log(`${username} 的角色是 ${role}`);
        +});
        +

        例子 7:使用 keys 方法获取 Map 中的所有键

        const menuItems = new Map();
        +
        +// 添加菜单项
        +menuItems.set("home", "Home Page");
        +menuItems.set("about", "About Us");
        +menuItems.set("contact", "Contact Us");
        +
        +// 获取所有菜单项的键
        +const menuItemKeys = Array.from(menuItems.keys());
        +console.log(menuItemKeys); // 输出 ['home', 'about', 'contact']
        +

        # ▫️ Array.prototype.filter()

        • filter() メソッドは、指定された関数によって評価された元の配列の要素から構成される新しい配列を作成します。 +
          • 配列から条件に合致する要素を取得できます。
          • コールバック関数の結果に基づいて、要素の保持または削除が決まります。結果が true なら保持し、false なら削除します。
        const array = [1, 2, 3, 4];
        +
        +const result = array.filter((item) => item % 2 === 0);
        +
        +//代碼處理邏輯: number%2 === 0 ? true : false 如果返回true,就留,否則就不留
        +console.log(result);
        +// expected output: Array [2, 4]
        +

        # ▫️ Array.prototype.find()

        • find() メソッドは、与えられたテスト関数を満たす配列内の最初の要素の値を返します。そうでなければ、undefined を返します。
        const array = [5, 12, 8, 130, 44];
        +const found = array.find((element) => element > 10);
        +
        +console.log(found);
        +// expected output: 12
        +

        # ▫️ Array.prototype.reduce() (opens new window)

        • reduce() メソッドは、アキュムレータと配列の各要素(左から右へ)をコールバック関数に渡し、配列を単一の値にまとめます。

          • 配列の各要素に対して、コールバック関数を実行します。
          • コールバック関数の戻り値をアキュムレータに代入します。
          • reduce() メソッドは、関数をアキュムレータとして受け取り、配列の各値を(左から右へ)最終値まで縮小していきます。
          • 配列の要素が結合され、値が返されます。
        const array1 = [1, 2, 3, 4];
        +
        +// 0 + 1 + 2 + 3 + 4
        +const initialValue = 0;
        +const sumWithInitial = array1.reduce(
        +  (accumulator, currentValue) => accumulator + currentValue,
        +  initialValue
        +);
        +
        +console.log(sumWithInitial);
        +// Expected output: 10
        +

        🔺 応用シナリオ

        1. Calculating Total Amount in a Shopping Cart +Suppose you have a shopping cart application, where each item has a price and quantity, and you want to calculate the total amount.
        const cart = [
        +  { item: "Apple", price: 1.2, quantity: 2 },
        +  { item: "Banana", price: 0.5, quantity: 5 },
        +  { item: "Orange", price: 0.8, quantity: 3 },
        +];
        +

        # ▫️ Array.prototype.forEach()

        • forEach() メソッドは、与えられた関数を配列の各要素に対して一度ずつ実行します。
        const array = [1, 2, 3, 4];
        +
        +array.forEach((item) => {
        +  console.log(item);
        +  // expected output: 1
        +});
        +

        # 🔷 Object method

        # ▫️Object.defineProperties

        //使用 Object.defineProperties
        +//創建和配置對象屬性: Object.defineProperties 被用來在 obj 對象上定義兩個屬性 a 和 b。這些屬性被配置為有特定值(分別為 1 和 2),並且是可枚舉的(enumerable: true)。
        +
        +//屬性值和可枚舉性: 設置 value 來指定屬性的值,並通過 enumerable 標記屬性是否應該出現在對象的枚舉屬性中。
        +
        +const obj = {};
        +
        +Object.defineProperties(Obj, {
        +  a: {
        +    value: 1,
        +    enumerable: true,
        +  },
        +  b: {
        +    value: 2,
        +    enumerable: true,
        +  },
        +});
        +

        # ▫️ Object.entries()

        • 使用 Object.entries(obj) 將 obj 對象轉換為一個鍵值對的數組(二維數組)。每個子數組包含一個鍵和對應的值。
        • 返回值:给定对象自己的可枚举字符串键控属性键值对的数组。每个键值对都是一个包含两个元素的数组:第一个元素是属性键(始终是字符串),第二个元素是属性值。
        const object = {
        +  a: "someString",
        +  b: 42,
        +};
        +const testArr = Object.entries(object);
        +console.log(testArr);
        +
        +//遍歷鍵值對列表: 使用 for...of 循環遍歷 Object.entries(obj) 返回的鍵值對列表,並打印每個鍵和對應的值。 `new Map([["a", 1], ["b", 2]])` 創建了一個包含兩個鍵值對的 Map 對象。
        +for (let [k, v] of testArr) {
        +  console.log(k, v);
        +}
        +
        +//用map方法將鍵值對列表轉換成map類型的數據: 通過將鍵值對的數組傳遞給 Map 的構造函數來創建一個新的 Map 對象。
        +
        +const m = new Map([
        +  ["a", 1],
        +  ["b", 2],
        +]);
        +
        • 應用 1: Converting an Object to a Map: +
          • The Map() constructor accepts an iterable of entries. With Object.entries, you can easily convert from Object to Map:
        const obj = { foo: "bar", baz: 42 };
        +const map = new Map(Object.entries(obj));
        +console.log(map); // Map(2) {"foo" => "bar", "baz" => 42}
        +
        • 應用 2: Iterating through an Object
        // Using for...of loop
        +const obj = { a: 5, b: 7, c: 9 };
        +for (const [key, value] of Object.entries(obj)) {
        +  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
        +}
        +
        +// Using array methods
        +Object.entries(obj).forEach(([key, value]) => {
        +  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
        +});
        +

        # ▫️ Object.fromEntries()

        • Object.fromEntries() 是 Object.entries() 的逆操作,作用是将一个键值对数组转化为對象,返回的是新對象,不改变原对象
        • 只是 Object.entries() 只返回字符串键属性,而 Object.fromEntries() 还可以创建符号键属性。
        Object.fromEntries([
        +  ["a", "1"],
        +  ["b", 2],
        +]);
        +
        • 也可以传入一个 Map 将其转为对象
        const map = new Map().set("a", 1).set("b", 2);
        +
        +Object.fromEntries(map);
        +

        Object.fromEntries()實際應用:

        1. 過濾屬性
        function foo(obj, ...keys) {
        +  return Object.fromEntries(
        +    Object.entries(obj).filter(([key]) => keys.includes(key))
        +  );
        +}
        +
        +console.table(foo({ name: "oli", age: "12" }, "name"));
        +

        這個 foo 函數接受一個對象和一系列鍵作為參數,然後返回一個新的對象,其中只包含指定的鍵及其相應的值。具體來說:

        1. Object.entries(obj) 會將 obj 轉換為一個二維數組,每個內部數組包含一對鍵值(例如 [['name', 'oli'], ['age', '12']])。

        2. .filter(([key]) => keys.includes(key)) 會過濾這個數組,只保留那些鍵存在於 keys 參數中的鍵值對。

        3. Object.fromEntries() 將過濾後的二維數組轉回為對象。

        在您的例子中,調用 foo({ name: "oli", age: "12" }, "name") 會返回一個只包含 name 鍵和其對應值的新對象。因此,這個函數調用的輸出將是:

        { "name": "oli" }
        +

        console.table 會以表格的形式在控制台輸出這個對象,顯示 name 這一列及其對應的值 oli

        1. 将 url 查询字符串转为对象
        query = Object.fromEntries(new URLSearchParams("foo=bar&baz=qux"));
        +

        🔻 應用 1: 使用 Object.entriesObject.fromEntries 的代碼例子

        例子 1:将对象转换为 Map 并操作数据

        const obj = { a: 1, b: 2, c: 3 };
        +
        +// 使用Object.entries将对象转换为Map
        +const map = new Map(Object.entries(obj));
        +
        +// 在Map上进行数据操作
        +map.set("d", 4);
        +map.delete("b");
        +
        +// 使用Object.fromEntries将Map转换回对象
        +const newObj = Object.fromEntries(map);
        +
        +console.log(newObj); // 输出 { a: 1, c: 3, d: 4 }
        +

        例子 2:将路由参数对象转换为 Map 并重新映射键名

        const routeParamsObj = { userId: 123, actionType: "edit" };
        +
        +// 使用Object.entries将路由参数对象转换为Map
        +const routeParamsMap = new Map(Object.entries(routeParamsObj));
        +
        +// 重新映射键名
        +routeParamsMap.set("id", routeParamsMap.get("userId"));
        +routeParamsMap.delete("userId");
        +
        +// 使用Object.fromEntries将Map转换回路由参数对象
        +const newRouteParamsObj = Object.fromEntries(routeParamsMap);
        +
        +console.log(newRouteParamsObj); // 输出 { id: 123, actionType: 'edit' }
        +

        这些示例演示了如何使用 Object.entriesObject.fromEntries 来进行对象和 Map 之间的转换,并对数据进行操作和重映射。

        🔻 應用 2: 將對象轉換為 Map

        當將对象转换为 Map 时,有许多应用场景,以下是其中一些示例:

        1. API 响应数据解析: 当从 API 获取数据时,通常以 JSON 对象的形式返回。将 JSON 对象转换为 Map 可以更容易地提取和操作所需的数据字段。
        const apiResponse = { id: 1, name: "John", age: 30 };
        +const dataMap = new Map(Object.entries(apiResponse));
        +console.log(dataMap.get("name")); // 输出 'John'
        +
        1. 表单数据处理: 在 Web 应用程序中,用户提交的表单数据通常作为对象传输。将表单数据转换为 Map 可以更容易地验证、操作和处理这些数据。
        const formData = { username: "user123", email: "user@example.com" };
        +const formDataMap = new Map(Object.entries(formData));
        +console.log(formDataMap.get("email")); // 输出 'user@example.com'
        +
        1. 路由参数: 在一些 Web 框架中,路由参数可能作为对象传递给控制器或路由处理程序。将路由参数转换为 Map 可以更方便地访问它们。
        const routeParams = { id: 123, action: "edit" };
        +const routeParamsMap = new Map(Object.entries(routeParams));
        +console.log(routeParamsMap.get("id")); // 输出 123
        +
        1. 配置管理: 在应用程序中,通常需要存储和管理配置数据。将配置对象转换为 Map 可以提供更好的配置管理和访问。
        const config = { apiKey: "your-api-key", apiUrl: "https://api.example.com" };
        +const configMap = new Map(Object.entries(config));
        +console.log(configMap.get("apiUrl")); // 输出 'https://api.example.com'
        +
        1. 数据转换和处理: 在某些情况下,需要对数据进行转换或处理,例如将对象中的某些字段重新映射到新的键。将对象转换为 Map 可以帮助执行这些操作。
        const person = { first_name: "John", last_name: "Doe" };
        +const personMap = new Map(Object.entries(person));
        +personMap.set(
        +  "full_name",
        +  `${personMap.get("first_name")} ${personMap.get("last_name")}`
        +);
        +console.log(personMap.get("full_name")); // 输出 'John Doe'
        +

        # ▫️ Object.assign()

        # ▫️ Object.create()

        Reference: +Object.fromEntries (opens new window)

        # Data Structure

        # Object 和 Map 區別

        共同點: Object 和 Map 都允許你按鍵存取一個值、刪除鍵、檢查一個鍵是否存在、以及迭代其餘的鍵。

        1. 構造方法的不同
        • Object 的构造方法:Object可以使用对象字面量的方式创建,也可以使用new Object()Object.create(null)来创建。

          const obj = {
          +key1: "value1",
          +key2: "value2",
          +};
          +
          +//構造方法
          +const obj = new Object();
          +const ojb2= Object.create(null);
          +
        • Map 的构造方法:Map 需要使用new Map()的方式来创建,也可以通过传入一个包含键值对的数组来初始化。

          const map = new Map()
          +const map = new Map([
          +["key1", "value1"],
          +["key2", "value2"],
          +]);
          +
        1. value 的類型的不同
        • Object: 鍵類型必須是 String 或者 Symbol,如果是非 String 類型,會進行數據類型轉換,轉換成 String 類型,再進行操作。

          const obj = {
          +1: "value1",
          +true: "value2",
          +undefined: "value3",
          +null: "value4",
          +[Symbol()]: "value5",
          +};
          +
          +console.log(obj); // {1: "value1", true: "value2", undefined: "value3", null: "value4", Symbol(): "value5"}
          +

        mapobject

        • Map: 鍵類型可以是任意類型,包括原始類型和引用類型, 不會進行數據類型轉換。 在添加鍵值對時, 會通過 === 來判斷鍵是否相等。

          const map = new Map( );
          +map.set(1, "value1");
          +map.set('a',1)
          +map.set(true, "value2");
          +map.set(undefined, "value3");
          +map.set(null, "value4");
          +map.set(Symbol(), "value5");
          +
          +console.log(map); // Map(5) {1 => "value1", true => "value2", undefined => "value3", null => "value4", Symbol() => "value5"}
          +
        1. 鍵的順序
        • Object

          • key 是無序的, 不會按照添加的順序返回。 1.對於>=0 的整數, 會按照大小排序。對於小數和負數, 會當作字符串處理。
          • 對於字符串, 會按照定義的順序輸出
          • symbol 類型,會直接過濾掉,不會進行輸出。如果想輸出, 需要使用Object.getOwnPropertySymbols方法。
        • Maps

          • key 是有序的, 會按照添加的順序返回。
          • key 可以是任意類型, 包括原始類型和引用類型。
          • key 的比較是===, 即使是兩個看起來一樣的數字, 也會被認為是不同的鍵。
          • size 屬性可以獲取 Map 的大小。
        1. 鍵值對的訪問
        • Object

          • 添加或者修改屬性, 通過 點或者中括號的方式訪問。
          • 判斷屬性是否存在, 通過 in 或者 hasOwnProperty方法。
          • 刪除屬性, 通過 delete 操作符。
        • Map

          • 添加或者修改屬性, 通過set方法。
          • 判斷屬性是否存在, 通過has方法。
          • 刪除屬性, 通過delete方法。
          • get 方法可以獲取屬性值。
          • clear 方法可以清空所有屬性。
          • 通過keys方法可以獲取所有的 key。
          • 通過values方法可以獲取所有的 value。
          • 通過entries方法可以獲取所有的 key value。
        1. 迭代
        • Object

          • 不具備 Iterator 特性,無法使用 for...of 循環迭代。
        • Map

          • 具備 Iterator 特性,可以使用 for...of 循環迭代。
        const map = new Map([
        +  ["key1", "value1"],
        +  ["key2", "value2"],
        +]);
        +
        +for (const [key, value] of map) {
        +  console.log(`${key} ${`v`alue}`); // "key1 value1", "key2 value2"
        +}
        +
        1. JSON.stringify() 轉換
        • Map 類型的數據無法使用 JSON.stringify() 方法轉換為 JSON 字符串, 需要先轉換為對象。
        const obj = { a: 1, b: 2, c: 3 };
        +const map = new Map([
        +  ["key1", "value1"],
        +  ["key2", "value2"],
        +]);
        +
        +console.log(JSON.stringify(obj)); // {"a":1,"b":2,"c":3}
        +
        1. ObjectMap 的性能比較
        2. size-Object
        • Object 沒有 size 屬性, 需要通過 Object.keys(obj).length 來獲取對象的大小。
        • Map 有 size 屬性, 可以直接獲取 Map 的大小。

        🔺 Reference: +4 Ways to Populate an Array in JavaScript (opens new window)

        # Set 和 Map 區別

        以下是 Set 和 Map 之间的一些主要区别和用途:

        1. Set(集合):
          • 用于存储唯一值,不允许重复的元素。
          • 主要用途是存储一组唯一的元素,如集合、去重和检查元素是否存在。
          • 不需要键值对,只存储单个值。
          • 可以通过add方法添加元素,使用has方法检查元素是否存在,使用delete方法删除元素。
        const uniqueNumbers = new Set([1, 2, 3, 2, 4, 5]);
        +console.log(uniqueNumbers); // 输出 Set { 1, 2, 3, 4, 5 }
        +
        1. Map(映射):
          • 用于存储键值对,允许根据键来访问值。
          • 主要用途是创建键值对的映射,可以用于任何需要键值关联的场景。
          • 存储键值对,键可以是任何数据类型,值也可以是任何数据类型。
          • 可以通过set方法添加键值对,使用get方法根据键获取值,使用delete方法删除键值对。
        const userPreferences = new Map();
        +userPreferences.set("theme", "dark");
        +userPreferences.set("language", "en");
        +console.log(userPreferences.get("theme")); // 输出 'dark'
        +

        Set 是 JavaScript 中的一种数据结构,它具有许多优势,使其在各种应用场景中非常有用。以下是 Set 的一些主要优势:

        1. 唯一性: Set 中的值是唯一的,不会重复。这意味着你可以使用 Set 来存储一组唯一的元素,而不必担心重复值。
        const uniqueNumbers = new Set([1, 2, 3, 2, 4, 5]);
        +console.log(uniqueNumbers); // 输出 Set { 1, 2, 3, 4, 5 }
        +
        1. 查找和去重: 使用 Set 可以轻松查找特定元素是否存在于集合中,并且在添加元素时自动去重。
        const fruits = new Set();
        +fruits.add("apple").add("banana").add("apple");
        +
        +console.log(fruits.has("apple")); // 输出 true
        +console.log(fruits.size); // 输出 2,自动去重
        +
        1. 集合操作: Set 提供了各种集合操作方法,如交集、并集和差集,使你能够方便地进行数据操作。
        const set1 = new Set([1, 2, 3]);
        +const set2 = new Set([2, 3, 4]);
        +
        +// 交集
        +const intersection = new Set([...set1].filter((value) => set2.has(value)));
        +console.log(intersection); // 输出 Set { 2, 3 }
        +
        +// 并集
        +const union = new Set([...set1, ...set2]);
        +console.log(union); // 输出 Set { 1, 2, 3, 4 }
        +
        +// 差集
        +const difference = new Set([...set1].filter((value) => !set2.has(value)));
        +console.log(difference); // 输出 Set { 1 }
        +
        1. 队列操作: Set 的特性允许你实现一个简单的队列结构。可以使用 Set 来添加元素到队尾,并从队首删除元素。
        const queue = new Set();
        +
        +queue.add("item1");
        +queue.add("item2");
        +
        +const firstItem = queue.values().next().value; // 获取队首元素
        +queue.delete(firstItem); // 删除队首元素
        +queue.delete(queue.value.next().value); // 删除队首元素
        +

        总之,Set 在 JavaScript 中的使用非常灵活,适用于处理唯一值的情况以及各种集合操作。它可以在查找、去重、集合操作和队列等多种场景中提供便利的解决方案。

        + + + diff --git a/memo/reacthooks.html b/memo/reacthooks.html new file mode 100644 index 00000000..5a83d9d4 --- /dev/null +++ b/memo/reacthooks.html @@ -0,0 +1,321 @@ + + + + + + ⚪️ ReactHooks を深く理解する | ☻ itsyuimorii.space + + + + + + + + +

        # ⚪️ ReactHooks を深く理解する

        # 🔷 useEffect

        # ▫️ what is useEffect

        useEffect 是 React 中的一個 Hook,它主要用於處理副作用操作,例如異步數據的獲取、對已渲染的結果進行更新渲染等。

        • 第二個參數:依賴數組

          useEffect 的第二個參數,通常是一個依賴數組,決定了 useEffect 何時執行。這個參數的作用有以下幾種情況:

          1. 空數組 []:當依賴數組為空時,useEffect 只會在組件挂載時運行一次,就像 componentDidMount。這對於僅在組件挂載和卸載時執行一次的操作非常有用,例如初始化資料

          2. 非空數組 [依賴1, 依賴2, ...]:當依賴數組中的任何一個依賴發生變化時,useEffect 會運行。這對於需要根據特定狀態或 prop 執行操作的情況非常有用。如果你希望 useEffect 在每次渲染時都運行,則不傳入第二個參數即可。

          簡而言之,useEffect 的第二個參數決定了該 hook 何時執行,它提供了對 hook 執行的細粒度控制。

        • side effect(外部影響內部): 從外部獲取數據,對內部渲染的結果產生了作用

        # ▫️ Basic Purpose

        import React, { useState, useEffect } from "react";
        +
        +function MyComponent() {
        +  const [count, setCount] = useState(0);
        +
        +  useEffect(() => {
        +    console.log("---回调中---");
        +    console.log(document.querySelector("h1"));
        +    console.log("當前的值: ", count);
        +  }, []); // 这里的空数组表示只在组件挂载时运行一次
        +
        +  console.log("***组件中***");
        +
        +  return (
        +    <>
        +      <h1 onClick={() => setCount(count + 1)}>Hello World! {count}</h1>
        +    </>
        +  );
        +}
        +
        +const container = document.getElementById("root"); // 这里假设你的根 DOM 元素的 id 是 "root"
        +
        +export default MyComponent;
        +

        輸出結果

        • 如果组件首次挂载(加载),那么输出将如下所示:

          ***组件中***
          +---回调中---
          +null
          +當前的值: 0
          +
          • ***组件中***会在每次组件函数被调用时输出。
          • ---回调中---会在useEffect的回调函数内部输出,只有在组件挂载时才会执行一次。
          • null是因为在组件挂载时,<h1>元素还没有被渲染到 DOM 中,所以document.querySelector("h1")返回null
          • 當前的值: 0表示count的初始值为 0。
        • 如果用户点击<h1>元素以增加count的值,那么每次点击后的输出将如下所示,以点击两次为例:

          ***组件中***
          +---回调中---
          +<h1>Hello World! 1</h1>
          +當前的值: 1
          +***组件中***
          +---回调中---
          +<h1>Hello World! 2</h1>
          +當前的值: 2
          +
          • ***组件中***会在每次组件函数被调用时输出。
          • ---回调中---会在useEffect的回调函数内部输出,但它只在组件挂载时执行一次,所以之后点击<h1>元素不会再次触发该输出。
          • <h1>Hello World! 1</h1><h1>Hello World! 2</h1>是每次点击后,React 重新渲染组件后生成的<h1>元素。
          • 當前的值: 1當前的值: 2表示count的值在每次点击后更新。

        # ▫️ Second Argument - Dependency Array

        import React, { useState, useEffect } from "react";
        +
        +function App() {
        +  const [count, setCount] = useState(0);
        +  const [page, setPage] = useState(1);
        +
        +  useEffect(() => {
        +    console.log("---回调中---");
        +    console.log(document.querySelector("h1"));
        +    console.log("當前的值: ", count);
        +    console.log();
        +  }, [page]); // 这里的空数组表示只在组件挂载时运行一次
        +
        +  console.log("***组件中***");
        +
        +  return (
        +    <>
        +      <h1 onClick={() => setCount(count + 1)}>Hello World! {count}</h1>
        +      <button onClick={() => setPage(page + 1)}>Next Page </button>
        +    </>
        +  );
        +}
        +
        +export default App;
        +

        如果同时点击 "Hello World!" <h1> 元素和 "Next Page" 按钮,会同时触发countpage的更新,因此useEffect将在两者之间交替触发。以下是可能的打印结果示例:

        1. 初始渲染(挂载)后,点击 "Hello World!" <h1> 元素和 "Next Page" 按钮:

          ***组件中***
          +---回调中---
          +<h1>Hello World! 0</h1>
          +當前的值: 0
          +***组件中***
          +---回调中---
          +<h1>Hello World! 0</h1>
          +當前的值: 0
          +
          • 初始渲染时,count 的值为 0,page 的值为 1。
          • 同时点击 "Hello World!" <h1> 元素和 "Next Page" 按钮,countpage 的值会同时更新,但是由于useEffect的依赖数组包含了这两者,它会在其中任何一个发生变化时触发。所以 useEffect 打印了新的 count 值为 0 和新的 page 值为 2,以及其他信息。
        2. 点击 "Hello World!" <h1> 元素后再点击 "Next Page" 按钮:

          ***组件中***
          +---回调中---
          +<h1>Hello World! 0</h1>
          +當前的值: 0
          +***组件中***
          +---回调中---
          +<h1>Hello World! 0</h1>
          +當前的值: 0
          +***组件中***
          +---回调中---
          +<h1>Hello World! 0</h1>
          +當前的值: 0
          +***组件中***
          +---回调中---
          +<h1>Hello World! 1</h1>
          +當前的值: 1
          +
          • 首先点击 "Hello World!" <h1> 元素,count 的值递增到 1,但 page 仍然是 1,所以 useEffect 不会触发。
          • 然后点击 "Next Page" 按钮,page 的值从 1 增加到 2,同时 count 仍然是 1,这次 useEffect 会触发,并打印新的 page 值为 2,以及其他信息。

        总结:同时点击 "Hello World!" <h1> 元素和 "Next Page" 按钮会导致countpage的值同时更新,但是由于useEffect的依赖数组包含了这两者,它会在其中任何一个发生变化时触发,从而打印出相应的信息。***组件中*** 在每次组件函数被调用时都会输出,但它与这两个值无关。

        # ▫️ Return of Cleanup Function

        理解清除函数 (return 函数) 在 useEffect 中的作用非常重要,它用于处理副作用的清理和资源释放。以下是关于为什么需要清除函数以及一些常见用例的优化笔记:

        为什么需要清除函数?

        1. 因為 useEffect 會反覆執行

        2. 资源释放useEffect 可以用于处理需要清理的操作,比如关闭数据库连接、取消网络请求、清除定时器等。这是因为在组件卸载或下一次 useEffect 触发之前,React 会调用清除函数,以确保资源被正确释放,避免内存泄漏和不必要的资源占用。

        3. 防止副作用的重复执行:在某些情况下,组件的重新渲染可能会导致 useEffect 多次触发。通过清除函数,你可以在每次 useEffect 触发前清理之前的副作用,以确保只执行最新的操作,而不重复执行。

        🔻 シナリオ

        • 清除定时器
        useEffect(() => {
        +  const timerId = setInterval(() => {
        +    // 执行一些操作
        +  }, 1000);
        +
        +  // 清除定时器
        +  return () => clearInterval(timerId);
        +}, []);
        +

        上述代码示例创建了一个定时器,并且通过返回的清除函数来清除定时器。这样可以确保在组件卸载或下一次 useEffect 触发之前,定时器会被正确清除,防止内存泄漏和不必要的执行。

        • 断开数据库连接
        useEffect(() => {
        +  // 连接到数据库
        +
        +  // 清理数据库连接
        +  return () => {
        +    // 断开数据库连接
        +  };
        +}, []);
        +

        在这个示例中,useEffect 用于连接数据库,并通过返回的清除函数来断开数据库连接。这确保了在组件卸载或下一次 useEffect 触发之前,数据库连接会被正确关闭。

        • 取消网络请求
        useEffect(() => {
        +  const controller = new AbortController();
        +
        +  fetch("https://api.example.com/data", { signal: controller.signal })
        +    .then((response) => {
        +      // 处理响应数据
        +    })
        +    .catch((error) => {
        +      if (error.name === "AbortError") {
        +        // 请求被取消
        +      } else {
        +        // 处理其他错误
        +      }
        +    });
        +
        +  // 清除控制器以取消网络请求
        +  return () => controller.abort();
        +}, []);
        +

        在这个示例中,我们使用 AbortController 来控制网络请求,并通过返回的清除函数来取消网络请求。这样可以确保在组件卸载或下一次 useEffect 触发之前,网络请求会被正确取消。

        总之,清除函数在处理副作用的清理和资源释放时非常重要。它允许你在组件生命周期中管理资源,确保它们被正确释放,从而避免潜在的问题。

        # ▫️ Execution Timing

        在 useEffect 的回调函数中,当依赖数组中的某些依赖发生变化或者组件被卸载时,React 会执行回调函数中的返回值函数(清除函数)。这是确保在重新运行 useEffect 之前,清理之前副作用的机制。

        • 組件被銷毀時

        • 第二次執行回調時,會先執行上一次回調中的返回值函數

          useEffect(() => {
          +  console.log("---回调中---");
          +  return () => {
          +    console.log("~~~回調中返回值函數~~~", count);
          +  };
          +}, [page]);
          +console.log("***組件中***");
          +

          打印結果:

        1. 第一次打印:

          ***組件中***
          +---回调中---
          +
        2. 第二次打印:

          ***組件中***
          +~~~回調中返回值函數~~~ 0
          +---回调中---
          +

        從第二次打印中,可以看出,如果 page 的值发生了变化,那么 useEffect的回调函数将会再次执行。但在执行新的回调函数之前,React 会先执行上一次回调函数中的返回值函数(清除函数),然后再执行新的回调函数。这确保了在重新运行 useEffect 之前,可以清理之前的副作用。

        # ▫️ Usage Limitation - Cannot Use async Functions Directly

        因为 async 函数返回的是一个 Promise 对象。这是因为 useEffect 的回调函数应该是同步的,而不应该返回一个 Promise 对象。

        如果你需要在 useEffect 中执行异步操作,可以在回调函数内部创建一个 async 函数,然后在这个 async 函数内部执行异步操作。以下是一个示例:

        useEffect(() => {
        +  async function fetchData() {
        +    try {
        +      const response = await fetch("https://api.example.com/data");
        +      const data = await response.json();
        +      // 执行其他操作,例如更新 state
        +    } catch (error) {
        +      console.error("发生错误:", error);
        +    }
        +  }
        +
        +  fetchData();
        +}, []);
        +

        在这个示例中,我们在 useEffect 的回调函数内部创建了一个名为 fetchData 的 async 函数,然后在其中执行异步操作。这种方式可以让你在 useEffect 中处理异步逻辑,但依然保持了回调函数的同步性质。

        需要注意的是,虽然 async 函数内部可以使用 await 关键字等待异步操作完成,但整个回调函数仍然是同步执行的,不会等待异步操作的完成。因此,在使用 async 函数时,要确保正确处理异步操作的结果和错误。

        # 🔷 useRef

        # ▫️ what is useRef

        useRef 是 React 中的一个 Hook,它可以用于获取或存储组件的引用。它类似于 class 组件中的 ref 属性,但是它可以用于函数组件。 useRef 返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数(initialValue)。返回的 ref 对象在组件的整个生命周期内保持不变。

        # ▫️ Basic Purpose

        import React, { useRef } from "react";
        +
        +function App() {
        +  const inputRef = useRef(null);
        +
        +  function handleClick() {
        +    inputRef.current.focus();
        +  }
        +
        +  return (
        +    <>
        +      <input ref={inputRef} type="text" />
        +      <button onClick={handleClick}>聚焦输入框</button>
        +    </>
        +  );
        +}
        +
        +export default App;
        +

        在这个示例中,我们使用 useRef 创建了一个名为 inputRef 的 ref 对象,并将其传递给 <input> 元素的 ref 属性。这样,我们就可以通过 inputRef.current 来获取 <input> 元素的引用。

        handleClick 函数中,我们使用 inputRef.current.focus() 来聚焦 <input> 元素。这样,当用户点击 "Focus the input" 按钮时,<input> 元素就会被聚焦。

        # ▫️ Usage Limitation - Cannot Use useRef to Update State

        useRef 不能用于更新组件的 state。这是因为 useRef 返回的 ref 对象在组件的整个生命周期内保持不变,而 useState 会在每次渲染时返回一个新的 state 值。

        如果你需要在 useRef 中更新 state,可以使用 useRef.current 属性来存储 state 的值。以下是一个示例:

        import React, { useState, useRef } from "react";
        +
        +function App() {
        +  const [count, setCount] = useState(0);
        +  const countRef = useRef(0);
        +
        +  function handleAlertClick() {
        +    setTimeout(() => {
        +      alert("You clicked on: " + countRef.current);
        +    }, 3000);
        +  }
        +
        +  return (
        +    <>
        +      <h1>{count}</h1>
        +      <button onClick={() => setCount(count + 1)}>Increment-useState</button>
        +      <button onClick={handleAlertClick}>Show alert-useRef</button>
        +    </>
        +  );
        +}
        +
        +export default App;
        +

        在這個示例中, 我們使用 useRef 創建了一個名為 countRef 的 ref 對象,並將其初始化為 0。然後,我們在 handleAlertClick 函數中使用 countRef.current 來獲取 count 的值。這樣,當用戶點擊 "Show alert" 按鈕時,我們就可以獲取 count 的值。

        當點擊 Increment 後, count 的值會增加,但是 countRef.current 的值仍然是 0。這是因為 useRef 返回的 ref 對象在組件的整個生命周期內保持不變,而 useState 會在每次渲染時返回一個新的 state 值。

        useState useRef
        修改值的時候 觸發重新渲染 觸發重新渲染
        組件重新渲染時 獲取之前的值 獲取之前值

        🔺 シナリオ:

        • 定時器案例:當我們不需要它渲染後的值,而是需要它渲染前的值時,就可以使用 useRef

        不使用 useRef 的情況, 以下: 每次點擊,都清除之前的定時器,看上去沒有問題。 但其實如果組件重新渲染,是不會清除之前定時器的, 本次的 timer 與上一次的 timer 不一樣

        function App() {
        +  let timer;
        +  const handleClick = () => {
        +    clearInterval(timer.current);
        +    timer = setInterval(() => {
        +      console.log("timer");
        +    }, 1000);
        +  };
        +  return <></>;
        +}
        +

        使用useRef 之後

        function App() {
        +  const timer = useRef(null);
        +  const handleClick = () => {
        +    clearInterval(timer.current);
        +    timer.current = setInterval(() => {
        +      console.log("timer");
        +    }, 1000);
        +  };
        +  return <></>;
        +}
        +

        在這個示例中, 我們使用 useRef 創建了一個名為 countRef 的 ref 對象,並將其初始化為 0。然後,我們在 handleAlertClick 函數中使用 countRef.current 來獲取 count 的值。這樣,當用戶點擊 "Show alert" 按鈕時,我們就可以獲取 count 的值。

        當點擊 Increment 後, count 的值會增加,但是 countRef.current 的值仍然是 0。這是因為 useRef 返回的 ref 對象在組件的整個生命周期內保持不變,而 useState 會在每次渲染時返回一個新的 state 值。

        • 修改dom的值
        1. 變量引用的方式 - 在<h1>元素上使用 ref 属性,将 h1Ref 引用对象与该 DOM 元素关联。这样,h1Ref.current 就可以访问到这个 DOM 元素。
        import React, { useRef } from "react";
        +
        +function App() {
        +  const h1Ref = useRef(null);
        +
        +  function handleClick() {
        +    h1Ref.current.innerHTML = "Hello World!";
        +  }
        +
        +  return (
        +    <>
        +      <h1 ref={h1Ref}>Hello React!</h1>
        +      <button onClick={handleClick}>Change the h1</button>
        +    </>
        +  );
        +}
        +
        • 在这个 React 函数组件中,要注意渲染和拿到值的顺序如下:

          1. 在组件渲染之初,会创建一个h1Ref引用对象,并初始化为null。在元素上使用 ref 属性,将h1Ref引用对象与该 DOM 元素关联。这样,h1Ref.current就可以访问到这个 DOM 元素。

          2. 渲染阶段:React 会首先渲染组件的 UI,包括 元素和按钮。此时,h1Ref仍然是null。当页面首次渲染时, 元素的内容显示为"Hello React!"。

          3. 用户点击按钮后,触发handleClick函数。

          4. handleClick函数内部,通过h1Ref.current来访问引用的 DOM 元素,尝试修改其innerHTML属性为"Hello World!"。

          5. 由于 React 的生命周期,上述 DOM 修改是在组件的渲染完成后才执行的。这是因为 React 会在渲染阶段记录下需要进行的 DOM 更新操作,并在渲染完成后才执行这些操作,以确保性能和一致性。

          所以,虽然在handleClick函数中访问了h1Ref.current,但实际的 DOM 操作是在渲染完成后才进行的。因此,当用户点击按钮时,页面上的 元素会被修改为"Hello World!"。这就是 React 的渲染和 DOM 更新机制的基本工作原理。

        1. 回調函數的方式
        import React, { useRef } from "react";
        +
        +function App() {
        +  const h1Ref = useRef(null);
        +
        +  function handleClick() {
        +    h1Ref.current.innerHTML = "Hello World!";
        +  }
        +
        +  return (
        +    <>
        +      <h1
        +        ref={(thisDom) => {
        +          if (thisDom) {
        +            thisDom.style.background = "green";
        +            h1Ref.current = thisDom; // Update the reference of h1Ref
        +          }
        +        }}
        +      >
        +        Hello React!
        +      </h1>
        +      <button onClick={handleClick}>Change the h1</button>
        +    </>
        +  );
        +}
        +
        • useRef的回调函数方式来引用 DOM 元素并修改其样式。

          1. <h1>元素上使用ref属性,传递一个回调函数。这个回调函数接收一个参数thisDom,它代表了<h1>元素的 DOM 对象。

          2. 在回调函数中,首先检查thisDom是否存在,以防止在某些情况下为null。如果thisDom存在,就在其中设置样式background为'green'。

          3. 然后,通过h1Ref.current = thisDom来更新h1Ref的引用,以确保h1Ref引用的始终是当前的 DOM 元素。

          现在,当组件渲染时,<h1>元素的背景颜色会被设置为绿色,并且你仍然可以使用h1Ref.current来访问它以进行其他操作。

        + + + diff --git a/memo/redux.html b/memo/redux.html new file mode 100644 index 00000000..322352f1 --- /dev/null +++ b/memo/redux.html @@ -0,0 +1,293 @@ + + + + + + React Redux を基礎から理解する | ☻ itsyuimorii.space + + + + + + + + +

        # React Redux を基礎から理解する

        # Redux の基本概念

        • Redux Overview:

          • Redux serves as an alternative to React Context, offering a centralized data store for the entire application.
          • The store manages all states, eg. critical data like authentication status and user input states.
          • It provides a unified state management approach by acting as a single store applicable to the entire application.

          redux

        • Subscription to Central Store:

          • Components subscribe to the central store for updates.
          • Subscribed components receive notifications when data changes occur in the Redux store.
          • Components selectively retrieve needed data, such as authentication status, from specific portions of the Redux store.
          • This establishes a unidirectional flow, enabling components to access and utilize data provided by the Redux store.
        • Important Rule:

          • Components refrain from direct data manipulation.
          • Subscriptions are established for components to receive updates, ensuring an indirect and controlled data flow.
          • Components avoid engaging in a direct data flow towards the storage.
        • Introducing Reducers:

          • Reducers handle data mutations and changes within the stored data.
          • The term "reducer" in Redux differs from the reducer hook in React.
          • A reducer function takes input, transforms it, and produces a new output, adhering to general programming concepts.
        • Understanding Reducer Functions:

          • Redux reducer functions accept input, transform it, and generate a new output.
          • They play a crucial role in updating stored data, following general programming principles.
        • Components and Actions:

          • Components do not directly manipulate stored data; they use subscriptions for updates.
          • Actions, triggered by components, describe the type of operation a reducer should execute.
          • Components dispatch actions as simple JavaScript objects, specifying the operation type.
          • Redux forwards actions to the appropriate reducer, which performs the specified operation.
          • The reducer outputs a new state, effectively replacing the existing state in the central data store.
          • Subscribed components receive notifications of state updates, facilitating UI refresh.
        • Three Principles of Redux:

          1. Single Data Source: The entire application's state is stored in a single store.
          2. State is Read-Only: State changes occur only through triggering actions, containing a required type attribute.
          3. Use Pure Functions for Actions: Reducers, implemented as pure functions, describe how actions change the state tree.

        redux

        • Store and Reducer Relationship:

          • The store manages data, and its content is determined by the reducer function.
          • The reducer function produces a new state snapshot whenever an action reaches it.
          • Upon the initial code execution, the reducer also executes with a default action, typically setting the initial state.
          • It is crucial for the reducer function to return a new state object consistently.
          • The reducer function is a standard JavaScript function, always receiving the old/existing state and the dispatched action.
        • Reducer Function Structure:

          • The reducer function is a JavaScript function, typically created using arrow function syntax.
          • It must always return a new state object, ensuring it adheres to the principles of a pure function.
          • Pure functions guarantee that the same inputs yield the same outputs and have no internal side effects.
        • Default State in Reducer:

          • During the first execution, when the store initializes, the state might be undefined.
          • Provide a default value for the state parameter in the reducer function to handle this initial case.
          • The default value ensures that the state is set to an initial value, preventing undefined errors.
        • Creating and Subscribing to Store:

          • Components subscribe to the store using a subscriber function.
          • The subscriber function is notified whenever data and the store change.
          • Use the subscribe method on the store, passing the subscriber function, to establish the subscription.
        • Dispatching Actions:

          • Dispatch actions using the dispatch method on the store.
          • Actions are JavaScript objects with a type attribute acting as an identifier.
          • The type attribute should be a unique string, representing the type of action to be performed.
        • Sample Action and State Update:

          • Example of dispatching an action to increment a counter.
          • The dispatched action contains a type attribute indicating an increment action.
          • The reducer function interprets the action type and produces a new state with an incremented counter.
          • Subscribed components are notified of the state update.
        • Understanding Output:

          • Executing the code demonstrates the incrementing counter as actions are dispatched.
          • The store initialization and dispatching actions lead to state updates reflected in the output.

        # Redux's Core API:

        1. Redux.createStore(reducer, [preloadedState], [enhancer])
        2. store.dispatch(action)
        3. store.subscribe(listener)
        4. store.getState()
        5. store.replaceReducer(nextReducer)

        # createStore

        createStore(reducer, [preloadedState], [enhancer])

        • Creates a Redux store that holds the complete state tree of the app.

        • There should only be a single store in the app.

        • createStore accepts three parameters:

          • reducer: A reducing function that returns the next state tree, given the current state tree and an action to handle.
          • [preloadedState]: The initial state.
          • [enhancer]: The store enhancer. You may optionally specify it to enhance the store with third-party capabilities such as middleware, time travel, persistence, etc. The only store enhancer that ships with Redux is applyMiddleware().

        store/index.js

        import { createStore } from "redux";
        +const counterReducer = (state = { counter: 0 }, action) => {
        +  if (action.type === "increment") {
        +    return {
        +      counter: state.counter + 1,
        +    };
        +  }
        +  if (action.type === "decrement") {
        +    return {
        +      counter: state.counter - 1,
        +    };
        +  }
        +  return state;
        +};
        +const store = createStore(counterReducer);
        +export default store;
        +

        index.js

        import React from "react";
        +import ReactDOM from "react-dom/client";
        +import { Provider } from "react-redux";
        +
        +import "./index.css";
        +import App from "./App";
        +import store from "./store/index";
        +
        +const root = ReactDOM.createRoot(document.getElementById("root"));
        +root.render(
        +  <Provider store={store}>
        +    <App />
        +  </Provider>
        +);
        +

        Counter.js

        import classes from "./Counter.module.css";
        +import { useSelector, useDispatch } from "react-redux";
        +
        +const Counter = () => {
        +  // Again, this function will be executed for us by React Redux. it will then pass the Redux state in order to manage the data into this function when it is executed, and then basically execute this code to retrieve the state portion of this component that is needed. then use select or overall to return the value. useSelector((state) => state.counter);
        +  const counter = useSelector((state) => state.counter);
        +  // Redux automatically sets up a subscription to the Redux store for this component. So whenever the data in the Redux store changes, your component will be updated and automatically receive the latest counter. So it's an automatic reaction that changes to the Redux store will cause this component function to be re-executed. So you'll always have the most up-to-date counter.
        +
        +  const dispatch = useDispatch();
        +  // dispatch is a function we can call, that will dispatch an action on our Redux store.
        +  const decrementHandler = () => {
        +    dispatch({ type: "decrement" });
        +  };
        +
        +  const toggleCounterHandler = () => {};
        +
        +  return (
        +    <main className={classes.counter}>
        +      <h1>Redux Counter</h1>
        +      <div className={classes.value}>{counter}</div>
        +      <div>
        +        <button onClick={incrementHandler}>Increment</button> 
        +        <button onClick={decrementHandler}>Decrement</button>
        +      </div>
        +      <button onClick={toggleCounterHandler}>Toggle Counter</button>
        +    </main>
        +  );
        +};
        +
        +export default Counter;
        +

        # useSelector

        In React Redux, the useSelector hook requires two parameters:

        1. Selector Function:

          • This is a function that takes the entire Redux state as a parameter and returns the portion of the state you want to extract. For example, if you have a Redux state tree with an object named stock, and within the stock object, there's a property named counter, your selector function might be (state) => state.stock.counter. This function determines the data that useSelector will return.
        2. Equality Function (Optional):

          • This is an optional parameter used to compare the values returned by the selector function in consecutive calls to determine if the component should be re-rendered. If omitted, useSelector will use reference equality (===), meaning it will re-render only if the object references from the previous and current calls are the same. If you need to customize when the component should re-render based on some condition, you can provide a custom equality function.

        For example:

        const counter = useSelector(
        +  (state) => state.stock.counter,
        +  (prev, next) => prev === next
        +);
        +

        In this example, the first parameter is the selector function, extracting state.stock.counter. The second parameter is a custom equality function that uses reference equality to determine whether to re-render the component based on the returned values from the selector function.

        # dispatch

        const dispatch = useDispatch();
        +// dispatch is a function we can call, that will dispatch an action on our Redux store.
        +const decrementHandler = () => {
        +  dispatch({ type: "decrement" });
        +  //Attaching Payloads to Actions
        +};
        +

        # Redux Toolkit (opens new window)

        When our application grows in complexity, using Redux can become more intricate. In this course, we'll explore a simpler approach to utilizing Redux. Before we proceed, let's consider some potential issues:

        Potential Issues:

        1. Action Type Identifiers:

          • As the application grows, there may be numerous operations, leading to confusion with identifiers.
          • Issues such as misspelling or conflicts in identifiers might arise.
        2. Data Volume Management:

          • With an increase in data volume, the state object becomes larger.
          • The Reducer function becomes more complex and may be challenging to maintain.
        3. Respecting State Immutability:

          • Ensuring the consistent return of a new state snapshot and avoiding unintentional alterations to the existing state.
          • Complex nested object and array data can lead to unpredictable state changes.

        Solutions:

        1. Unique Identifier Issue:

          • Use constants to store identifiers, avoiding spelling errors and ensuring type consistency.
        2. Data Volume Management and Complex Reducer Issue:

          • Redux Toolkit provides solutions, such as splitting the Reducer into smaller ones.
        3. State Immutability Issue:

          • Manual implementation of solutions is possible, or Redux Toolkit tools can be used to automate state copying, ensuring unintentional state edits are avoided.

        # Redux Toolkit's Core APIs:

        • configureStore(): wraps createStore to provide simplified configuration options and good defaults. It can automatically combine your slice reducers, adds whatever Redux middleware you supply, includes redux-thunk by default, and enables use of the Redux DevTools Extension.

        • createReducer(): that lets you supply a lookup table of action types to case reducer functions, rather than writing switch statements. In addition, it automatically uses the immer library to let you write simpler immutable updates with normal mutative code, like state.todos[3].completed = true.

        • createAction(): generates an action creator function for the given action type string. The function itself has toString() defined, so that it can be used in place of the type constant.

        • createSlice(): accepts an object of reducer functions, a slice name, and an initial state value, and automatically generates a slice reducer with corresponding action creators and action types.

        • createAsyncThunk: accepts an action type string and a function that returns a promise, and generates a thunk that dispatches pending/fulfilled/rejected action types based on that promise

        # State management with Redux

        1. Redux Store Setup:

          • Purpose: This section is responsible for setting up the global Redux store using the configureStore function from the @reduxjs/toolkit library. The store is configured with the combined reducers that handle different parts of the application state.
        2. Wrap the App with the Redux Provider:

          • Purpose: The Provider component from react-redux is wrapped around the main application component (in this case, App). This ensures that the Redux store is accessible to all components within the application. It essentially "provides" the Redux store to the entire component tree.
        3. Creating a Redux Slice:

          • Purpose: A Redux slice is a unit of the Redux state that corresponds to a specific feature or part of the application. In this example, the exampleSlice manages a list of items with corresponding actions like adding and removing items. It provides a clean and organized way to define the initial state and actions related to a specific feature.
        4. Using Redux in a Component:

          • Purpose: This section demonstrates how to use the useSelector hook to access the Redux store's state within a React component. In the example, SomeComponent uses useSelector to retrieve a list of items from the Redux store and render them.
        5. Dispatching Actions in Another Component:

          • Purpose: This section shows how to use the useDispatch hook to dispatch actions to the Redux store from a React component. In the example, AnotherComponent allows the user to input a new item, and when a button is clicked, the addItem action is dispatched to add the new item to the Redux store.

        # Process of using Redux Toolkit

        This setup provides a basic structure for handling state management with Redux in a JavaScript app. Action creators generate actions, reducers specify how the state should change, and the store manages the overall application state. The useSelector hook is used to access the state, and useDispatch is used to dispatch actions.

        🟦 Create the Redux Store:

        // store.js
        +import { configureStore } from "@reduxjs/toolkit";
        +import rootReducer from "./reducers"; // Import your combined reducers
        +
        +const store = configureStore({
        +  reducer: rootReducer,
        +});
        +
        +export default store;
        +

        🟦 Wrap the App with the Redux Provider:

        // index.js or App.js
        +import React from "react";
        +import { Provider } from "react-redux";
        +import store from "./store";
        +import App from "./App";
        +
        +const MainApp = () => {
        +  return (
        +    <Provider store={store}>
        +      <App />
        +    </Provider>
        +  );
        +};
        +
        +export default MainApp;
        +

        🟦 Creating a Redux Slice:

        // exampleSlice.js
        +import { createSlice } from "@reduxjs/toolkit";
        +
        +const initialState = {
        +  entities: {},
        +  ids: [],
        +};
        +
        +export const exampleSlice = createSlice({
        +  name: "example",
        +  initialState,
        +  reducers: {
        +    addItem: (state, action) => {
        +      const { id, data } = action.payload;
        +      state.entities[id] = data;
        +      state.ids.push(id);
        +    },
        +    removeItem: (state, action) => {
        +      const idToRemove = action.payload;
        +      delete state.entities[idToRemove];
        +      state.ids = state.ids.filter((id) => id !== idToRemove);
        +    },
        +  },
        +});
        +
        +export const { addItem, removeItem } = exampleSlice.actions;
        +export default exampleSlice.reducer;
        +

        🟦 Using Redux in a Component:

        // SomeComponent.js
        +import React from "react";
        +import { useSelector } from "react-redux";
        +
        +function SomeComponent() {
        +  const items = useSelector((state) =>
        +    state.example.ids.map((id) => state.example.entities[id])
        +  );
        +
        +  return (
        +    <div>
        +      {items.map((item) => (
        +        <div key={item.id}>{item.name}</div>
        +      ))}
        +    </div>
        +  );
        +}
        +
        +export default SomeComponent;
        +

        🟦 Dispatching Actions in Another Component:

        // AnotherComponent.js
        +import React, { useState } from "react";
        +import { useDispatch } from "react-redux";
        +import { addItem } from "./exampleSlice";
        +
        +function AnotherComponent() {
        +  const dispatch = useDispatch();
        +  const [newItem, setNewItem] = useState("");
        +
        +  const handleAddItem = () => {
        +    const id = Math.random().toString(36).substring(7); // Generate a unique ID
        +    const data = { id, name: newItem }; // Example data structure
        +    dispatch(addItem({ id, data }));
        +    setNewItem("");
        +  };
        +
        +  return (
        +    <div>
        +      <input
        +        type="text"
        +        value={newItem}
        +        onChange={(e) => setNewItem(e.target.value)}
        +      />
        +      <button onClick={handleAddItem}>Add Item</button>
        +    </div>
        +  );
        +}
        +
        +export default AnotherComponent;
        +

        🔵 useSelector(): Accessing State

        • Purpose: useSelector is a React hook provided by the react-redux library. Its primary purpose is to select and access the current state from the Redux store. It takes a selector function as an argument, which allows you to extract specific pieces of data from the state. By using useSelector, components can efficiently subscribe to changes in the Redux state and re-render when relevant data is updated.

        🔵 useDispatch(): Modifying State with Actions

        • Purpose: useDispatch is another React hook from the react-redux library. Its primary purpose is to provide a reference to the dispatch function of the Redux store. This allows components to dispatch actions, which are plain JavaScript objects containing a type property and, optionally, a payload. By using useDispatch, components can trigger state changes by dispatching actions. These actions are then processed by reducers, modifying the state in a predictable and controlled manner.

        🔵 Summary:

        • Redux Store Setup: Configured a global store using configureStore from @reduxjs/toolkit.
        • Provider Usage: Wrapped the main application component with Provider to make the Redux store accessible throughout the component tree.
        • Redux Slice Creation: Created a Redux slice using createSlice to manage a list of items in the state.
        • Component Interaction: Used useSelector to access state data and useDispatch to dispatch actions from React components.

        # Handling Asynchronous Code:

        Redux Core Principle:

        • Reducer functions in Redux must be pure, without side effects, and synchronous.
        • Pure functions produce the same output for the same input, ensuring consistency and predictability.

        Handling Asynchronous Code:

        • A challenge arises when dealing with asynchronous actions, like HTTP requests, in Redux.
        • Reducer functions are unsuitable for asynchronous code due to their synchronous nature.

        Options for Handling Asynchronous Code:

        1. Component-Level Side Effects:

          • Place side effect code, including asynchronous operations, directly in the component.
          • Dispatch actions after the side effect completion to inform Redux.
        2. Custom Action Creators:

          • Write custom action creators for handling asynchronous tasks without altering the reducer function.
          • Allows running asynchronous tasks as part of the action creator.

        Redux Toolkit Solution:

        • Redux Toolkit provides a solution for handling asynchronous tasks within action creators.
        • It allows the execution of side effects without violating the synchronous nature of reducer functions.

        reduxasync

        # Redux Thunk

        Redux Thunk:

        • Redux Thunk is a middleware that allows the execution of asynchronous tasks in Redux.
        • It enables the dispatch of asynchronous actions, such as HTTP requests, in Redux.
        export const sendCartData = (cart) => {
        +  //instead of return an action object, 如 { type: 'SOME_ACTION', payload: someData }。 我們創建一個一個action creator return another function
        +  return async (dispatch) => {
        +    dispatch(
        +      uiActions.showNotification({
        +        status: "pending",
        +        title: "Sending...",
        +        message: "Sending cart data!",
        +      })
        +    );
        +
        +    const sendRequest = async () => {
        +      const response = await fetch(
        +        "https://react-http-6b4a6.firebaseio.com/cart.json",
        +        {
        +          method: "PUT",
        +          body: JSON.stringify(cart),
        +        }
        +      );
        +
        +      if (!response.ok) {
        +        throw new Error("Sending cart data failed.");
        +      }
        +    };
        +
        +    try {
        +      await sendRequest();
        +
        +      dispatch(
        +        uiActions.showNotification({
        +          status: "success",
        +          title: "Success!",
        +          message: "Sent cart data successfully!",
        +        })
        +      );
        +    } catch (error) {
        +      dispatch(
        +        uiActions.showNotification({
        +          status: "error",
        +          title: "Error!",
        +          message: "Sending cart data failed!",
        +        })
        +      );
        +    }
        +  };
        +};
        +

        The provided code demonstrates the use of a Redux thunk as an action creator. In contrast to regular action creators, which directly return an action object (e.g., { type: 'SOME_ACTION', payload: someData }), this action creator returns a function.

        Here are some key differences in this approach:

        1. Returning a Function Instead of a Direct Action Object:

          • Regular action creators typically return a plain action object. In this case, the action creator returns a function.
        2. Incorporating Asynchronous Logic:

          • The returned function contains asynchronous logic. In this example, it involves sending shopping cart data to a server using async/await with the fetch function to make a PUT request.
        3. Dispatching Actions Before and After Asynchronous Logic:

          • Before the asynchronous logic starts, an action is dispatched to indicate that the data is pending ("pending" notification). After the asynchronous logic succeeds or fails, corresponding actions are dispatched to display notifications with success or error messages.
        4. Error Handling:

          • Errors are handled using a try-catch block. If an error occurs during the asynchronous logic, an action is dispatched to show an "error" notification along with the appropriate error message.
        5. More Flexible Control Flow:

          • Thunks provide a more flexible control flow, allowing you to dispatch different actions at different stages of asynchronous logic. For instance, dispatching a "pending" action at the start, a "success" action upon success, and an "error" action upon failure.

        In summary, this approach enables action creators to execute more complex logic, including asynchronous operations, conditional checks, and error handling. Thunks allow you to abstract away this logic from the components, allowing them to focus on user interface interactions without having to deal directly with complex asynchronous or side-effect logic.

        + + + diff --git a/memo/strapi.html b/memo/strapi.html new file mode 100644 index 00000000..12acfaab --- /dev/null +++ b/memo/strapi.html @@ -0,0 +1,144 @@ + + + + + + ⚪️ Strapi への深い理解 | ☻ itsyuimorii.space + + + + + + + + +

        # ⚪️ Strapi への深い理解

        # project structure (opens new window)

        以下の構成は、strapi new で作成されるプロジェクトの構成です。

        . # root of the application
        +├──── .strapi # auto-generated folder — do not update manually
        +│     └──── client # files used by bundlers to render the application
        +│           ├ index.html
        +│           └ app.js
        +├──── .tmp
        +├──── build # build of the admin panel
        +├──── config # API configurations
        +│     ├ api.js
        +│     ├ admin.js
        +│     ├ cron-tasks.js
        +│     ├ database.js
        +│     ├ middlewares.js
        +│     ├ plugins.js
        +│     └ server.js
        +├──── database
        +│     └──── migrations
        +├──── node_modules # npm packages used by the project
        +├──── public # files accessible to the outside world
        +│     └──── uploads
        +├──── src
        +│     ├──── admin # admin customization files
        +│           ├──── extensions # files to extend the admin panel
        +│     │     ├ app.js
        +│     │     └ webpack.config.js
        +│     ├──── api # business logic of the project split into subfolders per API
        +│     │     └──── (api-name)
        +│     │           ├──── content-types
        +│     │           │     └──── (content-type-name)
        +│     │           │           └ lifecycles.js
        +│     │           │           └ schema.json
        +│     │           ├──── controllers
        +│     │           ├──── middlewares
        +│     │           ├──── policies
        +│     │           ├──── routes
        +│     │           ├──── services
        +│     │           └ index.js
        +│     ├──── components
        +│     │     └──── (category-name)
        +│     │           ├ (componentA).json
        +│     │           └ (componentB).json
        +│     ├──── extensions # files to extend installed plugins
        +│     │     └──── (plugin-to-be-extended)
        +│     │           ├──── content-types
        +│     │           │     └──── (content-type-name)
        +│     │           │           └ schema.json
        +│     │           └ strapi-server.js
        +│     ├──── middlewares
        +│     │     └──── (middleware-name).js
        +│     ├──── plugins # local plugins files
        +│     │     └──── (plugin-name)
        +│     │           ├──── admin
        +│     │           │     └──── src
        +│     │           │           └ index.js
        +│     │           ├──── server
        +│     │           │     ├──── content-types
        +│     │           │     ├──── controllers
        +│     │           │     └──── policies
        +│     │           ├ package.json
        +│     │           ├ strapi-admin.js
        +│     │           └ strapi-server.js
        +│     ├─── policies
        +│     └ index.js # include register(), bootstrap() and destroy() functions
        +├ .env
        +└ package.json
        +

        Understand the project structure of a Strapi project.

        1. Project Root: The top-level directory of the Strapi application, containing all the files and subdirectories needed for the application to run.

        2. .strapi Directory: This is an auto-generated folder. It's created and managed by Strapi itself. You shouldn't manually update files in this directory as they are managed by the Strapi framework. It typically includes client-side files used by bundlers to render the application.

          • index.html and app.js are examples of files in this directory, which are key to rendering the Strapi admin panel in a web browser.
        3. .tmp Directory: A temporary directory used by Strapi during runtime for storing temporary files.

        4. build Directory: This is where the built version of the admin panel resides. The "build" process involves compiling and bundling all the necessary files (like JavaScript, CSS, HTML) into a format suitable for deployment. This is done so that the admin panel can be served efficiently in a production environment.

          • The "build" process is usually done after development when you're ready to deploy your application. It optimizes the application for better performance in a production environment.

        # API (opens new window)

        # headless CMS とは?

        Headless CMS, like Strapi, represents a significant shift in how content management systems operate, particularly in the relationship between the front-end and the back-end. Let's break down what it means and how it's particularly beneficial for a React JavaScript environment:

        1. Traditional vs. Headless CMS:

          • Traditional CMS: Systems like WordPress tightly couple the front-end (what you see) and the back-end (where content is stored and managed). This means the way content is created, stored, and displayed is predefined and linked. Customizing the front-end or integrating with different technologies can be challenging.
          • Headless CMS: Strapi, as a headless CMS, decouples the front-end and the back-end. It provides only the back-end (headless) part, where content is stored and managed via an API. The front-end part (the "head") is entirely separate and can be built using any technology – like React in your case.
        2. API-Driven Approach:

          • In a headless CMS, content is delivered through APIs, typically RESTful or GraphQL. This approach offers greater flexibility in how content is retrieved and displayed. A front-end developer can query the API to fetch content and display it using React or any other front-end framework.
        3. Benefits for Front-End Developers:

          • Flexibility: You can use your preferred front-end technology (React, Angular, Vue.js, etc.) to build your user interface.
          • Customization: Since the front-end is separate, you have complete control over the user experience and can build custom UIs without the constraints of traditional CMS themes or templates.
          • Scalability: APIs make it easier to scale your application. You can develop new features or change the front-end without altering the back-end.
          • Omnichannel Content Delivery: Content can be used across different platforms – web, mobile apps, IoT devices, etc., without needing to adjust the back-end for each case.
        4. Why "Headless" for React Development:

          • React is a powerful library for building user interfaces. Pairing React with a headless CMS like Strapi allows you to create dynamic, interactive web applications with content that's easy to manage and update.
          • You can fetch data from the Strapi API using AJAX calls (with fetch, axios, or any other HTTP client) and then render this data using React components. This setup offers a modern, efficient way to build web applications.

        Strapi 的「無頭」性質意味著它提供後端功能(例如透過 API 進行內容儲存、管理和交付),而無需規定前端應如何建置或呈現。這種分離允許前端開發人員利用 React 等現代框架的強大功能來建立豐富的互動式使用者介面,同時仍受益於 CMS 強大的內容管理功能。

        # Content Type Builder (opens new window)

        The Content Type Builder in Strapi is a powerful feature that enables you to quickly generate API endpoints for managing data through CRUD (Create, Read, Update, Delete) operations. Here's a summary of its functionalities and an example to illustrate its use:

        # Understanding Content Type Builder:

        1. Purpose:

          • Enables the creation of Content Types (data structures) in Strapi.
          • Facilitates the definition and customization of fields for these Content Types.
        2. Functionality:

          • Data Structure Creation: You can define new Content Types (akin to tables in a database) directly within Strapi's admin panel. This includes specifying the fields and data types.
          • API Generation: Once a Content Type is created, Strapi automatically generates RESTful or GraphQL API endpoints for it. This means you can perform CRUD operations on the data associated with this Content Type.
          • Customization: The fields of a Content Type can be tailored to fit the data requirements of your application. You can choose from various field types like text, number, media, relational fields (to establish relationships between different Content Types), and more.
        3. User Interface:

          • The Content Type Builder offers a user-friendly interface within the Strapi admin panel for designing and modifying Content Types without writing any code.

        # Example Use Case:

        1. Creating a Blog Post Content Type:
          • Objective: To create a Content Type for managing blog posts.
          • Steps:
            1. Access the Content Type Builder in the Strapi admin panel.
            2. Create a new Content Type named BlogPost.
            3. Define fields such as title (text type), content (rich text type), publishedDate (date type), and author (relational field linking to a User Content Type).
            4. Save the Content Type. Strapi then generates API endpoints for BlogPost.
          • Outcome: You can now use the generated API endpoints to create, retrieve, update, or delete blog posts in your application.

        # Conclusion:

        The Content Type Builder in Strapi streamlines the process of creating data structures and corresponding APIs, making it an ideal tool for developers looking to build and manage content-driven applications efficiently. Its user-friendly interface and customization options allow for a great degree of flexibility in defining the data model according to the specific needs of your application.

        The Content Type Builder in Strapi is a powerful feature that enables you to quickly generate API endpoints for managing data through CRUD (Create, Read, Update, Delete) operations. Here's a summary of its functionalities and an example to illustrate its use:

        # Understanding Content Type Builder:

        1. Purpose:

          • Enables the creation of Content Types (data structures) in Strapi.
          • Facilitates the definition and customization of fields for these Content Types.
        2. Functionality:

          • Data Structure Creation: You can define new Content Types (akin to tables in a database) directly within Strapi's admin panel. This includes specifying the fields and data types.
          • API Generation: Once a Content Type is created, Strapi automatically generates RESTful or GraphQL API endpoints for it. This means you can perform CRUD operations on the data associated with this Content Type.
          • Customization: The fields of a Content Type can be tailored to fit the data requirements of your application. You can choose from various field types like text, number, media, relational fields (to establish relationships between different Content Types), and more.
        3. User Interface:

          • The Content Type Builder offers a user-friendly interface within the Strapi admin panel for designing and modifying Content Types without writing any code.

        # Example Use Case:

        contenttypebuilder

        1. Creating a Blog Post Content Type:
          • Objective: To create a Content Type for managing blog posts.
          • Steps:
            1. Access the Content Type Builder in the Strapi admin panel.
            2. Create a new Content Type named BlogPost.
            3. Define fields such as title (text type), content (rich text type), publishedDate (date type), and author (relational field linking to a User Content Type). +contenttypebuilder
            4. Save the Content Type. Strapi then generates API endpoints for BlogPost.
          • Outcome: You can now use the generated API endpoints to create, retrieve, update, or delete blog posts in your application.

        # Conclusion:

        The Content Type Builder in Strapi streamlines the process of creating data structures and corresponding APIs, making it an ideal tool for developers looking to build and manage content-driven applications efficiently. Its user-friendly interface and customization options allow for a great degree of flexibility in defining the data model according to the specific needs of your application.

        + + + diff --git a/memo/tswithreact.html b/memo/tswithreact.html new file mode 100644 index 00000000..610d8b8f --- /dev/null +++ b/memo/tswithreact.html @@ -0,0 +1,79 @@ + + + + + + ⚪️ Typescript and React | ☻ itsyuimorii.space + + + + + + + + +
        + + + diff --git a/memo/typescript.html b/memo/typescript.html new file mode 100644 index 00000000..72d10327 --- /dev/null +++ b/memo/typescript.html @@ -0,0 +1,78 @@ + + + + + + Typescript 深い理解と実践 | ☻ itsyuimorii.space + + + + + + + + +

        # Typescript 深い理解と実践

        # 🔸 Chapter 1: Start Here

        # 🔸 Chapter 2: Basic Types

        # 🔸 Chapter 3: Arrays & Objects

        # 🔸 Chapter 4: Functions

        # 🔸 Chapter 5: Assertions

        # 🔸 Chapter 6: Classes

        # 🔸 Chapter 7: Index Signatures & keyof Assertions

        # 🔸 Chapter 8: Generics

        泛型-chocolate blog (opens new window) dave gray

        # 🔸 Chapter 9: Utility Types

        + + + diff --git a/memo/webpack.html b/memo/webpack.html new file mode 100644 index 00000000..73e4a2d4 --- /dev/null +++ b/memo/webpack.html @@ -0,0 +1,141 @@ + + + + + + ⚪️ Webpack について理解を深める | ☻ itsyuimorii.space + + + + + + + + +

        # ⚪️ Webpack について理解を深める

        # 🔶 Webpack とは?

        • Webpack は複数の JavaScript ファイルを一つのファイルにまとめて出力するツールです。この「一つのファイルにまとめる」ことをバンドル(bundle)と言い、また「モジュールを一つのファイルにまとめて出力するツール」のことをモジュールバンドラー(module bundler)と呼びます。

        • 公式 Document で Webpack は、👇 のように静的モジュールバンドラーと紹介されています。

        • webpack is a static module bundler for modern JavaScript applications

        • 公式には 👇 のような図が記載されています。バンドルの雰囲気がわかりやすいですね。 +Concepts | webpack (opens new window)

        # 🔶 なぜ Webpack を使うのか?

        複数の JavaScript ファイルを一つにまとめることで、ブラウザからのリクエスト数を減らし、ファイル転送の最適化が可能です。これが Webpack などのモジュールバンドラーを使う大きな理由です。

        JavaScript ファイルが複数存在することでリクエスト回数が増えて転送効率が落ちるのであれは、最初から一つのファイルに記載することも可能ですが、可読性や保守性などの観点から現実的でありません。また、機能を複数ファイルに分割したままだと、ブラウザからのリクエスト回数が増えてファイル転送効率が落ちます。こういったつらみに対して、Webpack を利用することで機能をファイルごとに分割しながら開発し、実行時は一つのファイルとしてブラウザに提供することが可能となります。

        👇 の記事では、dev ツールで実際のファイルサイズを細かく見ながら、Webpack のメリットについて言及されていますので、参考までに。 +Why am'I using the webpack tool? (opens new window)

        # 🔶 Webpack の詳細?

        # ▫️ Loader for Different Resource Types

        Webpack uses loaders for different resource types, such as:

        • CSS: css-loader, style-loader
        • Less: less-loader
        • Sass: sass-loader
        • JavaScript: ts-loader, babel-loader
        • Vue: vue-loader
        • Static Resources: url-loader (images, audio, video), file-loader (files), json-loader (JSON)

        # ▫️ Basic Functions of Webpack (Using Loaders)

        1. Code Transformation: TypeScript to JavaScript, ES6 to ES5, SCSS to CSS, etc.
        2. Code Syntax Checking: Automatic code syntax checking using eslint-loader.
        3. Code Splitting: Splitting code into chunks for on-demand loading, reducing initialization time, and improving first-screen rendering efficiency.
        4. Automatic Compilation and Page Refresh: Automatically compile and refresh the page on local source code changes.
        5. Automatic Deployment (Not commonly used): Automatically build and deploy code to the production system.
        6. File Compression: Compress JavaScript, CSS, and HTML files to reduce file size.
        7. Module Concatenation: Merge modules into a single file during compilation.

        # ▫️ Two Key Features of Webpack

        1. Code Splitting: Breaks down code into chunks for on-demand loading, reducing initialization time.
        2. Loader: Handles various types of static files and supports chaining operations.

        # ▫️ Webpack Configuration

        Webpack runs in the Node.js environment, and its configuration file (webpack.config.js) follows the CommonJS pattern. It exports a JSON object with the following basic configuration options:

        • entry: Specifies the entry point of the modules.
        • output: Configures output file locations, names, and base paths.
        • module: Configures rules for different file types.
        • resolve: Configures aliases or module resolution rules.
        • plugins: Configures additional plugins to extend Webpack's functionality.
        • devServer: Implements local HTTP server features.

        # ▫️ Webpack Build Process

        1. Start from the entry point and recursively transform dependent modules.
        2. For each module found, use the corresponding loader to transform it.
        3. Continue transforming the dependencies of the current module until there are no more dependencies.
        4. Group modules by entry point, creating chunks.
        5. Convert all chunks into output files.

        # ▫️ Common Plugins

        • html-webpack-plugin: Generates HTML pages based on a template.
        • clean-webpack-plugin: Cleans specified directories.
        • copy-webpack-plugin: Copies files.
        • uglifyjs-webpack-plugin: Minifies JavaScript code.
        • mini-css-extract-plugin: Extracts CSS into separate files.

        # ▫️ Difference Between Loader and Plugin

        • Loader: Acts as a translator, transforming non-JavaScript resources during the build process.
        • Plugin: Extends Webpack's functionality by listening to events and altering the output.

        # ▫️ Webpack Hot Module Replacement (HMR) Principle

        HMR allows modules to be replaced without refreshing the entire page. The key steps include establishing a WebSocket connection, monitoring file changes, and notifying the client about the changes.

        # ▫️ Webpack Build Speed Optimization

        • Use the latest Webpack and Node.js versions.

        • Minify code using plugins like uglifyjs-webpack-plugin.

        • Utilize multiple threads or processes for building (e.g., thread-loader or HappyPack).

        • Narrow down the scope of file resolution.

        • Leverage caching for faster secondary builds.

        • Implement Tree Shaking to eliminate unused code.

        • Optimize module dependencies using Scope Hoisting.

        • Use CDN for basic packages to reduce bundle size.

        • Separate CSS from JavaScript using mini-css-extract-plugin.

        • Loadable Components (opens new window)

        # ▫️ webpack-bundle-analyzer

        webpack を可視化するツールを紹介 (opens new window)

        # Basic Steps for Configuring and Using webpack-bundle-analyzer:

        1. Install the webpack-bundle-analyzer plugin using the following command in your project directory:

          npm install --save-dev webpack-bundle-analyzer
          +
        2. In your webpack configuration file (e.g., webpack.config.js), import the webpack-bundle-analyzer plugin:

          const BundleAnalyzerPlugin =
          +  require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
          +
        3. Add a new instance of BundleAnalyzerPlugin to the plugins property in your webpack configuration file:

          module.exports = {
          +  // ...
          +  plugins: [new BundleAnalyzerPlugin()],
          +  // ...
          +};
          +
        4. Save your webpack configuration file and run your webpack build command. After the build is complete, webpack-bundle-analyzer will open a page on a server where you can view detailed analysis results.

        # ▫️ Conditional Usage in Development Environment:

        const BundleAnalyzerPlugin =
        +  require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
        +
        +let plugins = [];
        +
        +if (process.env.NODE_ENV === "development") {
        +  plugins.push(new BundleAnalyzerPlugin());
        +}
        +
        +module.exports = {
        +  //...
        +  plugins: plugins,
        +  //...
        +};
        +

        In this code, the BundleAnalyzerPlugin is added to the plugins array only when the NODE_ENV is set to 'development'. This helps in avoiding the generation of additional data in the production environment.

        # ▫️ Detailed Configuration Options for BundleAnalyzerPlugin:

        new BundleAnalyzerPlugin({
        +  // Accepts a string to specify the format and channel of the generated report. It can be 'server', 'static', or 'disabled'.
        +  // 'server' starts an HTTP server to provide an interactive report view, defaulting to localhost:8888.
        +  // 'static' generates a single HTML file to describe the report.
        +  // 'disabled' can be useful in some scenarios to temporarily disable the plugin while keeping the configuration code.
        +  analyzerMode: "server",
        +
        +  // In 'server' mode, defines the hostname for the HTTP server.
        +  analyzerHost: "127.0.0.1",
        +
        +  // In 'server' mode, defines the port number for the HTTP server.
        +  analyzerPort: 8888,
        +
        +  // In 'static' mode, defines the filename for the generated report.
        +  reportFilename: "report.html",
        +
        +  // Defines the method for calculating module sizes. Can be 'stat', 'parsed', or 'gzip'.
        +  // 'stat' describes the size before any code is parsed (size between modules).
        +  // 'parsed' describes the size of all parsed code (code that has been processed and parsed by loaders).
        +  // 'gzip' describes the gzip size of all parsed code (if this value is defined).
        +  defaultSizes: "parsed",
        +
        +  // Specifies whether a module should be shown. You can use this option to hide unnecessary modules.
        +  // You can pass a function that takes a module as a parameter and returns a boolean value.
        +  filterModules: false,
        +
        +  // If you want the content of the generated report file to be a custom data structure, you can pass a function.
        +  // This function receives stats data as a parameter and should return a serialized JSON object or a Promise.
        +  generateStatsFile: false,
        +
        +  // If you want to customize the filename of the generated stats file, you can modify this option.
        +  statsFilename: "stats.json",
        +
        +  // Defines whether to generate a report when generating stats files.
        +  statsOptions: null,
        +
        +  // Defines a logging function.
        +  logLevel: "info",
        +});
        +
        • analyzerMode: Specifies the format and channel for report generation ('server', 'static', or 'disabled').
        • analyzerHost and analyzerPort: Define the hostname and port for the HTTP server in 'server' mode.
        • reportFilename: Specifies the filename for the generated report in 'static' mode.
        • defaultSizes: Defines how module sizes should be calculated ('stat', 'parsed', or 'gzip').
        • filterModules: A function to determine whether a module should be displayed in the report.
        • generateStatsFile: Allows customization of the generated stats file content using a function.
        • statsFilename: Specifies the filename for the generated stats file.
        • statsOptions: Defines options for generating stats files.
        • logLevel: Defines the log level for the plugin.
        + + + diff --git a/practice/index.html b/practice/index.html new file mode 100644 index 00000000..9a623067 --- /dev/null +++ b/practice/index.html @@ -0,0 +1,74 @@ + + + + + + プラクティス | ☻ itsyuimorii.space + + + + + + + + + + + + diff --git a/practice/shoppingcart.html b/practice/shoppingcart.html new file mode 100644 index 00000000..a6365157 --- /dev/null +++ b/practice/shoppingcart.html @@ -0,0 +1,592 @@ + + + + + + React and TypeScript Shopping Cart Application | ☻ itsyuimorii.space + + + + + + + + +

        # React and TypeScript Shopping Cart Application

        # 🔷 CartProvider Component

        path: src/Context/CartProvider.tsx

        # 1. Type Definitions

        CartItemType

        Defines the structure of a single shopping cart item.

        export type CartItemType = {
        +  sku: string;
        +  name: string;
        +  price: number;
        +  qty: number;
        +};
        +

        CartStateType

        Defines the type for the shopping cart state.

        type CartStateType = { cart: CartItemType[] };
        +

        # 2. Action Types Definition

        REDUCER_ACTION_TYPE

        An object defining various action types for updating the state.

        const REDUCER_ACTION_TYPE = {
        +  ADD: "ADD",
        +  REMOVE: "REMOVE",
        +  QUANTITY: "QUANTITY",
        +  SUBMIT: "SUBMIT",
        +};
        +

        ReducerActionType

        Extracts the type of REDUCER_ACTION_TYPE object.

        export type ReducerActionType = typeof REDUCER_ACTION_TYPE;
        +

        ReducerAction

        Defines the structure of the action object expected by the reducer function.

        export type ReducerAction = {
        +  type: string;
        +  payload?: CartItemType;
        +};
        +

        # 3. Reducer Function

        reducer

        A core function that handles changes in the shopping cart state.

        const reducer = (state: CartStateType, action: ReducerAction) => {
        +  // ...switch case statements
        +};
        +

        # 4. Custom Hook: useCartContext

        useCartContext

        A custom React Hook providing a context related to the shopping cart.

        const useCartContext = (initialCartState: CartStateType) => {
        +  // ...hook implementation
        +};
        +

        # 5. React Context and Provider

        CartContext

        Creates a React Context to share the shopping cart state across components.

        export const CartContext = createContext<UseCartContextType>(
        +  initalCartContextState
        +);
        +

        CartProvider

        A React component using useCartContext Hook and CartContext.Provider to provide the shopping cart context to the application.

        export const CartProvider = ({ children }: ChildrenType): ReactElement => {
        +  // ...provider implementation
        +};
        +

        # Usage Instructions

        Use useContext(CartContext) in components that need to access or modify the shopping cart state. +Example: To add an item to the cart, use dispatch({ type: 'ADD', payload: newItem }).

        # 🔻 CartProvider Code review

        
        +//path: src/context/CartProvider.tsx
        +
        +import { ReactElement, createContext, useMemo, useReducer } from "react";
        +
        +//用於描述單個購物車項目的結構。
        +
        +export type CartItemType = {
        +sku: string;
        +name: string;
        +price: number;
        +qty: number;
        +};
        +//1. 定義購物車相關的 TypeScript 類型
        +//定義購物車狀態類型
        +//它是一個包含單個屬性 cart 的對象,而 cart 是一個 CartItemType[] 類型的數組。
        +type CartStateType = { cart: CartItemType[] };
        +
        +const initialCartState: CartStateType = { cart: [] };
        +
        +//2. 定義用於更新購物車狀態的 Action 類型
        +//2.1 這是一個對象,其中定義了用於更新狀態的各種 action 的類型。如 ADD,REMOVE,QUANTITY,SUBMIT。 這些是你將在應用中用來描述發生的事件的常量。
        +const REDUCER_ACTION_TYPE = {
        +ADD: "ADD",
        +REMOVE: "REMOVE",
        +QUANTITY: "QUANTITY",
        +SUBMIT: "SUBMIT",
        +};
        +
        + //2.2 通過 typeof 獲取 REDUCER_ACTION_TYPE 的對象的類型,並將這個類型導出為 ReducerActionType。 這樣做的好處是你獲得了一個精確的類型,代表 REDUCER_ACTION_TYPE 的結構,而不僅僅是一個簡單的對象。這在 TypeScript 中有助於提高類型安全性和自動完成。
        +
        +
        +
        +export type ReducerActionType = typeof REDUCER_ACTION_TYPE;
        +//2.3 定義了傳遞給 reducer 函數的 action 對象的結構。 包含 type(動作類型)和 payload(附加數據,可選)。
        +
        +//這是另一個 TypeScript 類型定義,用於描述 reducer 函數期望接收的 action 對象的結構。每個 action 都有一個 type 屬性,它是一個字符串,應對應於 REDUCER_ACTION_TYPE 中定義的一個值。payload 是一個可選屬性,包含了任何附加的數據(在這種情況下是 CartItemType)。
        +export type ReducerAction = {
        +type: string;
        +payload?: CartItemType;
        +};
        +
        +//3. Reducer 函數
        +//3.1 Reducer Function (reducer): 這是核心功能之一,用於處理購物車狀態的變化。它根據不同的動作(添加、移除、修改數量、提交)來更新狀態。這種方式能夠集中管理狀態的變更,是 Redux 架構中的一部分。
        +const reducer = (state: CartStateType, action: ReducerAction) => {
        +switch (action.type) {
        +case REDUCER_ACTION_TYPE.ADD: {
        +if (!action.payload) {
        +throw new Error("action.payload missing in ADD action");
        +}
        +const { sku, name, price } = action.payload;
        +//如果 sku 不等于给定的值,这个元素就会被保留在新数组 filteredCart 中,否则将被排除。
        +const filteredCart: CartItemType[] = state.cart.filter(
        +(item) => item.sku !== sku
        +);
        +
        +      const itemExisted: CartItemType | undefined = state.cart.find(
        +        (item) => item.sku === sku
        +      );
        +
        +      const qty: number = itemExisted ? itemExisted.qty + 1 : 1;
        +      return { ...state, cart: [...filteredCart, { sku, name, price, qty }] };
        +    }
        +
        +    case REDUCER_ACTION_TYPE.REMOVE: {
        +      if (!action.payload) {
        +        throw new Error("action.payload missing in REMOVE action");
        +      }
        +      const { sku } = action.payload;
        +
        +      const filteredCart: CartItemType[] = state.cart.filter(
        +        (item) => item.sku !== sku
        +      );
        +      return { ...state, cart: [...filteredCart] };
        +    }
        +    //然后,它创建一个名为 updatedItem 的对象,该对象是购物车中现有商品的副本,但具有更新的 qty。最后,它创建一个名为 filteredCart 的新数组,其中包含所有其他商品,但不包括要更新的商品。
        +    case REDUCER_ACTION_TYPE.QUANTITY: {
        +      if (!action.payload) {
        +        throw new Error("action.payload missing in QUANTITY action");
        +      }
        +      const { sku, qty } = action.payload;
        +
        +      const itemExists: CartItemType | undefined = state.cart.find(
        +        (item) => item.sku === sku
        +      );
        +
        +      if (!itemExists) {
        +        throw new Error("item must exist in order to update quantity");
        +      }
        +      // 创建一个更新后的商品对象
        +      const updatedItem: CartItemType = { ...itemExists, qty };
        +
        +      // 创建一个新的购物车数组,其中包括更新后的商品
        +      const filteredCart: CartItemType[] = state.cart.filter(
        +        (item) => item.sku !== sku
        +      );
        +      return { ...state, cart: [...filteredCart, updatedItem] };
        +      // map 方法 : 创建一个新的购物车数组,其中包括更新后的商品
        +      // const filteredCart: CartItemType[] = state.cart.map((item) =>
        +      // item.sku === sku ? updatedItem : item
        +      // );
        +      // 返回更新后的购物车状态
        +      // return { ...state, cart: filteredCart };
        +    }
        +
        +    case REDUCER_ACTION_TYPE.SUBMIT: {
        +      return { ...state, cart: [] };
        +    }
        +    default:
        +      throw new Error("Unidentified reducer action type");
        +
        +}
        +};
        +// 4. 自定義 Hook:useCartContext
        +
        +/\*\*
        +*使用 useReducer 來管理購物車狀態。
        +*用 useMemo 來緩存計算結果(REDUCER_ACTIONS)。
        +*計算購物車的總數量和總價格。
        +*對購物車中的商品進行排序。\*/
        +
        +//useCartContext 是一个自定义的 React Hook,它的作用是为你的应用程序提供一个与购物车相关的上下文。这个上下文包含了购物车的状态以及与购物车操作相关的函数,例如添加商品、删除商品、更新商品数量等。
        +
        +//自定義 Hook 如 useCartContext 被用來封裝和共享邏輯,相同的邏輯可以在應用中的多個地方使用,而不必重複相同的代碼。 useCartContext 接受一个参数 initialCartState,它是购物车的初始状态,包含一个空的购物车数组。
        +const useCartContext = (initialCartState: CartStateType) => {
        +const [state, dispatch] = useReducer(reducer, initialCartState);
        +
        +//useMemo 主要用于缓存计算结果,并在依赖项(dependencies)发生变化时重新计算。
        +const REDUCER_ACTIONS = useMemo(() => {
        +return REDUCER_ACTION_TYPE;
        +}, []);
        +
        +const totalItems = state.cart.reduce((previousValue, cartItem) => {
        +return previousValue + cartItem.qty;
        +}, 0);
        +
        +const totalPrice = new Intl.NumberFormat("en-US", {
        +style: "currency",
        +currency: "USD",
        +}).format(
        +state.cart.reduce((previousValue, cartItem) => {
        +return previousValue + cartItem.qty \* cartItem.price;
        +}, 0)
        +);
        +
        +// 这段代码的作用是对购物车中的商品进行排序,排序的规则是按照商品的 sku 属性的后四位数字进行升序排序。
        +const cart = state.cart.sort((a, b) => {
        +//分别提取了商品 a 和 b 的 sku 属性的后四位数字部分。这些数字会被转换成数值类型。
        +const itemA = Number(a.sku.slice(-4));
        +const itemB = Number(b.sku.slice(-4));
        +//表示根据提取出的数字进行升序排序,即如果 itemA 小于 itemB,返回负数;如果 itemA 等于 itemB,返回零;如果 itemA 大于 itemB,返回正数。
        +return itemA - itemB;
        +});
        +
        +return { dispatch, REDUCER_ACTIONS, totalPrice, totalItems, cart };
        +};
        +//这里使用了 TypeScript 的 ReturnType 工具类型,它用于获取一个函数返回值的类型 。typeof useCartContext 表示获取 useCartContext 函数的类型,ReturnType<typeof useCartContext> 则是这个函数返回值的类型。这个类型被用作下面 CartContext 的类型参数。
        +
        +//返回值是什么 : useCartContext Hook 的返回值是一个对象,包含了与购物车相关的数据和函数。这通常包括购物车的状态(如商品列表、总价等)以及用于更新这些状态的方法(如 dispatch 方法)。
        +export type UseCartContextType = ReturnType<typeof useCartContext>;
        +
        +//Context and Provider (CartContext 和 CartProvider): 這個部分創建了一個 React Context 來跨組件共享購物車的狀態和操作。CartProvider 組件則將這個上下文應用於應用程序的根組件。
        +
        +//这里定义了初始的上下文状态。initalCartContextState 符合 UseCartContextType 类型,包含了 dispatch 函数、REDUCER_ACTIONS 常量、以及一些购物车相关的状态如 totalItems、totalPrice 和 cart。dispatch 函数是一个空函数,表示在默认情况下不执行任何操作。
        +const initalCartContextState: UseCartContextType = {
        +dispatch: () => {},
        +REDUCER_ACTIONS: REDUCER_ACTION_TYPE,
        +totalItems: 0,
        +totalPrice: "",
        +cart: [],
        +};
        +
        +//5. React Context 和 Provider
        +
        +// 創建一個 React Context,允許跨組件共享購物車狀態。 用於在應用程序中提供購物車的狀態和操作。其他組件可以使用這個 Context 來訪問購物車的狀態。
        +//const SomeContext = createContext(defaultValue)
        +export const CartContext = createContext<UseCartContextType>(
        +initalCartContextState
        +);
        +
        +type ChildrenType = {
        +children?: ReactElement | ReactElement[];
        +};
        +
        +//使用 CartContext.Provider 來將 useCartContext 的返回值作為上下文值提供給其子組件。 CartProvider 組件:這是一個 React 組件,它使用 useCartContext Hook 並通過 CartContext.Provider 提供購物車上下文給應用程序。它包裝了應用程序的根組件,使購物車上下文對整個應用程序可用。
        +export const CartProvider = ({ children }: ChildrenType): ReactElement => {
        +return (
        +<CartContext.Provider value={useCartContext(initialCartState)}>
        +{children}
        +</CartContext.Provider>
        +);
        +};
        +
        +//使用 Custom Hook 和 Context:
        +
        +//在需要訪問或修改購物車狀態的組件中,使用 useContext(CartContext) 來獲取購物車的狀態和 dispatch 函數。例如,如果需要向購物車中添加一個商品,可以使用 dispatch({ type: 'ADD', payload: newItem })。
        +
        +export default CartContext;
        +
        +/_ 使用說明
        +在需要訪問或修改購物車狀態的組件中,使用 useContext(CartContext) 來獲取購物車的狀態和 dispatch 函數。
        +例如,添加商品到購物車可以使用 dispatch({ type: 'ADD', payload: newItem })。 _/
        +
        +

        # 🔷 ProductsProvider Component

        path: src/Context/ProductsProvider.tsx

        # 1. Type Definitions

        ProductType

        Defines the structure of a product.

        export type ProductType = {
        +  sku: string;
        +  name: string;
        +  price: number;
        +};
        +

        # 2. Initial State

        initialState

        An array that holds the initial state of the product list.

        const initialState: ProductType[] = [];
        +

        # 3. Context Type Definition

        UseProductsContextType

        Defines the shape of the context used for managing product information.

        export type UseProductsContextType = {
        +  products: ProductType[];
        +};
        +

        # 4. React Context and Provider

        ProductsContext

        Creates a React Context for sharing and managing product information globally.

        export const ProductsContext =
        +  createContext<UseProductsContextType>(initialContextState);
        +

        ProductsProvider

        A React component that provides the product context to the application using the ProductsContext.Provider.

        export const ProductsProvider = ({ children }: ChildrenType): ReactElement => {
        +  // ...provider implementation
        +};
        +

        # 5. Fetching and Updating Product Data

        useEffect Hook

        Fetches product data from an external source and updates the state.

        useEffect(() => {
        +  // Function to fetch products and error handling
        +}, []);
        +

        # Usage Instructions

        Use useContext(ProductsContext) in components that need to access or modify the product information. +Example: To access the list of products, use const { products } = useContext(ProductsContext).

        This Markdown note provides a structured overview of your React and TypeScript product management application, outlining type definitions, initial state, context and provider, along with instructions for fetching and updating product data.

        # 🔻 ProductsProvider Code review

        
        +////这里定义了一个名为 ProductType 的 TypeScript
        +类型,该类型描述了产品的结构,包括sku(库存单位)、name(名称)和price(价格)等属性。
        +...
        +
        +
        +import { ReactElement, createContext, useState, useEffect } from "react";
        +
        +export type ProductType = {
        +  sku: string;
        +  name: string;
        +  price: number;
        +};
        +//const initState: ProductType[] = []
        +
        +
        +
        +const initialState: ProductType[] = [];
        +
        + //这里定义了一个名为 initState的常量,它是一个数组,包含了一些产品对象。这个数组通常用于初始化应用程序的状态,可以在React的上下文中使用。
        +
        +// export const initialState: ProductType[] = [
        +//   {
        +//     sku: "item0001",
        +//     name: "Widget",
        +//     price: 9.99,
        +//   },
        +//   {
        +//     sku: "item0002",
        +//     name: "Premium Widget",
        +//     price: 19.99,
        +//   },
        +//   {
        +//     sku: "item0003",
        +//     name: "Deluxe Widget",
        +//     price: 29.99,
        +//   },
        +// ];
        +
        +//它描述了一个用于管理产品信息的上下文的形状。具体来说,它包含一个属性(object) products,其值是一个 ProductType 类型的数组,用于存储产品信息。
        +export type UseProductsContextType = {
        +  products: ProductType[];
        +};
        +
        +const initialContextState: UseProductsContextType = {
        +  products: [],
        +};
        +
        +  //最后,它创建了一个名为 ProductsContext 的上下文对象,使用了之前定义的 UseProductsContextType 类型作为泛型参数,并将初始状態initialContextState传递给createContext函数。这个上下文对象可以在应用程序中使用,用于共享和管理产品信息的全局状态。
        +
        +type ChildrenType = { children?: ReactElement | ReactElement[] };
        +
        +export const ProductsContext =
        +  createContext<UseProductsContextType>(initialContextState);
        +
        +export const ProductsProvider = ({ children }: ChildrenType): ReactElement => {
        +  const [products, setProducts] = useState<ProductType[]>(initialState);
        +
        +  useEffect(() => {
        +    const fetchProducts = async (): Promise<ProductType[]> => {
        +      try {
        +        const res = await fetch("http://localhost:3500/products");
        +        if (!res.ok) {
        +          throw new Error("Network response was not ok");
        +        }
        +        const data: ProductType[] = await res.json();
        +        return data; // 返回产品数据
        +      } catch (error) {
        +        console.error((error as Error).message); // 使用类型断言将 error 标记为 Error 类型
        +        throw error; // 抛出错误,使外部可以捕获
        +      }
        +    };
        +
        +    fetchProducts()
        +      .then((products) => setProducts(products))
        +      // eslint-disable-next-line @typescript-eslint/no-unused-vars
        +      .catch((error) => {
        +        // 在此处可以进一步处理错误,例如显示错误消息
        +      });
        +  }, []);
        +
        +  return (
        +    <ProductsContext.Provider value={{ products }}>
        +      {children}
        +    </ProductsContext.Provider>
        +  );
        +};
        +
        +export default ProductsContext;
        +

        ProductType[]是一个表示产品数组的类型定义。而 UseProductContextType是另一个类型定义,它定义了一个对象,这个对象包含了一个名为products的字段,其类型为 ProductType[]

        # 🔷 Hooks/useProducts Hook

        import { useContext } from "react";
        +import ProductsContext from "../context/ProductsProvider";
        +import { UseProductsContextType } from "../context/ProductsProvider";
        +
        +const useProducts = (): UseProductsContextType => {
        +  return useContext(ProductsContext);
        +};
        +
        +export default useProducts;
        +

        # 🔷 Hooks/useCart Hook

        它的作用是简化了在组件中使用购物车上下文(CartContext)的过程。这个 Hook 返回了 CartContext 的值,使得在组件中访问购物车数据和操作更加直观和便捷。这种模式非常适用于将上下文的逻辑封装起来,以便在多个组件中重用。

        import { useContext } from "react";
        +import CartContext from "../context/CartProvider";
        +import { UseCartContextType } from "../context/CartProvider";
        +//通过指定返回类型为 UseCartContextType,这个 Hook 的使用者可以得到关于返回值的类型提示和校验。
        +const useCart = (): UseCartContextType => {
        +  return useContext(CartContext);
        +};
        +
        +export default useCart;
        +

        # 🔷 components/ProductList

        import { ReactElement } from "react";
        +import useCart from "../hooks/useCart";
        +import useProdudcts from "../hooks/useProducts";
        +import Product from "./Product";
        +
        +const ProductList = () => {
        +  const { dispatch, REDUCER_ACTIONS, cart } = useCart();
        +  const { products } = useProdudcts();
        +
        +  //使用 some 方法檢查:具體地,inCart 的值是通過檢查購物車(cart)中是否存在具有相同 sku 值的產品來確定的。這通過使用 Array.prototype.some 方法實現,這個方法會測試陣列中是否至少有一個元素滿足提供的函數。如果滿足條件(即購物車中已有相同 sku 的產品),則 inCart 為 true;否則,為 false。
        +
        +  let pageContent: ReactElement | ReactElement[] = <p>Loading...</p>;
        +
        +  if (products?.length) {
        +    pageContent = products.map((product) => {
        +      const inCart: boolean = cart.some((item) => item.sku === product.sku);
        +
        +      return (
        +        <Product
        +          key={product.sku}
        +          product={product}
        +          dispatch={dispatch}
        +          REDUCER_ACTIONS={REDUCER_ACTIONS}
        +          inCart={inCart}
        +        />
        +      );
        +    });
        +  }
        +
        +  const content = <main className="main main--products">{pageContent}</main>;
        +
        +  return content;
        +};
        +export default ProductList;
        +

        # 🔷 components/Product

        // 引入所需的依賴和類型
        +import { ProductType } from "../context/ProductsProvider";
        +import { ReducerActionType, ReducerAction } from "../context/CartProvider";
        +import { ReactElement, memo } from "react";
        +
        +// 定義 PropsType,用於描述 Product 組件的屬性
        +type PropsType = {
        +  product: ProductType; // 產品信息
        +  dispatch: React.Dispatch<ReducerAction>; // 購物車操作的 dispatch 函數
        +  REDUCER_ACTIONS: ReducerActionType; // 購物車操作的行為類型
        +  inCart: boolean; // 產品是否已在購物車中的標記
        +};
        +
        +// Product 組件定義
        +const Product = ({
        +  product,
        +  dispatch,
        +  REDUCER_ACTIONS,
        +  inCart,
        +}: PropsType): ReactElement => {
        +  // 產品圖片的路徑
        +  const img: string = new URL(`../images/${product.sku}.jpg`, import.meta.url)
        +    .href;
        +  console.log(img);
        +
        +  // 添加產品到購物車的事件處理函數
        +  const onAddToCart = () =>
        +    dispatch({ type: REDUCER_ACTIONS.ADD, payload: { ...product, qty: 1 } });
        +
        +  // 如果產品已在購物車中,顯示標記
        +  const itemInCart = inCart ? " → Item in Cart: ✔️" : null;
        +
        +  // 產品的展示內容
        +  const content = (
        +    <article className="product">
        +      <h3>{product.name}</h3>
        +      <img src={img} alt={product.name} className="product__img" />
        +      <p>
        +        {new Intl.NumberFormat("en-US", {
        +          style: "currency",
        +          currency: "USD",
        +        }).format(product.price)}
        +        {itemInCart}
        +      </p>
        +      <button onClick={onAddToCart}>Add to Cart</button>
        +    </article>
        +  );
        +
        +  return content;
        +};
        +
        +// 比較函數,用於優化性能,避免不必要的重新渲染
        +function areProductsEqual(
        +  { product: prevProduct, inCart: prevInCart }: PropsType,
        +  { product: nextProduct, inCart: nextInCart }: PropsType
        +) {
        +  return (
        +    Object.keys(prevProduct).every((key) => {
        +      return (
        +        prevProduct[key as keyof ProductType] ===
        +        nextProduct[key as keyof ProductType]
        +      );
        +    }) && prevInCart === nextInCart
        +  );
        +}
        +
        +// 使用 memo 包裝 Product 組件,優化渲染性能
        +const MemoizedProduct = memo<typeof Product>(Product, areProductsEqual);
        +
        +export default MemoizedProduct;
        +

        # トラブルシューティング

        # ▫️ useCartContext hooks

        這段代碼定义了一个名为 useCartContext 的自定义 React Hook。这个 Hook 使用了 React 的几个内置功能,如 useReduceruseMemo,来管理和优化购物车应用的状态。下面是对每个部分的详细解释:

        const useCartContext = (initialCartState: CartStateType) => {
        +  const [state, dispatch] = useReducer(reducer, initialCartState);
        +
        +  //useMemo 主要用于缓存计算结果,并在依赖项(dependencies)发生变化时重新计算。
        +  const REDUCER_ACTIONS = useMemo(() => {
        +    return REDUCER_ACTION_TYPE;
        +  }, []);
        +
        +  const totalItems = state.cart.reduce((previousValue, cartItem) => {
        +    return previousValue + cartItem.qty;
        +  }, 0);
        +
        +  const totalPrice = new Intl.NumberFormat("en-US", {
        +    style: "currency",
        +    currency: "USD",
        +  }).format(
        +    state.cart.reduce((previousValue, cartItem) => {
        +      return previousValue + cartItem.qty * cartItem.price;
        +    }, 0)
        +  );
        +
        +  // 这段代码的作用是对购物车中的商品进行排序,排序的规则是按照商品的 sku 属性的后四位数字进行升序排序。
        +  const cart = state.cart.sort((a, b) => {
        +    //分别提取了商品 a 和 b 的 sku 属性的后四位数字部分。这些数字会被转换成数值类型。
        +    const itemA = Number(a.sku.slice(-4));
        +    const itemB = Number(b.sku.slice(-4));
        +    //表示根据提取出的数字进行升序排序,即如果 itemA 小于 itemB,返回负数;如果 itemA 等于 itemB,返回零;如果 itemA 大于 itemB,返回正数。
        +    return itemA - itemB;
        +  });
        +
        +  return { dispatch, REDUCER_ACTIONS, totalPrice, totalItems, cart };
        +};
        +

        useReducer

        const [state, dispatch] = useReducer(reducer, initialCartState);
        +
        • 这里使用了 useReducer Hook 来管理购物车的状态。useReducer 是一个替代 useState 的 Hook,适用于复杂的状态逻辑,可以让你根据 action 更新状态。
        • reducer 是一个函数,定义了状态如何响应不同的 action 类型。
        • initialCartState 是购物车的初始状态。
        • state 代表当前的状态,dispatch 是一个函数,用来发送 action 到 reducer。

        useMemo

        const REDUCER_ACTIONS = useMemo(() => {
        +  return REDUCER_ACTION_TYPE;
        +}, []);
        +
        • useMemo 用于缓存计算的结果。这里它被用来缓存 REDUCER_ACTION_TYPE 对象。
        • 依赖项数组([])为空,这意味着 REDUCER_ACTIONS 只会在组件首次渲染时计算一次。

        计算总数和总价

        const totalItems = state.cart.reduce((previousValue, cartItem) => {
        +  return previousValue + cartItem.qty;
        +}, 0);
        +
        +const totalPrice = new Intl.NumberFormat("en-US", {
        +  style: "currency",
        +  currency: "USD",
        +}).format(
        +  state.cart.reduce((previousValue, cartItem) => {
        +    return previousValue + cartItem.qty * cartItem.price;
        +  }, 0)
        +);
        +
        • 这两个变量使用 reduce 方法来计算购物车中商品的总数量 (totalItems) 和总价 (totalPrice)。

        对购物车商品进行排序

        const cart = state.cart.sort((a, b) => {
        +  const itemA = Number(a.sku.slice(-4));
        +  const itemB = Number(b.sku.slice(-4));
        +  return itemA - itemB;
        +});
        +
        • 这段代码对购物车中的商品根据 sku 的后四位数字进行升序排序。

        返回值

        return { dispatch, REDUCER_ACTIONS, totalPrice, totalItems, cart };
        +
        • useCartContext 返回一个包含 dispatch 函数、动作类型 (REDUCER_ACTIONS)、购物车总价 (totalPrice)、总数量 (totalItems) 和排序后的购物车商品列表 (cart) 的对象。
        • 这个 Hook 可以被用于组件中,以便于访问和操作购物车的状态。

        总的来说,useCartContext Hook 为购物车应用提供了一个集中的状态管理方案,使得状态的读取和更新更加方便和高效。

        # ▫️ UseCartContextType

        在 TypeScript 中定义 UseCartContextType 类型作为 ReturnType<typeof useCartContext> 的原因是为了确保类型安全和代码的清晰性。这里解释一下具体原因和用途:

        export type UseCartContextType = ReturnType<typeof useCartContext>;
        +

        为什么要确定返回值的类型

        1. 类型安全:
        • TypeScript 强类型系统的一个主要优点是它提供了类型安全。通过明确指定函数返回值的类型,你可以在编译时捕捉潜在的错误,而不是在运行时。
        • 在这个案例中,useCartContext 是一个自定义 Hook,它可能返回一个复杂的对象,包含多个属性和方法。使用 ReturnType 可以确保你完全理解并正确处理这个 Hook 返回的数据结构。
        1. 自动推断:
        • ReturnType<typeof useCartContext> 自动推断 useCartContext Hook 的返回值类型。这意味着如果 useCartContext 的实现更改了返回值的结构,UseCartContextType 也会相应地更新,无需手动更改。

        返回值是什么

        • 返回值:
        • useCartContext Hook 的返回值是一个对象,包含了与购物车相关的数据和函数。这通常包括购物车的状态(如商品列表、总价等)以及用于更新这些状态的方法(如 dispatch 方法)。

        在什么地方用

        1. 在 Context 提供者中:
        • 当你创建一个 Context 并且想要在整个应用中共享 useCartContext 提供的数据和函数时,可以使用这个类型。例如,在 CartProvider 组件中,你可能会将 useCartContext 的返回值作为 Context 的值。
        1. 在消费者组件中:
        • 组件可以通过 useContext(CartContext) 使用这个类型来访问购物车的数据和操作函数。这样可以确保组件正确地使用了 Context 提供的数据,同时也享受到了 TypeScript 的类型检查和自动完成的好处。

        总之,UseCartContextType 的定义和使用使得你的 React 组件可以高效且安全地与购物车相关的状态和操作进行交互,同时保持代码的清晰和可维护性。

        + + + diff --git a/practice/todolist.html b/practice/todolist.html new file mode 100644 index 00000000..33e0607e --- /dev/null +++ b/practice/todolist.html @@ -0,0 +1,462 @@ + + + + + + TodoList App | ☻ itsyuimorii.space + + + + + + + + +

        # TodoList App

        # プロジェクトの構成

        • TodoList

          • Manages the overall state of the todo list.
          • Provides the addTodo function to add new todos.
          • Logs the current state of the todo list.
          • index:TdList & TdInput
        • Input(TdInput): Responsible for the input field

          • index: Main view with the input field
          • Handles user input for adding new todos.
          • Validates input and prevents the addition of duplicate todos.
          • Calls the parent's TodoList addTodo function to update the todo list.
        • List(TdList): Responsible for displaying the list of todos

          • index(TdList):Manages and displays all items in the list (including all TdItems)
          • Item(TdItem): Responsible for displaying a single item
        import React from "react";
        +import TdInput from "./Input";
        +import TdList from "./List";
        +
        +const TodoList = () => {
        +  return (
        +    <div className="todo-list">
        +      <TdInput />
        +      <TdList />
        +    </div>
        +  );
        +};
        +export default TodoList;
        +

        # TdInput Component

        1. Input Handling:
        • Utilizes the useRef hook to create a reference (inputRef) to the input element. This reference is used to access the input element's value imperatively.
        • Defines a function (handleAddTodoItem) to handle the addition of new todo items based on user input.
        1. Validation and Interaction:
        • Ensures that the input value is trimmed and not empty. Displays an alert if a todo with the same content already exists.
        • Calls the addTodo function passed as a prop from the parent component (TodoList) to add a new todo item.
        1. User Interface:
        • Renders an input field and a button within a div with the class "todo-input."
        • The button triggers the handleAddTodoItem function when clicked.
        import React from "react";
        +
        +const TdInput = () => {
        +  return (
        +    <div className="todo-input">
        +      <form>
        +        <input type="text" placeholder="Enter your todo here" />
        +        <button type="submit">Add</button>
        +      </form>
        +    </div>
        +  );
        +};
        +
        +export default TdInput;
        +

        # TdList Component

        import React from "react";
        +import TdItem from "./Item";
        +
        +const TdList = () => {
        +  return (
        +    <div className="td-list">
        +      <TdItem />
        +    </div>
        +  );
        +};
        +
        +export default TdList;
        +

        # TdItem Component

        // Each item
        +import React from "react";
        +
        +const TdItem = () => {
        +  return (
        +    <div className="todo-item">
        +      <ul>
        +        <li>
        +          <input type="checkbox" />
        +          <span>Placeholder text here</span>
        +        </li>
        +      </ul>
        +    </div>
        +  );
        +};
        +
        +export default TdItem;
        +
        • Props: Every functional component (FC) has a collection of external properties (props) that it can receive. However, in the provided TdItem component, no props are explicitly defined or used.

        • Return Value: Every functional component returns a ReactElement, which is an object containing properties such as type, props, ref, key, etc.

        import React, { FC, ReactElement, useRef } from "react";
        +
        +// IProps is a generic parameter, indicating the expected type of properties (props) this component should receive.
        +interface IProps {}
        +
        +// The component (TdInput) is declared with the FC (FunctionComponent) type, as it uses ref, and for that, generics are needed.
        +const TdInput: FC<IProps> = ({}): ReactElement => {};
        +

        Takeaways:

        • Prop: In functional components, external properties are received through the props collection. 每一個函數組件都有一個外部傳入的 props 屬性集合。
        • Every functional component has a return value, which is a ReactElement object, representing JSX. 每一個函數組件是有一個返回值的,返回的是 ReactElement 對象,即 jsx
        • ReactElement Object: A comprehensive object containing properties like type, props, ref, key, etc.

        Explanation:

        • Props, short for properties, are external attributes passed to functional components.
        • Functional components, unlike class components, inherently produce ReactElement objects as their output.
        • A ReactElement is an object encapsulating information such as the component type, its properties (props), +references (ref), keys, and more, making it a fundamental unit in React's rendering process.

        In summary, functional components receive external attributes through props and, in turn, generate ReactElement objects, forming the basis of JSX rendering in React applications.

        import React, { FC, ReactElement, useRef } from "react";
        +
        +// IProps is a generic parameter, indicating the expected type of properties (props) this component should receive.
        +interface IProps {}
        +
        +// The component (TdInput) is declared with the FC (FunctionComponent) type, as it uses ref, and for that, generics are needed.
        +const TdInput: FC<IProps> = ({}): ReactElement => {};
        +

        Explanation: The TdInput component is a functional component that is expected to receive props conforming to the IProps interface. It uses the FC (FunctionComponent) type, a generic type provided by React for defining functional components. The function returns a React element (ReactElement), indicating that this component will render JSX. The empty object ({}) in the parameter list represents the expected props, and it can be adjusted based on the actual props needed by the component. This component is defined to handle input functionality within the TodoList app.

        # 定義 inputRef

        const inputRef = useRef < HTMLInputElement > null;
        +

        # 定義 Itodo 接口

        interface Itodo {
        +  id: number;
        +  description: string;
        +  status: boolean;
        +}
        +

        # 定義 Iprops src/components/TodoList/Input/index.tsx

        interface IProps {
        +  //為什麼沒有返回值? 因為這裡是一個函數組件,不是一個函數。
        +  addTodo: (todo: ITodo) => void; // 这里 addTodo 是一个属性,其类型为一个函数,这个函数接受一个 ITodo 类型的参数 todo,并且没有返回值(void)。在使用这个组件时,你需要从父组件传递一个满足这个函数签名的函数给 addTodo 属性。
        +}
        +

        思考

        • onClick 中應該放什麼?
        • useRef 的使用方式: 使用了 useRef(null),但您在代碼中沒有使用這個 inputRef。如果您希望在按鈕點擊時獲取輸入的值,您需要使用 inputRef.current.value。
        import React, { useRef, FC, ReactElement } from "react";
        +import { ITodo } from "../../types";
        +
        +interface IProps {
        +  addTodo: (todo: ITodo) => void;
        +}
        +
        +const TdInput: FC<IProps> = ({ addTodo }): ReactElement => {
        +    //inputRef 是一個對象,裡面有一個current屬性,current屬性指向input元素,用於獲取input元素的值。
        +  const inputRef = useRef<HTMLInputElement>(null);
        +
        +  return (
        +     {/* 这里,inputRef是一个useRef具有current属性的对象。该current属性最初设置为,但在安装组件时null将更新为指向DOM 元素。input之后,您可以使用inputRef.current来引用实际的inputDOM 元素。 */}
        +    <div className="todo-input">
        +      <input type="text" placeholder="please input to do list" ref={inputRef} />
        +      <button onClick={   ????  }>add</button>
        +    </div>
        +  );
        +};
        +
        +export default TdInput;
        +
        +

        接下來,應該是對 input 取值, 那麼就需要一個 handleAddTodoItem的方法, 並且在 onClick 中調用它。

        // IProps interface representing the properties (props) expected by the component.
        +interface IProps {
        +  // addTodo is a function that takes a todo (of type ITodo) and returns void.
        +  addTodo: (todo: ITodo) => void;
        +  // todoList is an array of ITodo objects, representing the list of to-do items.
        +  todoList: ITodo[];
        +}
        +.....
        +const handleAddTodoItem = (): void => {
        +  //inputRef.current用于获取输入元素(用户输入的文本)的当前值。这允许您直接访问输入字段的值,而无需使用 React 状态。当您需要在通常的 React 状态和事件处理机制之外强制访问输入字段的当前值时,这种模式很常见。
        +  const val: string = inputRef.current!.value.trim();
        +
        +  // Check if the trimmed value is not empty
        +  if (val.length) {
        +    // Check if a todo with the same content already exists in the todoList
        +    const isExist = todoList.find((todo) => todo.content === val);
        +
        +    // If a todo with the same content exists, show an alert and return from the function
        +    if (isExist) {
        +      alert("To-do list item already exists");
        +      return;
        +    }
        +
        +      //執行父類的addTodo方法, 把子類的val 傳給父類。
        +      id: new Date().getTime(), // Generate a unique id (using timestamp)
        +      content: val,
        +      completed: false,
        +    });
        +
        +    // Clear the input field by setting its value to an empty string
        +    inputRef.current!.value = "";
        +  }
        +};
        +.....
        +
        +  return (
        +    <div className="todo-input">
        +    {/* 这里,inputRef是一个useRef具有current属性的对象。该current属性最初设置为,但在安装组件时null将更新为指向DOM 元素。input之后,您可以使用inputRef.current来引用实际的inputDOM 元素。 */}
        +      <input type="text" placeholder="please input to do list" ref={inputRef} />
        +      <button onClick={handleAddTodoItem}>add</button>
        +    </div>
        +  );
        +};
        +
        +
        +

        # TodoList 父組件

        1. State Management:
        • Manages the state of the todo list using the useState hook. The state is initialized as an empty array.
        • Logs the current state of todoList using the useEffect hook whenever todoList changes.
        1. addTodo Function:
        • Defines an addTodo function using useCallback. This function takes a todo item as a parameter and updates the todoList state by appending the new todo.
        • The useCallback hook ensures that the addTodo function maintains a stable reference across renders, optimizing performance by preventing unnecessary re-renders.
        1. Rendering Child Components:
        • Renders two child components, TdInput and TdList, within a div with the class "todo-list."
        • Passes the addTodo function and the current todoList state as props to TdInput.
        
        +// 定義一個狀態,用 useState,為了讓子組件能夠獲取到父組件的狀態,所以要用 useState
        +const [todoList, setTodoList] = useState<ITodo[]>([]);
        +//當 useEffect 被觸發時,它內部的回調函數就會執行。即當新的代辦事項被添加到 todoList 時,useEffect 的回調函數就會執行。
        +useEffect(() => {
        +  console.log(todoList);
        +}, [todoList]);
        +
        +//addTodo 函數的目的: addTodo 函數的目的是將代表待辦事項的物件添加到 todoList 狀態中。這是透過使用 setTodoList 更新 todoList 狀態實現的。
        +const addTodo = useCallback((todo: ITodo) => {
        +  console.log(todo);
        +  // 在實際應用中,你應該使用 setTodoList 更新 todoList 狀態
        +  // setTodoList((prevTodoList) => [...prevTodoList, todo]);
        +  setTodoList((todoList) => [...todoList, todo]);
        +}, []);
        +
        +//將 addTodo 作為 prop 傳遞給 TdInput 子組件: 在 return 語句中,addTodo 函數作為 prop 傳遞給了 TdInput 子組件,這樣子組件就能夠使用父組件中的這個函數。
        +return (
        +  <div className="todo-list">
        +    {/* 將 addTodo 函數作為 prop 傳遞給子組件 TdInput */}
        +
        +    <TdInput addTodo={addTodo} todoList={todoList} />
        +    <TdList />
        +  </div>
        +);
        +

        useCallback 是 React 中的一個 Hook,用於優化函數引用,特別是在子組件的 props 中使用。在這個特定的代碼中,useCallback 用於優化 addTodo 函數的引用,以防止不必要的重新渲染。

        1. useCallback 用途:

        在 React 中,每次父組件渲染時,內聯函數都會被重新創建。為了避免不必要的函數重新創建,特別是在子組件的 props 中使用函數時,可以使用 useCallback 進行優化。在這裡,useCallback 用於優化 addTodo 函數的引用,以防止不必要的重新渲染。

        1. useCallback 的作用:
        • 避免不必要的函數重新創建: 使用 useCallback 可以緩存函數的實例,只有當 useCallback 的依賴項發生變化時才會創建一個新的函數實例。這減少了子組件的不必要重新渲染,提高了應用程序性能。

        • 子組件性能優化: 如果子組件使用了 React.memo 進行性能優化(防止不必要的重新渲染),useCallback 的使用能夠確保即使父組件重新渲染,子組件不會因 addTodo 函數的實際邏輯未改變而重新渲染。

        useEffect: 簡單來說,當使用者在 TdInput 組件中點擊 "add" 按鈕時,handleAddTodoItem 函數被觸發,並且它內部調用了由父組件 TodoList 提供的 addTodo 函數。這樣做的目的是將新的待辦事項添加到父組件的 todoList 狀態中,從而觸發 useEffect 並在控制台中輸出新的 todoList

        # 使用 useReducer 替代 useState

        //path: todo-list-app/src/components/TodoList/reducer.ts
        +
        +import { ACTION_TYPE, IAction, IState, ITodo } from "./types";
        +//todoReducer 是一個純函數,用於處理有關待辦事項應用程序狀態的變化。
        +function todoReducer(state: IState, action: IAction): IState {
        +  const { type, payload } = action;
        +  //返回一個IState,todoList: []的集合
        +
        +  //action包含兩個值:一個是payload, 另一個是type。 payload 其實就是我們要傳遞的參數,也就是todo的內容,就是const addTodo = useCallback((todo: ITodo) => 裡面的todo,另一個是type則是我們要做的事情
        +
        +  switch (type) {
        +    case ACTION_TYPE.ADD_TODO:
        +      return {
        +        ...state,
        +        todoList: [...state.todoList, payload as ITodo],
        +      };
        +    default:
        +      return state;
        +  }
        +}
        +
        +export { todoReducer };
        +
        +
        //path: src/components/TodoList/index.tsx
        +import React, {
        +  FC,
        +  ReactElement,
        +  useCallback,
        +  useEffect,
        +  useReducer,
        +} from "react";
        +import TdInput from "./Input";
        +import TdList from "./List";
        +import { ITodo, IState, ACTION_TYPE } from "./types";
        +import { todoReducer } from "./reducer";
        +
        +const initialState: IState = {
        +  todoList: [],
        +};
        +
        +const TodoList: FC = (): ReactElement => {
        +  const [state, dispatch] = useReducer(todoReducer, initialState);
        +
        +  //當 useEffect 被觸發時,它內部的回調函數就會執行。,即當新的代辦事項被添加到 todoList 時,useEffect 的回調函數就會執行。
        +  useEffect(() => {
        +    console.log(state.todoList);
        +  }, [state.todoList]);
        +
        +  //可理解為redux裡的action creator, 用來創建action,是純粹的函數, 它們返回一個action對象,而這個對象然後被傳遞給 dispatch()方法。
        +  const addTodo = useCallback((todo: ITodo) => {
        +    // setTodoList((todoList) => [...todoList, todo]);
        +    dispatch({
        +      type: ACTION_TYPE.ADD_TODO,
        +      payload: todo,
        +    });
        +  }, []);
        +
        +  return (
        +    <div className="todo-list">
        +      <TdInput addTodo={addTodo} todoList={state.todoList} />
        +      <TdList />
        +    </div>
        +  );
        +};
        +export default TodoList;
        +

        # 分析 1:親コンポーネントが子コンポーネントに提供する addTodo 関数を理解するには?

        在提供給 TdInput 子組件的 addTodo 函數和 handleAddTodoItem 函數之間有一個簡單的對應關係:

        1. addTodo 函數:
          • 定義在父組件 TodoList 中。
          • 使用 useCallback 優化函數引用。
          • 負責將新的待辦事項(todo 物件)添加到 todoList 狀態中。
        const addTodo = useCallback((todo: ITodo) => {
        +  dispatch({
        +    type: ACTION_TYPE.ADD_TODO,
        +    payload: todo,
        +  });
        +}, []);
        +
        1. handleAddTodoItem 函數:
          • 定義在子組件 TdInput 中。
          • 負責處理使用者輸入的待辦事項,並通過呼叫父組件提供的 addTodo 函數將新的待辦事項添加到 todoList 中。
        const handleAddTodoItem = (): void => {
        +  // ...(省略其他處理邏輯)
        +  addTodo({
        +    id: new Date().getTime(),
        +    content: val,
        +    completed: false,
        +  });
        +  // ...(省略其他處理邏輯)
        +};
        +

        todolist

        1. TodoList 組件:

          • TodoList 組件是一個 React 函數組件,負責渲染待辦事項應用的主要 UI。
          • 使用 useReducer Hook 管理狀態,並將狀態和派發函數 dispatch 作為 todoReducer 的參數。
        2. TdInput 組件:

          • TdInput 組件是 TodoList 組件的子組件,負責處理待辦事項的輸入部分。
          • 接收 addTodo 函數作為 prop,用來添加新的待辦事項。
          • 使用 inputRef 來獲取用戶輸入的值,並在點擊 "add" 按鈕時調用 handleAddTodoItem 函數。
        3. todoReducer 函數:

          • todoReducer 是一個純函數,用於處理與待辦事項應用的狀態相關的操作。
          • 接收當前應用程序的狀態 (state) 和一個描述操作的對象 (action)。
          • 在這個特定的應用中,只處理一種操作類型 ACTION_TYPE.ADD_TODO,用來將新的待辦事項添加到 todoList 中。

        這三個組件/函數之間的關係是通過 React 的層級組件結構和 props 傳遞建立的。主要的工作流程是:

        • TodoList 組件中使用 useReducer 來初始化應用的狀態並獲取 dispatch 函數。
        • TodoList 將狀態和 addTodo 函數作為 prop 傳遞給 TdInput 子組件。
        • TdInput 中,使用 inputRef 獲取用戶輸入的值,並在點擊 "add" 按鈕時調用 addTodo 函數。
        • addTodo 函數內部調用 dispatch 並傳遞一個描述添加待辦事項操作的 action 對象。
        • dispatch 調用 todoReducer 函數來修改應用的狀態。
        • useEffect Hook 監聽 state.todoList 的變化,並在變化時輸出日誌。
        
        +//path: todo-list-app/src/components/TodoList/reducer.ts
        +/**
        + * Redux 中 reducer 函數內的 switch case,用於處理不同的 action types。
        +
        + * 在 todoReducer 中,這些 case 實際上是 action types 的不同分支,用於決定根據不同的 action type 如何更新應用的狀態。
        +
        + * Reducer 是一個純函數,它接收先前的狀態和一個 action 物件,然後根據 action 的類型執行相應的操作,返回新的狀態。
        + */
        +import { ACTION_TYPE, IAction, IState, ITodo } from "./types";
        +function todoReducer(state: IState, action: IAction): IState {
        +  const { type, payload } = action;
        +
        +  switch (type) {
        +    case ACTION_TYPE.ADD_TODO:
        +      return {
        +        ...state,
        +        todoList: [...state.todoList, payload as ITodo],
        +      };
        +
        +    /**
        +       * 這裡的目的是從 todoList 中移除指定 id 的待辦事項。具體步驟如下:
        +
        +      1. 使用 filter 方法遍歷 state.todoList 中的每個待辦事項 (todo)。
        +      2. 對於每個待辦事項,檢查其 id 是否等於 payload(payload 是從 action 中傳入的待辦事項的 id)。
        +      3. 如果待辦事項的 id 與 payload 不相等,則保留該待辦事項;如果相等,則過濾掉該待辦事項。
        +      4. 將過濾後的待辦事項列表更新到新的 state 中。
        +       */
        +
        +    case ACTION_TYPE.REMOVE_TODO:
        +      return {
        +        ...state,
        +        todoList: state.todoList.filter((todo) => todo.id !== payload),
        +      };
        +
        +    /**
        +     * 這裡的目的是切換指定 `id` 的待辦事項的完成狀態(`completed`)。具體步驟如下:
        +
        +      1. 使用 `map` 方法遍歷 `state.todoList` 中的每個待辦事項 (`todo`)。
        +      2. 對於每個待辦事項,檢查其 `id` 是否等於 `payload`(`payload` 是從 `action` 中傳入的待辦事項的 `id`)。
        +      3. 如果待辦事項的 `id` 與 `payload` 相等,則將該待辦事項的 `completed` 狀態取反(切換完成狀態)。
        +      4. 將修改後的待辦事項列表更新到新的 `state` 中。
        +     */
        +
        +    case ACTION_TYPE.TOGGLE_TODO:
        +      return {
        +        ...state,
        +        todoList: state.todoList.map((todo) => {
        +          return todo.id === payload
        +            ? { ...todo, completed: !todo.completed }
        +            : { ...todo };
        +        }),
        +      };
        +    default:
        +      return state;
        +  }
        +}
        +
        +export { todoReducer };
        +

        # 分析 3 什麼是 action creator? 返回純函數的意思是?

        在 Redux 中,一個 action creator 是一個返回 action 物件的函數。這個 action 物件包含了描述 action 類型(type)和相關數據(payload)的信息。一個典型的 action creator 純函數如下:

        // action creator
        +const addTodo = (text) => {
        +  return {
        +    type: "ADD_TODO",
        +    payload: {
        +      text,
        +      completed: false,
        +    },
        +  };
        +};
        +
        +// 使用 action creator 來創建一個 action 物件
        +const newTodoAction = addTodo("Buy groceries");
        +

        在這個例子中,addTodo 是一個 action creator 函數。當你調用它時,它返回一個包含 action 信息的物件。這個 action 物件至少包含 type 屬性,用來指定 action 的類型,以及 payload 屬性,用來包含相關的數據。

        Redux 的 reducer 函數則根據這些 action 物件的 type 屬性,來決定如何更新應用的狀態。在 reducer 內部,通常使用一個 switch case 來處理不同的 action types。這就是為什麼在 Redux 中的 action creators 是純函數的原因,因為它們返回一個描述 action 的純函數,而不執行對應的非純操作。

        簡而言之,Redux 中的 action creators 是純函數,因為它們只返回描述 action 的物件,而不執行其他可能引起副作用的操作。這有助於保持 Redux 應用的可預測性和可測試性。

        # 分析 4: Iprops

        //IProps 具有属性 todoList、toggleTodo 和 的接口 removeTodo 用于 TdItem(item) 和 TdList(list) 组件,以定义这些组件应接收的预期 props。

        # IProps Interface for TdInput Component:

        interface IProps {
        +  addTodo: (todo: ITodo) => void;
        +  todoList: ITodo[];
        +}
        +
        • addTodo: This property is a function that takes an ITodo parameter and returns void. It suggests that the TdInput component expects a function to be passed down that will handle the addition of a new todo item to the list.

        • todoList: This property is an array of ITodo items. It represents the list of todos that the TdInput component needs access to, possibly for checking if a todo already exists before adding a new one.

        # IProps Interface for TdList Component:

        interface IProps {
        +  todoList: ITodo[];
        +  toggleTodo: (id: number) => void;
        +  removeTodo: (id: number) => void;
        +}
        +
        • todoList: This property is an array of ITodo items. It represents the list of todos that the TdList component will render.

        • toggleTodo: This property is a function that takes a number (presumably the id of a todo item) and returns void. It suggests that the TdList component expects a function to be passed down that will handle toggling the completion status of a todo item.

        • removeTodo: This property is a function that takes a number (presumably the id of a todo item) and returns void. It suggests that the TdList component expects a function to be passed down that will handle removing a todo item from the list.

        # Common Aspects:

        • Both interfaces include a todoList property, indicating that both components need access to the list of todos.
        • The ITodo type is referenced in both interfaces, suggesting that it defines the structure of a todo item.

        Understanding these interfaces helps clarify what kind of props each component expects and how they interact with the rest of the application.

        # IProps in the TodoList>input>index.tsx

        //path: src/components/TodoList/Input/index.tsx
        +import React, { useRef, FC, ReactElement } from "react";
        +import { ITodo } from "../types";
        +
        +//addTodo接口中属性的存在IProps表明TdInput组件期望将函数作为 prop 传递,并且该函数应该具有签名(todo: ITodo) => void。这表明该函数的目的可能是处理添加新的待办事项。
        +interface IProps {
        +  //addTodo:它是一个以ITodo对象作为参数并返回的函数void。该函数预计可以处理添加新的待办事项。
        +  addTodo: (todo: ITodo) => void;
        +
        +  //todoList:它是一个对象数组ITodo。该数组表示组件将与之交互的待办事项列表TdInput,专门用于检查列表中是否已存在新的待办事项。
        +  todoList: ITodo[];
        +}
        +
        +/**
        + * addTodoProp: 是一个向下传递给TdInput组件的函数。在函数内部handleAddTodoItem,当即将添加新的待办事项时,将调用此函数。该addTodo函数负责将新的待办事项添加到整个待办事项列表中。
        +
        + * todoListProp: 是待办事项的数组。它在handleAddTodoItem函数中用于检查列表中是否已存在具有相同内容的新待办事项。如果是,则会显示警报,并且不会添加新的待办事项。
        + */
        +
        +const TdInput: FC<IProps> = ({ addTodo, todoList }): ReactElement => {
        +  const inputRef = useRef<HTMLInputElement>(null);
        +
        +  const handleAddTodoItem = (): void => {
        +    const val: string = inputRef.current!.value.trim();
        +
        +    if (val.length) {
        +      const isExist = todoList.find((todo) => todo.content === val);
        +
        +      if (isExist) {
        +        alert("to do list has existed");
        +        return;
        +      }
        +      //在该函数中,addTodo使用新的 todo 对象作为参数来调用该函数。addTodo这与界面中的属性设置的期望一致IProps。
        +      addTodo({
        +        id: new Date().getTime(),
        +        content: val,
        +        completed: false,
        +      });
        +      inputRef.current!.value = "";
        +    }
        +  };
        +  return (
        +    <div className="todo-input">
        +      <input type="text" placeholder="please input to do list" ref={inputRef} />
        +      <button onClick={handleAddTodoItem}>add</button>
        +    </div>
        +  );
        +};
        +
        +export default TdInput;
        +
        + + +
    ')]),t._v("并在里面放一个插座, 👉 渲染"),a("code",[t._v("")])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Root")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* all the other elements */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div id"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"detail"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Outlet "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])]),t._v(" "),a("li",[a("p",[t._v("👉 将联系人路由移至根路由的子路由 "),a("code",[t._v("main.js")])])])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" router "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createBrowserRouter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("path")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("element")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Root "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errorElement")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ErrorPage "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 子路由, 應該是一個對象,裡面配置路由的路徑和組件")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("children")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("path")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"contacts/:contactId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("element")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Contact "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"▫️-takeaway-03-👉-将侧边栏更改-a-href-为-link-to"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#▫️-takeaway-03-👉-将侧边栏更改-a-href-为-link-to"}},[t._v("#")]),t._v(" ▫️ Takeaway 03: 👉 将侧边栏更改"),a("code",[t._v("")]),t._v("为"),a("code",[t._v("")])]),t._v(" "),a("blockquote",[a("p",[t._v("為什麼要用"),a("code",[t._v("")]),t._v("而不是"),a("code",[t._v("")]),t._v("?\n因為"),a("code",[t._v("a href")]),t._v("會刷新頁面,而 "),a("code",[t._v("Link")]),t._v(" 不會刷新頁面, 因為從服務器獲取頁面的代價是很大的,所以我們不希望刷新頁面。")])]),t._v(" "),a("blockquote",[a("p",[t._v("以下代碼, "),a("em",[t._v("在浏览器开发工具中打开网络选项卡,以查看它不再请求文档。")])])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" Outlet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Link "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-router-dom"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Root")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div id"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sidebar"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* other elements */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("nav"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ul"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("li"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Link to"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("contacts/1")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Your Name"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("Link"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("li"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("li"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Link to"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("contacts/2")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Your Friend"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("Link"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("li"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("ul"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("nav"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* other elements */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("a",{attrs:{href:"../images/react/linktag.png"}},[t._v("linktag")])]),t._v(" "),a("h2",{attrs:{id:"🔶-loader-and-action"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔶-loader-and-action"}},[t._v("#")]),t._v(" 🔶 "),a("code",[t._v("loader")]),t._v(" and "),a("code",[t._v("action")])]),t._v(" "),a("h3",{attrs:{id:"▫️-takeaway-01-傳統式-form-表單的提交"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#▫️-takeaway-01-傳統式-form-表單的提交"}},[t._v("#")]),t._v(" ▫️ Takeaway 01: 傳統式 form 表單的提交")]),t._v(" "),a("blockquote",[a("p",[t._v("傳統式 form 表單的提交,會刷新頁面,然後服務器會返回一個新的頁面,然後頁面會重新加載,這樣就不是單頁面應用了。")])]),t._v(" "),a("h3",{attrs:{id:"▫️-takeaway-02-理解-loader-and-actionß"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#▫️-takeaway-02-理解-loader-and-actionß"}},[t._v("#")]),t._v(" ▫️ Takeaway 02: 理解 "),a("code",[t._v("loader")]),t._v(" and "),a("code",[t._v("action")]),t._v("ß")]),t._v(" "),a("blockquote",[a("p",[t._v("loader: 加載器, 用於加載數據, 顯示加載中的組件\naction: 用於加載數據, 顯示加載中的組件")])]),t._v(" "),a("p",[t._v("▫️ 在 react-router 中,為什麼需要用 loader? 因為我們需要在獲取數據的時候,顯示加載中的組件,然後在獲取數據後,再顯示組件。 這樣就不會出現空白頁面的情況。\n▫️ 原因: react-router 希望我們把獲取數據的代碼放在 loader 中,然後在獲取數據後,再顯示組件。")]),t._v(" "),a("ol",[a("li",[t._v("👉 Configure the loader on the route "),a("code",[t._v("main.jsx")])])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Root"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" loader "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" rootLoader "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./routes/root"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" router "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createBrowserRouter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("省略代碼\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("loader")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" rootLoader"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("children")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("省略代碼"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("ol",{attrs:{start:"2"}},[a("li",[t._v("👉 Export a loader from "),a("code",[t._v("root.jsx")]),t._v(" "),a("blockquote",[a("p",[t._v("獲取聯繫人列表,這裡是異步的獲取數據,然後獲取後,放入到 return 中\n一般是異步的獲取數據,")])])])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" Outlet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Link "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-router-dom"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" getContacts "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../contacts"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//異步的獲取數據")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("loader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" contacts "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getContacts")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" contacts "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//以對象的形式返回")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("省略代碼\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Root")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("省略代碼\n\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[t._v("👉 Access and render the data")])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Outlet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Link"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n useLoaderData"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-router-dom"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" getContacts "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../contacts"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* other code */")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Root")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" contacts "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useLoaderData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("省略代碼\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("nav"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("contacts"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ul"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("contacts"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("contact")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("li key"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("contact"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Link to"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("contacts/")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("contact"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("contact"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("first "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" contact"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("last "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("contact"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("first"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("contact"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("last"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("No Name"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('" "')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("contact"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("favorite "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("span"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("★"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("span"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("Link"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("li"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("ul"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("No contacts"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("nav"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Creating Contacts")])]),t._v(" "),a("p",[t._v("We'll create new contacts by exporting an action in our root route, wiring it up to the route config, and changing our "),a("code",[t._v("
    ")]),t._v(" to a React Router "),a("code",[t._v(".")])]),t._v(" "),a("p",[t._v("這裡需要理解,為什麼我要把 from 改為 Form? 因為我們轉發信息的時候,Form 會攔截,然後轉發給 action,然後 action 會獲取數據,然後再轉發給組件。 而傳統的 "),a("code",[t._v("form")]),t._v(" 會直接發送請求到服務器,然後服務器會返回一個新的頁面,然後頁面會重新加載,這樣就不是單頁面應用了。")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" Outlet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Link"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Form "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-router-dom"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" getContacts "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../contacts"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* other code */")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Form method"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"post"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"submit"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("New"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("Form"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("👉 Configure the loader and action on the route and Import and set the action on the route")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//封裝了action")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Root"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n loader "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" rootLoader"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n action "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" rootAction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./routes/root"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//把action 綁定到這個路由上")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" router "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createBrowserRouter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("path")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("element")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Root "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errorElement")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ErrorPage "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 子路由, 應該是一個對象,裡面配置路由的路徑和組件")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("loader")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" rootLoader"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("action")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" rootAction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("children")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("path")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"contacts/:contactId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("element")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Contact "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("思考:")]),t._v(" "),a("ol",[a("li",[t._v("那麼什麼時候用 loader, 什麼時候用 action 呢?")])]),t._v(" "),a("ul",[a("li",[t._v("當我們需要獲取數據的時候,就用 loader, 比如 get")]),t._v(" "),a("li",[t._v("當我們需要提交數據的時候,就用 action, 比如 put,post")])]),t._v(" "),a("ol",{attrs:{start:"2"}},[a("li",[t._v("這裡有一個細節,")])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Form method"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"post"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"submit"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("New"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("Form"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[a("p",[t._v("這裡配置時,並為配置 action, 所以提交表單後,會轉發到根目錄,也就是"),a("code",[t._v("/")]),t._v(", 然後根目錄配置了 action, 所以會轉發到 action 中,然後 action 中獲取數據,然後再轉發到組件中。")])]),t._v(" "),a("li",[a("p",[t._v("官網參考\nBy convention, React Router uses this as a hint to automatically revalidate the data on the page after the action finishes.\n"),a("img",{attrs:{src:s(295),alt:"action"}})])])]),t._v(" "),a("h2",{attrs:{id:"🔶-url-params-in-loader"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔶-url-params-in-loader"}},[t._v("#")]),t._v(" 🔶 URL params in Loader")]),t._v(" "),a("p",[t._v("These params are passed to the loader with keys that match the dynamic segment. For example, our segment is named :contactId so the value will be passed as params.contactId.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//封裝loader 函數,用於獲取具體的聯繫信息")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("loader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" params "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"params"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" params"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("contactId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//這裡每點擊new,就會打印出不同的id")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" contact "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getContact")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("params"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("contactId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" contact "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Contact")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" contact "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useLoaderData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("省略代碼\n")])])]),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" router "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createBrowserRouter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("省略代碼\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("children")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("path")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"contacts/:contactId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("element")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Contact "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("loader")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" contactLoader"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h2",{attrs:{id:"🔶-updating-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔶-updating-data"}},[t._v("#")]),t._v(" 🔶 Updating data")]),t._v(" "),a("p",[t._v("自定義的 Form 組件,意思就是還是會攔截,然後轉發給 action,然後 action 會獲取數據,然後再轉發給組件。")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Form action"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"edit"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"submit"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Edit"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("Form"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/24.00bed91f.js b/assets/js/24.00bed91f.js new file mode 100644 index 00000000..c6f85b1a --- /dev/null +++ b/assets/js/24.00bed91f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{297:function(e,t,n){e.exports=n.p+"assets/img/contenttypebuilder.24db04ba.png"},298:function(e,t,n){e.exports=n.p+"assets/img/contenttypebuilder2.d73df612.png"},335:function(e,t,n){"use strict";n.r(t);var a=n(14),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"⚪️-strapi-への深い理解"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-strapi-への深い理解"}},[e._v("#")]),e._v(" ⚪️ Strapi への深い理解")]),e._v(" "),t("h2",{attrs:{id:"project-structure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#project-structure"}},[e._v("#")]),e._v(" "),t("a",{attrs:{href:"https://docs.strapi.io/dev-docs/project-structure",target:"_blank",rel:"noopener noreferrer"}},[e._v("project structure"),t("OutboundLink")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("以下の構成は、"),t("code",[e._v("strapi new")]),e._v(" で作成されるプロジェクトの構成です。")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(". # root of the application\n├──── .strapi # auto-generated folder — do not update manually\n│ └──── client # files used by bundlers to render the application\n│ ├ index.html\n│ └ app.js\n├──── .tmp\n├──── build # build of the admin panel\n├──── config # API configurations\n│ ├ api.js\n│ ├ admin.js\n│ ├ cron-tasks.js\n│ ├ database.js\n│ ├ middlewares.js\n│ ├ plugins.js\n│ └ server.js\n├──── database\n│ └──── migrations\n├──── node_modules # npm packages used by the project\n├──── public # files accessible to the outside world\n│ └──── uploads\n├──── src\n│ ├──── admin # admin customization files\n│ ├──── extensions # files to extend the admin panel\n│ │ ├ app.js\n│ │ └ webpack.config.js\n│ ├──── api # business logic of the project split into subfolders per API\n│ │ └──── (api-name)\n│ │ ├──── content-types\n│ │ │ └──── (content-type-name)\n│ │ │ └ lifecycles.js\n│ │ │ └ schema.json\n│ │ ├──── controllers\n│ │ ├──── middlewares\n│ │ ├──── policies\n│ │ ├──── routes\n│ │ ├──── services\n│ │ └ index.js\n│ ├──── components\n│ │ └──── (category-name)\n│ │ ├ (componentA).json\n│ │ └ (componentB).json\n│ ├──── extensions # files to extend installed plugins\n│ │ └──── (plugin-to-be-extended)\n│ │ ├──── content-types\n│ │ │ └──── (content-type-name)\n│ │ │ └ schema.json\n│ │ └ strapi-server.js\n│ ├──── middlewares\n│ │ └──── (middleware-name).js\n│ ├──── plugins # local plugins files\n│ │ └──── (plugin-name)\n│ │ ├──── admin\n│ │ │ └──── src\n│ │ │ └ index.js\n│ │ ├──── server\n│ │ │ ├──── content-types\n│ │ │ ├──── controllers\n│ │ │ └──── policies\n│ │ ├ package.json\n│ │ ├ strapi-admin.js\n│ │ └ strapi-server.js\n│ ├─── policies\n│ └ index.js # include register(), bootstrap() and destroy() functions\n├ .env\n└ package.json\n")])])]),t("p",[e._v("Understand the project structure of a Strapi project.")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Project Root:")]),e._v(" The top-level directory of the Strapi application, containing all the files and subdirectories needed for the application to run.")])]),e._v(" "),t("li",[t("p",[t("strong",[t("code",[e._v(".strapi")]),e._v(" Directory:")]),e._v(" This is an auto-generated folder. It's created and managed by Strapi itself. You shouldn't manually update files in this directory as they are managed by the Strapi framework. It typically includes client-side files used by bundlers to render the application.")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("index.html")]),e._v(" and "),t("code",[e._v("app.js")]),e._v(" are examples of files in this directory, which are key to rendering the Strapi admin panel in a web browser.")])])]),e._v(" "),t("li",[t("p",[t("strong",[t("code",[e._v(".tmp")]),e._v(" Directory:")]),e._v(" A temporary directory used by Strapi during runtime for storing temporary files.")])]),e._v(" "),t("li",[t("p",[t("strong",[t("code",[e._v("build")]),e._v(" Directory:")]),e._v(' This is where the built version of the admin panel resides. The "build" process involves compiling and bundling all the necessary files (like JavaScript, CSS, HTML) into a format suitable for deployment. This is done so that the admin panel can be served efficiently in a production environment.')]),e._v(" "),t("ul",[t("li",[e._v('The "build" process is usually done after development when you\'re ready to deploy your application. It optimizes the application for better performance in a production environment.')])])])]),e._v(" "),t("h2",{attrs:{id:"api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api"}},[e._v("#")]),e._v(" "),t("a",{attrs:{href:"https://docs.strapi.io/developer-docs/latest/development/backend-customization.html#api",target:"_blank",rel:"noopener noreferrer"}},[e._v("API"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"headless-cms-とは"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#headless-cms-とは"}},[e._v("#")]),e._v(" headless CMS とは?")]),e._v(" "),t("p",[e._v("Headless CMS, like Strapi, represents a significant shift in how content management systems operate, particularly in the relationship between the front-end and the back-end. Let's break down what it means and how it's particularly beneficial for a React JavaScript environment:")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Traditional vs. Headless CMS:")])]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Traditional CMS:")]),e._v(" Systems like WordPress tightly couple the front-end (what you see) and the back-end (where content is stored and managed). This means the way content is created, stored, and displayed is predefined and linked. Customizing the front-end or integrating with different technologies can be challenging.")]),e._v(" "),t("li",[t("strong",[e._v("Headless CMS:")]),e._v(' Strapi, as a headless CMS, decouples the front-end and the back-end. It provides only the back-end (headless) part, where content is stored and managed via an API. The front-end part (the "head") is entirely separate and can be built using any technology – like React in your case.')])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("API-Driven Approach:")])]),e._v(" "),t("ul",[t("li",[e._v("In a headless CMS, content is delivered through APIs, typically RESTful or GraphQL. This approach offers greater flexibility in how content is retrieved and displayed. A front-end developer can query the API to fetch content and display it using React or any other front-end framework.")])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Benefits for Front-End Developers:")])]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Flexibility:")]),e._v(" You can use your preferred front-end technology (React, Angular, Vue.js, etc.) to build your user interface.")]),e._v(" "),t("li",[t("strong",[e._v("Customization:")]),e._v(" Since the front-end is separate, you have complete control over the user experience and can build custom UIs without the constraints of traditional CMS themes or templates.")]),e._v(" "),t("li",[t("strong",[e._v("Scalability:")]),e._v(" APIs make it easier to scale your application. You can develop new features or change the front-end without altering the back-end.")]),e._v(" "),t("li",[t("strong",[e._v("Omnichannel Content Delivery:")]),e._v(" Content can be used across different platforms – web, mobile apps, IoT devices, etc., without needing to adjust the back-end for each case.")])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v('Why "Headless" for React Development:')])]),e._v(" "),t("ul",[t("li",[e._v("React is a powerful library for building user interfaces. Pairing React with a headless CMS like Strapi allows you to create dynamic, interactive web applications with content that's easy to manage and update.")]),e._v(" "),t("li",[e._v("You can fetch data from the Strapi API using AJAX calls (with "),t("code",[e._v("fetch")]),e._v(", "),t("code",[e._v("axios")]),e._v(", or any other HTTP client) and then render this data using React components. This setup offers a modern, efficient way to build web applications.")])])])]),e._v(" "),t("p",[e._v("Strapi 的「無頭」性質意味著它提供後端功能(例如透過 API 進行內容儲存、管理和交付),而無需規定前端應如何建置或呈現。這種分離允許前端開發人員利用 React 等現代框架的強大功能來建立豐富的互動式使用者介面,同時仍受益於 CMS 強大的內容管理功能。")]),e._v(" "),t("h2",{attrs:{id:"content-type-builder"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#content-type-builder"}},[e._v("#")]),e._v(" "),t("a",{attrs:{href:"https://docs.strapi.io/developer-docs/latest/development/backend-customization.html#content-type-builder",target:"_blank",rel:"noopener noreferrer"}},[e._v("Content Type Builder"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The Content Type Builder in Strapi is a powerful feature that enables you to quickly generate API endpoints for managing data through CRUD (Create, Read, Update, Delete) operations. Here's a summary of its functionalities and an example to illustrate its use:")]),e._v(" "),t("h3",{attrs:{id:"understanding-content-type-builder"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#understanding-content-type-builder"}},[e._v("#")]),e._v(" Understanding Content Type Builder:")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Purpose:")])]),e._v(" "),t("ul",[t("li",[e._v("Enables the creation of Content Types (data structures) in Strapi.")]),e._v(" "),t("li",[e._v("Facilitates the definition and customization of fields for these Content Types.")])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Functionality:")])]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Data Structure Creation:")]),e._v(" You can define new Content Types (akin to tables in a database) directly within Strapi's admin panel. This includes specifying the fields and data types.")]),e._v(" "),t("li",[t("strong",[e._v("API Generation:")]),e._v(" Once a Content Type is created, Strapi automatically generates RESTful or GraphQL API endpoints for it. This means you can perform CRUD operations on the data associated with this Content Type.")]),e._v(" "),t("li",[t("strong",[e._v("Customization:")]),e._v(" The fields of a Content Type can be tailored to fit the data requirements of your application. You can choose from various field types like text, number, media, relational fields (to establish relationships between different Content Types), and more.")])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("User Interface:")])]),e._v(" "),t("ul",[t("li",[e._v("The Content Type Builder offers a user-friendly interface within the Strapi admin panel for designing and modifying Content Types without writing any code.")])])])]),e._v(" "),t("h3",{attrs:{id:"example-use-case"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-use-case"}},[e._v("#")]),e._v(" Example Use Case:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Creating a Blog Post Content Type:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Objective:")]),e._v(" To create a Content Type for managing blog posts.")]),e._v(" "),t("li",[t("strong",[e._v("Steps:")]),e._v(" "),t("ol",[t("li",[e._v("Access the Content Type Builder in the Strapi admin panel.")]),e._v(" "),t("li",[e._v("Create a new Content Type named "),t("code",[e._v("BlogPost")]),e._v(".")]),e._v(" "),t("li",[e._v("Define fields such as "),t("code",[e._v("title")]),e._v(" (text type), "),t("code",[e._v("content")]),e._v(" (rich text type), "),t("code",[e._v("publishedDate")]),e._v(" (date type), and "),t("code",[e._v("author")]),e._v(" (relational field linking to a "),t("code",[e._v("User")]),e._v(" Content Type).")]),e._v(" "),t("li",[e._v("Save the Content Type. Strapi then generates API endpoints for "),t("code",[e._v("BlogPost")]),e._v(".")])])]),e._v(" "),t("li",[t("strong",[e._v("Outcome:")]),e._v(" You can now use the generated API endpoints to create, retrieve, update, or delete blog posts in your application.")])])])]),e._v(" "),t("h3",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[e._v("#")]),e._v(" Conclusion:")]),e._v(" "),t("p",[e._v("The Content Type Builder in Strapi streamlines the process of creating data structures and corresponding APIs, making it an ideal tool for developers looking to build and manage content-driven applications efficiently. Its user-friendly interface and customization options allow for a great degree of flexibility in defining the data model according to the specific needs of your application.")]),e._v(" "),t("p",[e._v("The Content Type Builder in Strapi is a powerful feature that enables you to quickly generate API endpoints for managing data through CRUD (Create, Read, Update, Delete) operations. Here's a summary of its functionalities and an example to illustrate its use:")]),e._v(" "),t("h3",{attrs:{id:"understanding-content-type-builder-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#understanding-content-type-builder-2"}},[e._v("#")]),e._v(" Understanding Content Type Builder:")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Purpose:")])]),e._v(" "),t("ul",[t("li",[e._v("Enables the creation of Content Types (data structures) in Strapi.")]),e._v(" "),t("li",[e._v("Facilitates the definition and customization of fields for these Content Types.")])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Functionality:")])]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Data Structure Creation:")]),e._v(" You can define new Content Types (akin to tables in a database) directly within Strapi's admin panel. This includes specifying the fields and data types.")]),e._v(" "),t("li",[t("strong",[e._v("API Generation:")]),e._v(" Once a Content Type is created, Strapi automatically generates RESTful or GraphQL API endpoints for it. This means you can perform CRUD operations on the data associated with this Content Type.")]),e._v(" "),t("li",[t("strong",[e._v("Customization:")]),e._v(" The fields of a Content Type can be tailored to fit the data requirements of your application. You can choose from various field types like text, number, media, relational fields (to establish relationships between different Content Types), and more.")])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("User Interface:")])]),e._v(" "),t("ul",[t("li",[e._v("The Content Type Builder offers a user-friendly interface within the Strapi admin panel for designing and modifying Content Types without writing any code.")])])])]),e._v(" "),t("h3",{attrs:{id:"example-use-case-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-use-case-2"}},[e._v("#")]),e._v(" Example Use Case:")]),e._v(" "),t("p",[t("img",{attrs:{src:n(297),alt:"contenttypebuilder"}})]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Creating a Blog Post Content Type:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Objective:")]),e._v(" To create a Content Type for managing blog posts.")]),e._v(" "),t("li",[t("strong",[e._v("Steps:")]),e._v(" "),t("ol",[t("li",[e._v("Access the Content Type Builder in the Strapi admin panel.")]),e._v(" "),t("li",[e._v("Create a new Content Type named "),t("code",[e._v("BlogPost")]),e._v(".")]),e._v(" "),t("li",[e._v("Define fields such as "),t("code",[e._v("title")]),e._v(" (text type), "),t("code",[e._v("content")]),e._v(" (rich text type), "),t("code",[e._v("publishedDate")]),e._v(" (date type), and "),t("code",[e._v("author")]),e._v(" ("),t("strong",[e._v("relational")]),e._v(" field linking to a "),t("code",[e._v("User")]),e._v(" Content Type).\n"),t("img",{attrs:{src:n(298),alt:"contenttypebuilder"}})]),e._v(" "),t("li",[e._v("Save the Content Type. Strapi then generates API endpoints for "),t("code",[e._v("BlogPost")]),e._v(".")])])]),e._v(" "),t("li",[t("strong",[e._v("Outcome:")]),e._v(" You can now use the generated API endpoints to create, retrieve, update, or delete blog posts in your application.")])])])]),e._v(" "),t("h3",{attrs:{id:"conclusion-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion-2"}},[e._v("#")]),e._v(" Conclusion:")]),e._v(" "),t("p",[e._v("The Content Type Builder in Strapi streamlines the process of creating data structures and corresponding APIs, making it an ideal tool for developers looking to build and manage content-driven applications efficiently. Its user-friendly interface and customization options allow for a great degree of flexibility in defining the data model according to the specific needs of your application.")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/25.4b75e33e.js b/assets/js/25.4b75e33e.js new file mode 100644 index 00000000..714a291e --- /dev/null +++ b/assets/js/25.4b75e33e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{239:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return s})),e.d(n,"i",(function(){return u})),e.d(n,"f",(function(){return a})),e.d(n,"g",(function(){return l})),e.d(n,"h",(function(){return c})),e.d(n,"b",(function(){return f})),e.d(n,"e",(function(){return h})),e.d(n,"k",(function(){return p})),e.d(n,"l",(function(){return d})),e.d(n,"c",(function(){return b})),e.d(n,"j",(function(){return m}));e(90);const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,u=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function a(t){return u.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function f(t){if(a(t))return t;const n=t.match(r),e=n?n[0]:"",i=o(t);return s.test(i)?t:i+".html"+e}function h(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return o(t.path)===o(n)}function p(t,n,e){if(a(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return p(e,n,r);if(Array.isArray(n))return Object.assign(p(e,n[0],r),{title:n[1]});{const s=n.children||[];return 0===s.length&&n.path?Object.assign(p(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,initialOpenGroupIndex:n.initialOpenGroupIndex,children:s.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function g(t){const n=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function b(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},241:function(t,n,e){"use strict";e.r(n);var r=e(239),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(r.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(r.g)(this.link)||Object(r.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(r.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(r.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=e(14),u=Object(s.a)(i,(function(){var t=this,n=t._self._c;return t.isInternal?n("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(n){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?n("OutboundLink"):t._e()],1)}),[],!1,null,null,null);n.default=u.exports}}]); \ No newline at end of file diff --git a/assets/js/26.c3c8e865.js b/assets/js/26.c3c8e865.js new file mode 100644 index 00000000..91e5cfe6 --- /dev/null +++ b/assets/js/26.c3c8e865.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{296:function(t,e,a){t.exports=a.p+"assets/img/gitrebase.175e6a7f.png"},331:function(t,e,a){"use strict";a.r(e);var s=a(14),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"⚪️-git-and-github-への深い理解"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-git-and-github-への深い理解"}},[t._v("#")]),t._v(" ⚪️ git and github への深い理解")]),t._v(" "),e("p",[t._v("🔺 "),e("a",{attrs:{href:"https://chodocs.cn/memo/git-command/",target:"_blank",rel:"noopener noreferrer"}},[t._v("常用一些 Git 命令"),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"git-branch"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#git-branch"}},[t._v("#")]),t._v(" git branch")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout staging/name\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" pull origin staging/name "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Ensure you have the latest changes")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-b")]),t._v(" branch-name staging/name\n")])])]),e("h2",{attrs:{id:"git-rebase-fix-old-commit"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#git-rebase-fix-old-commit"}},[t._v("#")]),t._v(" "),e("code",[t._v("git rebase")]),t._v(" fix old commit")]),t._v(" "),e("p",[e("img",{attrs:{src:a(296),alt:"gitrebase"}})]),t._v(" "),e("ol",[e("li",[e("p",[e("code",[t._v("git rebase -i HEAD~ 2")])])]),t._v(" "),e("li",[e("p",[t._v("change the pick to edit "),e("code",[t._v("r")])])]),t._v(" "),e("li",[e("p",[e("code",[t._v("git commit --amend")])])]),t._v(" "),e("li",[e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("wq: "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("write")]),t._v(" and quit\nq"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(": quit without saving\ni: insert mode\n")])])])])]),t._v(" "),e("h2",{attrs:{id:"fix-the-most-recent-commit-message"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#fix-the-most-recent-commit-message"}},[t._v("#")]),t._v(" Fix the most recent commit message")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" commit "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--amend")]),t._v("\n")])])]),e("p",[t._v("🔺 ### Reference:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://juejin.cn/post/6986951160619859975?from=search-suggest",target:"_blank",rel:"noopener noreferrer"}},[t._v("git は pull のデフォルト設定をリベースするように変更する。"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://juejin.cn/post/6844903618177433613?from=search-suggest",target:"_blank",rel:"noopener noreferrer"}},[t._v(" git pull vs git pull --rebase "),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://juejin.cn/post/7062315341124698119",target:"_blank",rel:"noopener noreferrer"}},[t._v("より深い理解 git pull"),e("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/27.6c078df5.js b/assets/js/27.6c078df5.js new file mode 100644 index 00000000..7d0ed84e --- /dev/null +++ b/assets/js/27.6c078df5.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{314:function(t,n,s){"use strict";s.r(n);var e=s(14),o=Object(e.a)({},(function(){return(0,this._self._c)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/28.2212ab5e.js b/assets/js/28.2212ab5e.js new file mode 100644 index 00000000..ab7e158d --- /dev/null +++ b/assets/js/28.2212ab5e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{316:function(t,s,a){"use strict";a.r(s);var i=a(14),r=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"javascript-guide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#javascript-guide"}},[this._v("#")]),this._v(" Javascript guide")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/29.406b7de6.js b/assets/js/29.406b7de6.js new file mode 100644 index 00000000..976bc162 --- /dev/null +++ b/assets/js/29.406b7de6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{317:function(t,s,a){"use strict";a.r(s);var n=a(14),r=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"⚪️-【javascript-入門】-配列の使い方と操作まとめ-初期化・追加・結合・検索・削除"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-【javascript-入門】-配列の使い方と操作まとめ-初期化・追加・結合・検索・削除"}},[t._v("#")]),t._v(" ⚪️ 【JavaScript 入門】 配列の使い方と操作まとめ(初期化・追加・結合・検索・削除)")]),t._v(" "),s("h2",{attrs:{id:"🔶-【実践】「配列」の活用技"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔶-【実践】「配列」の活用技"}},[t._v("#")]),t._v(" 🔶 【実践】「配列」の活用技")]),t._v(" "),s("p",[t._v("当然可以。下面是一个表格,展示了各个 JavaScript 数组方法的功能、返回值、是否改变原数组以及它们被引入的 ECMAScript 版本。")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("顺序")]),t._v(" "),s("th",[t._v("方法名")]),t._v(" "),s("th",[t._v("功能")]),t._v(" "),s("th",[t._v("返回值")]),t._v(" "),s("th",[t._v("是否改变原数组")]),t._v(" "),s("th",[t._v("版本")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("1")]),t._v(" "),s("td",[s("code",[t._v("push()")])]),t._v(" "),s("td",[t._v("向数组添加一个或多个元素(在数组尾部)")]),t._v(" "),s("td",[t._v("新数组的长度")]),t._v(" "),s("td",[t._v("是")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("2")]),t._v(" "),s("td",[s("code",[t._v("unshift()")])]),t._v(" "),s("td",[t._v("向数组添加一个或多个元素(在数组头部)")]),t._v(" "),s("td",[t._v("新数组的长度")]),t._v(" "),s("td",[t._v("是")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("3")]),t._v(" "),s("td",[s("code",[t._v("pop()")])]),t._v(" "),s("td",[t._v("删除数组的最后一个元素")]),t._v(" "),s("td",[t._v("被删除的元素")]),t._v(" "),s("td",[t._v("是")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("4")]),t._v(" "),s("td",[s("code",[t._v("shift()")])]),t._v(" "),s("td",[t._v("删除数组的第一个元素")]),t._v(" "),s("td",[t._v("被删除的元素")]),t._v(" "),s("td",[t._v("是")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("5")]),t._v(" "),s("td",[s("code",[t._v("reverse()")])]),t._v(" "),s("td",[t._v("反转数组中的元素")]),t._v(" "),s("td",[t._v("反转后的数组")]),t._v(" "),s("td",[t._v("是")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("6")]),t._v(" "),s("td",[s("code",[t._v("sort()")])]),t._v(" "),s("td",[t._v("对数组进行排序(默认按字符串 Unicode 码点)")]),t._v(" "),s("td",[t._v("排序后的数组")]),t._v(" "),s("td",[t._v("是")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("7")]),t._v(" "),s("td",[s("code",[t._v("splice()")])]),t._v(" "),s("td",[t._v("在指定位置删除或添加元素(可用于数组的增删改)")]),t._v(" "),s("td",[t._v("被删除的元素组成的数组")]),t._v(" "),s("td",[t._v("是")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("8")]),t._v(" "),s("td",[s("code",[t._v("concat()")])]),t._v(" "),s("td",[t._v("合并多个数组,返回新数组")]),t._v(" "),s("td",[t._v("合并后的数组")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("9")]),t._v(" "),s("td",[s("code",[t._v("join()")])]),t._v(" "),s("td",[t._v("将数组元素用特定字符连接成字符串")]),t._v(" "),s("td",[t._v("拼接后的字符串")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("10")]),t._v(" "),s("td",[s("code",[t._v("slice()")])]),t._v(" "),s("td",[t._v("从数组中提取一段元素,返回新数组")]),t._v(" "),s("td",[t._v("提取的元素组成的新数组")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("11")]),t._v(" "),s("td",[s("code",[t._v("toString()")])]),t._v(" "),s("td",[t._v("将数组转换为字符串")]),t._v(" "),s("td",[t._v("字符串表示的数组")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("12")]),t._v(" "),s("td",[s("code",[t._v("valueOf()")])]),t._v(" "),s("td",[t._v("返回数组的原始值")]),t._v(" "),s("td",[t._v("数组的原始值")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("13")]),t._v(" "),s("td",[s("code",[t._v("indexOf()")])]),t._v(" "),s("td",[t._v("查询数组中某元素首次出现的位置")]),t._v(" "),s("td",[t._v("元素位置,若不存在则返回-1")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("14")]),t._v(" "),s("td",[s("code",[t._v("lastIndexOf()")])]),t._v(" "),s("td",[t._v("反向查询数组中某元素首次出现的位置")]),t._v(" "),s("td",[t._v("元素位置,若不存在则返回-1")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("15")]),t._v(" "),s("td",[s("code",[t._v("forEach()")])]),t._v(" "),s("td",[t._v("遍历数组,对每个元素执行回调函数")]),t._v(" "),s("td",[t._v("无("),s("code",[t._v("undefined")]),t._v(")")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("16")]),t._v(" "),s("td",[s("code",[t._v("map()")])]),t._v(" "),s("td",[t._v("遍历数组,使用回调函数处理每个元素,并返回新数组")]),t._v(" "),s("td",[t._v("新数组")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("17")]),t._v(" "),s("td",[s("code",[t._v("filter()")])]),t._v(" "),s("td",[t._v("遍历数组,筛选符合条件的元素,返回新数组")]),t._v(" "),s("td",[t._v("符合条件的元素组成的新数组")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("18")]),t._v(" "),s("td",[s("code",[t._v("every()")])]),t._v(" "),s("td",[t._v("检测数组所有元素是否都满足条件")]),t._v(" "),s("td",[t._v("所有元素满足返回"),s("code",[t._v("true")]),t._v(",否则"),s("code",[t._v("false")])]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("19")]),t._v(" "),s("td",[s("code",[t._v("some()")])]),t._v(" "),s("td",[t._v("检测数组中是否存在满足条件的元素")]),t._v(" "),s("td",[t._v("存在满足条件的元素返回"),s("code",[t._v("true")]),t._v(",否则"),s("code",[t._v("false")])]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("20")]),t._v(" "),s("td",[s("code",[t._v("reduce()")])]),t._v(" "),s("td",[t._v("从左到右应用一个函数对数组元素进行累计/归约")]),t._v(" "),s("td",[t._v("操作结果")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("21")]),t._v(" "),s("td",[s("code",[t._v("reduceRight()")])]),t._v(" "),s("td",[t._v("从右到左应用一个函数对数组元素进行累计/归约")]),t._v(" "),s("td",[t._v("操作结果")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("ES5-")])]),t._v(" "),s("tr",[s("td",[t._v("22")]),t._v(" "),s("td",[s("code",[t._v("includes()")])]),t._v(" "),s("td"),t._v(" "),s("td"),t._v(" "),s("td"),t._v(" "),s("td")])])]),t._v(" "),s("p",[t._v("判断数组是否包含特定值 | 包含则返回"),s("code",[t._v("true")]),t._v(",否则"),s("code",[t._v("false")]),t._v(" | 否 | ES6 |\n| 23 | "),s("code",[t._v("Array.from()")]),t._v(" | 从类数组或可迭代对象创建新数组 | 新数组 | 否 | ES6 |\n| 24 | "),s("code",[t._v("find()")]),t._v(" | 查找数组中满足条件的第一个元素 | 满足条件的元素,否则"),s("code",[t._v("undefined")]),t._v(" | 否 | ES6 |\n| 25 | "),s("code",[t._v("findIndex()")]),t._v(" | 查找数组中满足条件元素的索引 | 满足条件元素的索引,否则-1 | 否 | ES6 |\n| 26 | "),s("code",[t._v("fill()")]),t._v(" | 使用给定值填充数组 | 填充后的数组 | 是 | ES6 |\n| 27 | "),s("code",[t._v("flat()")]),t._v(' | 将嵌套数组"拉平"成一维数组 | 新数组 | 否 | ES6 |\n| 28 | '),s("code",[t._v("flatMap()")]),t._v(" | 先映射每个元素,然后将结果压平成一维数组 | 新数组 | 否 | ES6 |")]),t._v(" "),s("h2",{attrs:{id:"🔶-方法详解"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔶-方法详解"}},[t._v("#")]),t._v(" 🔶 方法详解")]),t._v(" "),s("h3",{attrs:{id:"🔸-1-push"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-1-push"}},[t._v("#")]),t._v(" 🔸 1. "),s("code",[t._v("push()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:在数组最后一位添加一个或多个元素,并返回新数组的长度。会改变原数组。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" arr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" rel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// [1, 2, "c", "A", "B"]')]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 5 (数组长度)")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-2-unshift"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-2-unshift"}},[t._v("#")]),t._v(" 🔸 2. "),s("code",[t._v("unshift()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:在数组第一位添加一个或多个元素,并返回新数组的长度。会改变原数组。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" arr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" rel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unshift")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// ["A", "B", 1, 2, "c"]')]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 5 (数组长度)")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-3-pop"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-3-pop"}},[t._v("#")]),t._v(" 🔸 3. "),s("code",[t._v("pop()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:删除数组的最后一个元素,并返回被删除的元素。会改变原数组。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" arr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" rel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pop")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// [1, 2]")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// c")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-4-shift"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-4-shift"}},[t._v("#")]),t._v(" 🔸 4. "),s("code",[t._v("shift()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:删除数组的第一个元素,并返回被删除的元素。会改变原数组。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" arr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" rel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("shift")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// ["b", "c"]')]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// a")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-5-reverse"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-5-reverse"}},[t._v("#")]),t._v(" 🔸 5. "),s("code",[t._v("reverse()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:反转数组中的元素。会改变原数组。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" arr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" rel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reverse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// ["c", "b", "a", 3, 2, 1]')]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// ["c", "b", "a", 3, 2, 1]')]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-6-sort"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-6-sort"}},[t._v("#")]),t._v(" 🔸 6. "),s("code",[t._v("sort()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:对数组的元素进行排序。默认排序顺序是根据字符串 Unicode 码点。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" arr1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\narr1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sort")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 默认排序结果")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 使用自定义排序函数")]),t._v("\narr1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sort")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 从小到大排序")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-7-splice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-7-splice"}},[t._v("#")]),t._v(" 🔸 7. "),s("code",[t._v("splice()")])]),t._v(" "),s("h4",{attrs:{id:"功能"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#功能"}},[t._v("#")]),t._v(" 功能:")]),t._v(" "),s("ul",[s("li",[t._v("在指定位置添加或删除数组中的元素,或替换数组中的元素。会改变原数组。")]),t._v(" "),s("li",[s("code",[t._v("splice")]),t._v(" 方法可以用于数组的增删改操作。")]),t._v(" "),s("li",[s("code",[t._v("splice")]),t._v(" 方法的第一个参数是修改的起始位置(索引),第二个参数是删除的个数(如果是 0,则表示不删除元素),后面的参数是要添加进数组的元素。")])]),t._v(" "),s("h4",{attrs:{id:"语法"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#语法"}},[t._v("#")]),t._v(" 语法:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("array.splice(start[, deleteCount[, item1[, item2[, ...]]]])")])]),t._v(" "),s("li",[s("code",[t._v("start")]),t._v(":指定修改的开始位置(从 0 计数)。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位(从-1 计数,这意味着-n 是倒数第 n 个元素并且等价于 array.length-n),如果负数的绝对值大于数组的长度,则表示开始位置为第 0 位。")]),t._v(" "),s("li",[s("code",[t._v("deleteCount")]),t._v(":整数,表示要移除的数组元素的个数。如果"),s("code",[t._v("deleteCount")]),t._v("大于"),s("code",[t._v("start")]),t._v("之后的元素的总数,则从"),s("code",[t._v("start")]),t._v("后面的元素都将被删除(含第"),s("code",[t._v("start")]),t._v("位)。")]),t._v(" "),s("li",[s("code",[t._v("item1, item2, ...")]),t._v(":要添加进数组的元素,从"),s("code",[t._v("start")]),t._v("位置开始。如果不指定,则只删除数组元素。")]),t._v(" "),s("li",[t._v("返回值:由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。")]),t._v(" "),s("li",[t._v("注意:"),s("code",[t._v("splice")]),t._v(" 方法会改变原始数组。")])]),t._v(" "),s("h4",{attrs:{id:"示例"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#示例"}},[t._v("#")]),t._v(" 示例:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" arr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" rel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("splice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"add1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"add2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 修改后的数组")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 被删除的元素组成的数组")]),t._v("\n")])])]),s("h4",{attrs:{id:"使用場景"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#使用場景"}},[t._v("#")]),t._v(" 使用場景:")]),t._v(" "),s("p",[t._v("在 React 中,通常推荐使用不可变数据模式来更新状态,尤其是当处理数组和对象时。"),s("code",[t._v("splice")]),t._v(" 方法会直接修改原数组,这可能导致 React 的状态更新行为表现得不如预期。")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("remove")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" newGoods "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("goods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n newGoods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("splice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 删除 splice 方法, 会改变原数组, 返回被删除的元素")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setGoods")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newGoods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("在 "),s("code",[t._v("newGoods.splice(index, 1);")]),t._v(" 这行代码中,"),s("code",[t._v("splice")]),t._v(" 被用于从 "),s("code",[t._v("newGoods")]),t._v(" 数组中移除特定索引的元素。尽管这里使用了 "),s("code",[t._v("newGoods")]),t._v(" 作为 "),s("code",[t._v("goods")]),t._v(" 数组的副本,但由于数组是引用类型,在使用 "),s("code",[t._v("splice")]),t._v(" 之前,应该创建 "),s("code",[t._v("goods")]),t._v(" 的深拷贝。")]),t._v(" "),s("h3",{attrs:{id:"为什么需要深拷贝"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#为什么需要深拷贝"}},[t._v("#")]),t._v(" 为什么需要深拷贝?")]),t._v(" "),s("p",[t._v("当你使用 "),s("code",[t._v("newGoods = [...goods]")]),t._v(" 这样的语句时,实际上创建的是原数组的浅拷贝。这意味着 "),s("code",[t._v("newGoods")]),t._v(" 和 "),s("code",[t._v("goods")]),t._v(" 都指向相同的元素对象。当你在 "),s("code",[t._v("newGoods")]),t._v(" 上使用 "),s("code",[t._v("splice")]),t._v(" 时,虽然 "),s("code",[t._v("goods")]),t._v(" 数组本身没有被直接修改,但数组中的对象可能会受到影响,这可能导致 React 的不预期行为。")]),t._v(" "),s("h3",{attrs:{id:"正确的做法"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#正确的做法"}},[t._v("#")]),t._v(" 正确的做法")]),t._v(" "),s("p",[t._v("为了避免这种问题,可以使用不会改变原数组的方法来处理数组。例如,可以使用 "),s("code",[t._v("filter")]),t._v(" 方法来创建一个不包含特定索引元素的新数组,而不是使用 "),s("code",[t._v("splice")]),t._v("。")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("remove")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("index")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" newGoods "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" goods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!==")]),t._v(" index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setGoods")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newGoods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("在这个修改后的 "),s("code",[t._v("remove")]),t._v(" 函数中,"),s("code",[t._v("filter")]),t._v(" 方法被用来创建一个新的数组,其中不包含指定索引的元素。这种方法不会修改原数组,符合 React 的不可变数据原则,能够确保状态更新的可预测性。")]),t._v(" "),s("h3",{attrs:{id:"🔸-8-concat"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-8-concat"}},[t._v("#")]),t._v(" 🔸 8. "),s("code",[t._v("concat()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:连接两个或更多数组,并返回结果。不改变原数组。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" arr1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" arr2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" rel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("concat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 合并后的数组")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-9-join"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-9-join"}},[t._v("#")]),t._v(" 🔸 9. "),s("code",[t._v("join()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:将数组的所有元素连接成一个字符串。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"d"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("join")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "a-b-c-d"')]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-10-slice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-10-slice"}},[t._v("#")]),t._v(" 🔸 10. "),s("code",[t._v("slice()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:返回数组的一个片段或子数组。不改变原数组。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"d"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// ["b", "c"]')]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-11-tostring"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-11-tostring"}},[t._v("#")]),t._v(" 🔸 11. "),s("code",[t._v("toString()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:将数组转换为字符串。不改变原数组。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"d"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" rel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "a,b,c,d"')]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-12-valueof"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-12-valueof"}},[t._v("#")]),t._v(" 🔸 12. "),s("code",[t._v("valueOf()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:返回数组的原始值。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" rel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("valueOf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// [1, 2, 3, 4]")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-13-indexof"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-13-indexof"}},[t._v("#")]),t._v(" 🔸 13. "),s("code",[t._v("indexOf()")])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("功能:返回指定元素在数组中"),s("strong",[t._v("首次")]),t._v("出现的索引。不存在则返回-1。")])]),t._v(" "),s("li",[s("p",[t._v("示例:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" index "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("indexOf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 3")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-14-lastindexof"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-14-lastindexof"}},[t._v("#")]),t._v(" 🔸 14. "),s("code",[t._v("lastIndexOf()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:返回指定元素在数组中最后一次出现的索引。不存在则返回-1。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" index "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("lastIndexOf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 3")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-15-foreach"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-15-foreach"}},[t._v("#")]),t._v(" 🔸 15. "),s("code",[t._v("forEach()")])]),t._v(" "),s("h4",{attrs:{id:"功能-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#功能-2"}},[t._v("#")]),t._v(" 功能:")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("对数组的每个元素执行一次提供的函数, "),s("em",[t._v("不改变原数组")])]),t._v(" "),s("ul",[s("li",[s("code",[t._v("forEach")]),t._v(" cannot directly handle asynchronous operations with "),s("code",[t._v("await")]),t._v(".("),s("code",[t._v("forEach")]),t._v(" `doesn't wait for promises to resolve before moving on to the next iteration.)")])])]),t._v(" "),s("li",[s("p",[t._v("forEach()方法需要一个回调函数(这种函数,是由我们创建但是不由我们调用的)作为参数")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[t._v("arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("li",[s("p",[t._v("回调函数中传递三个参数:")]),t._v(" "),s("ul",[s("li",[t._v("第一个参数,就是当前正在遍历的元素")]),t._v(" "),s("li",[t._v("第二个参数,就是当前正在遍历的元素的索引")]),t._v(" "),s("li",[t._v("第三个参数,就是正在遍历的数组")])])]),t._v(" "),s("li",[s("p",[s("code",[t._v("forEach")]),t._v("本身是没有中断机制的。内部是遍历执行回调的。")]),t._v(" "),s("ul",[s("li",[t._v("在回调中增加判断条件,满足条件就抛出异常。(通常是不建议这么跳出循环的)")]),t._v(" "),s("li",[t._v("使用 "),s("code",[t._v("for(let item in arr) {}")]),t._v("这样的遍历方式,可以提前跳出循环")]),t._v(" "),s("li",[t._v("使用"),s("code",[t._v(".some")]),t._v(" 方法,一些场景判断,满足条件可以提前结束")])])])]),t._v(" "),s("h4",{attrs:{id:"示例-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#示例-2"}},[t._v("#")]),t._v(" 示例:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//基本for 循環支持 await, 但是效率會很低.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetaData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" arrs "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("length")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" index "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" datas "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" arrs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("https://jsonplaceholder.typicode.com/todos/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("arrs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("res")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("res")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n datas"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" datas"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetaData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("res")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"使用場景-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#使用場景-2"}},[t._v("#")]),t._v(" 使用場景:")]),t._v(" "),s("p",[t._v("当您需要对数组中的每个元素执行异步操作,例如逐个上传图片,但不需要收集这些异步操作的返回值时,您可以使用 "),s("code",[t._v("forEach")]),t._v(" 方法结合 "),s("code",[t._v("async/await")]),t._v("。请注意,虽然 "),s("code",[t._v("forEach")]),t._v(" 不能直接处理 "),s("code",[t._v("await")]),t._v(",但您可以在 "),s("code",[t._v("forEach")]),t._v(" 的回调函数中定义一个立即执行的异步函数来实现这一点。")]),t._v(" "),s("p",[t._v("以下是一个例子,演示了如何使用 "),s("code",[t._v("forEach")]),t._v(" 方法逐个上传图片:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("uploadImage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("image")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 这里是一个假设的上传函数,实际情况下应替换为实际的上传逻辑")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 假设这个函数返回一个 Promise")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.com/upload"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" image"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("uploadImages")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("images")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n images"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("image")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("uploadImage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("image"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Image uploaded:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error uploading image:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 假设这个数组包含了要上传的图片")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" imageArray "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"image1.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"image2.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"image3.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("uploadImages")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("imageArray"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("在这个例子中:")]),t._v(" "),s("ol",[s("li",[s("code",[t._v("uploadImage")]),t._v(" 函数是一个异步函数,用于上传单个图片,并返回一个 Promise 对象。")]),t._v(" "),s("li",[s("code",[t._v("uploadImages")]),t._v(" 函数接受一个图片数组,使用 "),s("code",[t._v("forEach")]),t._v(" 遍历这个数组。")]),t._v(" "),s("li",[t._v("在 "),s("code",[t._v("forEach")]),t._v(" 的回调函数中,我们定义了一个立即执行的异步函数来处理图片上传。")]),t._v(" "),s("li",[t._v("每个图片上传的结果将会被打印出来,但整个 "),s("code",[t._v("uploadImages")]),t._v(" 函数本身不会返回任何结果。")])]),t._v(" "),s("p",[t._v("请注意,由于 "),s("code",[t._v("forEach")]),t._v(" 并不等待异步操作完成,所有的上传操作将会几乎同时开始,这可能会对服务器造成压力。如果需要控制上传速度,比如一次只上传一个图片,您可能需要使用基本的 "),s("code",[t._v("for")]),t._v(" 循环或其他方法来顺序执行异步操作。")]),t._v(" "),s("h4",{attrs:{id:"其他可能場景"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#其他可能場景"}},[t._v("#")]),t._v(" 其他可能場景:")]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("处理菜单项")]),t._v(":")]),t._v(" "),s("ul",[s("li",[t._v("如果您有一个菜单项数组,您可能需要使用 "),s("code",[t._v("forEach")]),t._v(" 来遍历每个菜单项,以生成展示在网页上的菜单列表。")]),t._v(" "),s("li",[t._v("对于每个菜单项,可能还需要根据特定属性(如类别、价格区间、是否为素食等)进行进一步处理或分类。")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("处理顾客评论")]),t._v(":")]),t._v(" "),s("ul",[s("li",[t._v("如果您的网站有顾客评论功能,您可以使用 "),s("code",[t._v("forEach")]),t._v(" 遍历评论数组,展示每个顾客的评分和评论。")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("订单处理")]),t._v(":")]),t._v(" "),s("ul",[s("li",[t._v("在订单确认页面,您可能需要遍历订单中的每个项目,计算总价或应用折扣。")]),t._v(" "),s("li",[t._v("如果需要将订单中的每个项目发送到后端处理(如库存检查、订单入库等),也可以使用 "),s("code",[t._v("forEach")]),t._v("。")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("图片或媒体内容展示")]),t._v(":")]),t._v(" "),s("ul",[s("li",[t._v("如果餐厅网站有图库展示餐厅内部、菜品等,您可以使用 "),s("code",[t._v("forEach")]),t._v(" 来遍历图片数组,为每张图片创建相应的 HTML 元素。")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("员工管理")]),t._v(":")]),t._v(" "),s("ul",[s("li",[t._v("在员工管理界面,"),s("code",[t._v("forEach")]),t._v(" 可用于遍历员工列表,显示员工信息,或进行特定操作,如计算工资、安排班次等。")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("库存管理")]),t._v(":")]),t._v(" "),s("ul",[s("li",[t._v("对于库存管理,"),s("code",[t._v("forEach")]),t._v(" 可以用于遍历库存列表,更新库存状态或进行库存预警。")])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("特殊活动或促销信息展示")]),t._v(":")]),t._v(" "),s("ul",[s("li",[t._v("如果餐厅有特殊活动或促销,您可以使用 "),s("code",[t._v("forEach")]),t._v(" 遍历活动数组,动态生成展示这些活动的界面元素。")])])])]),t._v(" "),s("p",[t._v("在这些场景中,"),s("code",[t._v("forEach")]),t._v(" 循环提供了一种简洁的方式来处理数组中的每个元素,尤其是当您不需要返回新数组时。这有助于编写更加清晰和可维护的代码。")]),t._v(" "),s("hr"),t._v(" "),s("h3",{attrs:{id:"🔸-16-map"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-16-map"}},[t._v("#")]),t._v(" 🔸 16. "),s("code",[t._v("map()")])]),t._v(" "),s("h4",{attrs:{id:"功能-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#功能-3"}},[t._v("#")]),t._v(" 功能:")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("數組原型是一個函數,對數組遍歷"),s("strong",[t._v("不破壞原數組")]),t._v(", 返回一個新數組, "),s("strong",[t._v("按照原是數組元素順序依次執行給定的函數")]),t._v(", 並將每一次函數執行的結果"),s("strong",[t._v("作為新數組的元素返回")])])]),t._v(" "),s("li",[s("p",[s("code",[t._v("map")]),t._v(" 方法会遍历数组中的每个元素,并使用回调函数处理每个元素,最终返回一个新数组。")])]),t._v(" "),s("li",[s("p",[t._v("參數: "),s("code",[t._v("map")]),t._v(" 方法的回调函数接受三个参数:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("element")]),t._v(":就是当前正在遍历的元素")]),t._v(" "),s("li",[s("code",[t._v("index")]),t._v(", 就是当前正在遍历的元素的索引")]),t._v(" "),s("li",[s("code",[t._v("array")]),t._v(",就是正在遍历的数组, 調用了 map()的數組本身")])])]),t._v(" "),s("li",[s("p",[t._v("語法:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("arr.map(callback(currentValue[, index[, array]])[, thisArg])")])]),t._v(" "),s("li",[s("code",[t._v("arr.map(callback(currentValue[, index[, array]])")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("thisArg")]),t._v(" 可选参数。执行 "),s("code",[t._v("callback")]),t._v(" 函数时使用的 "),s("code",[t._v("this")]),t._v(" 值。")])])])])])]),t._v(" "),s("h4",{attrs:{id:"示例-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#示例-3"}},[t._v("#")]),t._v(" 示例:")]),t._v(" "),s("ol",[s("li",[t._v("将数组中的每个对象都添加一个新属性,并设置为相同的值。")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" users "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Alice"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Bob"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Charlie"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" updatedUsers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" users"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("user")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("user"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("isActive")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("updatedUsers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// [{ name: "Alice", isActive: true }, { name: "Bob", isActive: true }, { name: "Charlie", isActive: true }]')]),t._v("\n")])])]),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" numbers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" doubled"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" numbers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[t._v("從數組對象裡提取特定屬性")])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("User")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" users"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" User"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Alice"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Bob"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Charlie"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" names"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" users"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("user"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" User"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" user"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[t._v("将字符串数组转换为对象数组")])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" fruits"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"banana"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cherry"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FruitObject")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" fruitObjects"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" FruitObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fruits"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fruit"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" fruit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fruitObjects"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// [{ name: "apple" }, { name: "banana" }, { name: "cherry" }]')]),t._v("\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[t._v("对象数组中的数字属性进行转换")])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Product")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" products"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Book'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Pen'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Pencil'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" discountedProducts"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" products"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\nprice"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("price \\"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"使用場景-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#使用場景-3"}},[t._v("#")]),t._v(" 使用場景:")]),t._v(" "),s("p",[t._v("在 TypeScript 结合 React 开发的外卖应用(Web Restaurant App)中,使用"),s("code",[t._v(".map")]),t._v("方法来渲染列表是非常常见的。这里我将提供一些示例,展示如何在 TypeScript 环境下使用"),s("code",[t._v(".map")]),t._v("方法处理和渲染餐厅应用中的数据。")]),t._v(" "),s("ol",[s("li",[t._v("渲染菜单列表: 假设你有一个菜单项的数组,你想渲染这些菜单项到页面上。")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MenuItem")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n description"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" menuItems"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" MenuItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Burger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.99")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" description"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"A classic burger"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pizza"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.99")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" description"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cheesy pizza"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// more menu items...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" MenuList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("FC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("menuItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h3"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" $"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("price"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h3"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("description"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[t._v("订单详情: 在订单详情页,你可能需要列出用户所选的菜品及其价格。")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OrderItem")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n quantity"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" orderItems"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" OrderItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 假设这些数据是用户选择的菜品")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" OrderDetails"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("FC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ul"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("orderItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("li key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" x "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("quantity"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" $"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("quantity "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("price"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("li"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("ul"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[t._v("评分和评论, 显示用户对菜品的评分和评论。")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Review")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n user"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n rating"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n comment"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" reviews"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Review"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 用户评论数据")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ReviewsList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("FC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("reviews"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("review"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("review"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h4"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("review"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("user"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h4"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Rating"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("review"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rating"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("review"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("comment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[t._v("如果你需要同时处理多个异步操作并等待它们全部完成,你可以使用 "),s("code",[t._v("Promise.all")]),t._v(" 结合 "),s("code",[t._v("map")]),t._v(" 方法,而不是 "),s("code",[t._v("forEach")]),t._v("。当您需要同时处理多个异步操作并等待它们全部完成时,可以使用 "),s("code",[t._v("Promise.all")]),t._v(" 结合 "),s("code",[t._v("map")]),t._v(" 方法。这种方法特别适用于需要并行执行多个异步请求并等待所有请求完成的情况。")])]),t._v(" "),s("p",[t._v("示例:并行获取多个资源: 假设您有一个 URL 数组,您需要从每个 URL 获取数据。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" urls"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://api.example.com/data1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://api.example.com/data2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://api.example.com/data3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 更多URLs...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 定义一个异步函数来获取每个URL的数据")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetchData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Promise")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 使用Promise.all和map来并行获取所有数据")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAllData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" allData "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Promise")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("all")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("urls"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetchData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("allData"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 打印所有获取到的数据")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error fetching data:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAllData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("在这个示例中,"),s("code",[t._v("urls.map(url => fetchData(url))")]),t._v(" 会为每个 URL 创建一个 fetch 请求的 Promise。然后,"),s("code",[t._v("Promise.all")]),t._v(" 接收这个 Promise 数组,并等待所有的 fetch 请求都完成。一旦所有请求完成,"),s("code",[t._v("allData")]),t._v(" 变量将包含所有 URL 返回的数据。如果任何一个请求失败,"),s("code",[t._v("catch")]),t._v(" 块将捕获错误。")]),t._v(" "),s("p",[t._v("注意事项:")]),t._v(" "),s("ul",[s("li",[t._v("当使用 "),s("code",[t._v("Promise.all")]),t._v(" 时,如果任何一个 Promise 失败,整个 "),s("code",[t._v("Promise.all")]),t._v(" 调用会立即失败。这意味着如果您有多个请求,一个请求失败,其他成功的请求的结果也会被丢弃。如果您需要不同的行为(例如,处理每个请求的单独成功或失败),您可能需要考虑使用 "),s("code",[t._v("Promise.allSettled")]),t._v(" 或单独处理每个 Promise 的错误。")]),t._v(" "),s("li",[t._v("使用 "),s("code",[t._v("Promise.all")]),t._v(" 可以显著提高性能,因为它允许异步操作并行执行,而不是按顺序一个接一个执行。\n当然可以。在 TypeScript 和 React 结合使用的场景中,我们可以遇到更复杂的使用 "),s("code",[t._v("map")]),t._v(" 方法的例子,特别是在处理嵌套数据结构或进行更高级的数据转换时。以下是一些复杂的使用场景示例:")])]),t._v(" "),s("ol",{attrs:{start:"5"}},[s("li",[t._v("渲染嵌套评论")])]),t._v(" "),s("p",[t._v("假设你有一个嵌套评论的数据结构,你需要递归地渲染每个评论及其子评论。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Comment")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n text"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n user"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n replies"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Comment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" comments"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Comment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 假设的评论数据,每个评论可能有回复(也是Comment类型)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" renderComments "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("comments"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Comment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSX")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Element"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" comments"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("comment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("comment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h4"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("comment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("user"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h4"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("comment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("text"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("comment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("replies "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div className"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"replies"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("renderComments")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("comment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("replies"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" CommentsList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("FC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("renderComments")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("comments"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"6"}},[s("li",[t._v("动态生成表格列")])]),t._v(" "),s("p",[t._v("在一个数据驱动的应用中,你可能需要根据数据对象的属性动态生成表格列。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Product")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n stock"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" products"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 产品数据")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ProductTable"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("FC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("table"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("thead"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("tr"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("keys")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("products"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("th key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toUpperCase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("th"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("tr"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("thead"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("tbody"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("products"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("tr key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("values")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("td key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("td"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("tr"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("tbody"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("table"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"7"}},[s("li",[t._v("使用 "),s("code",[t._v("map")]),t._v(" 处理 TypeScript 枚举")])]),t._v(" "),s("p",[t._v("当你有一个 TypeScript 枚举,并希望基于枚举的值生成一组元素时。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),t._v(" OrderStatus "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Pending "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pending"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n InProgress "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"in_progress"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Completed "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"completed"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Cancelled "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cancelled"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" StatusSelector"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("FC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("select"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("values")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("OrderStatus"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("option key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("option"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("select"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"8"}},[s("li",[t._v("使用 "),s("code",[t._v("Promise.all")]),t._v(" 与类型保护")])]),t._v(" "),s("p",[t._v("在处理多个异步请求时,你可能还需要进行类型保护,以确保每个响应都符合预期的类型。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ApiResponse")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" DataResponse "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" ErrorResponse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DataResponse")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n status"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ok"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ErrorResponse")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n status"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"error"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n message"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" fetchData "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Promise")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ApiResponse"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" status"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ok"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" status"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"error"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" message"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAllData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("urls"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" responses "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Promise")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("all")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("urls"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fetchData"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n responses"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ok"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Data:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("在这个示例中,"),s("code",[t._v("ApiResponse")]),t._v(" 类型是一个联合类型,包括 "),s("code",[t._v("DataResponse")]),t._v(" 和 "),s("code",[t._v("ErrorResponse")]),t._v("。当处理 "),s("code",[t._v("Promise.all")]),t._v(" 的结果时,使用类型保护来确定每个响应是成功的数据响应还是错误响应。")]),t._v(" "),s("p",[t._v("这些例子展示了在更复杂的场景中使用 "),s("code",[t._v(".map")]),t._v(" 方法的多样性,尤其是在 TypeScript 环境中处理类型安全和异步操作时。")]),t._v(" "),s("hr"),t._v(" "),s("h3",{attrs:{id:"🔸-17-filter"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-17-filter"}},[t._v("#")]),t._v(" 🔸 17. "),s("code",[t._v("filter()")])]),t._v(" "),s("h4",{attrs:{id:"功能-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#功能-4"}},[t._v("#")]),t._v(" 功能:")]),t._v(" "),s("ul",[s("li",[s("p",[s("code",[t._v("filter")]),t._v(" 方法会遍历数组中的每个元素,并使用回调函数处理每个元素,最终返回一个新数组。")])]),t._v(" "),s("li",[s("p",[t._v("在回调函数中,返回值为 "),s("code",[t._v("true")]),t._v(" 的元素将会被保留,返回值为 "),s("code",[t._v("false")]),t._v(" 的元素将会被过滤掉。")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("filter")]),t._v(" 方法不会改变原数组。")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("filter")]),t._v(" 方法的回调函数接受三个参数:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("element")]),t._v(":就是当前正在遍历的元素")]),t._v(" "),s("li",[s("code",[t._v("index")]),t._v(", 就是当前正在遍历的元素的索引")]),t._v(" "),s("li",[s("code",[t._v("array")]),t._v(",就是正在遍历的数组, 調用了 filter()的數組本身")]),t._v(" "),s("li",[s("code",[t._v("thisArg")]),t._v(" 可选参数。执行 "),s("code",[t._v("callback")]),t._v(" 函数时使用的 "),s("code",[t._v("this")]),t._v(" 值。")])])]),t._v(" "),s("li",[s("p",[t._v("語法:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("arr.filter(callback(currentValue[, index[, array]])[, thisArg])")])]),t._v(" "),s("li",[s("code",[t._v("arr.filter(callback(currentValue[, index[, array]])")])])])])]),t._v(" "),s("h4",{attrs:{id:"示例-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#示例-4"}},[t._v("#")]),t._v(" 示例:")]),t._v(" "),s("p",[t._v("当然可以。下面是一些使用 "),s("code",[t._v("filter")]),t._v(" 方法的 TypeScript 示例,包括处理数组对象,并在某些情况下利用索引。")]),t._v(" "),s("ol",[s("li",[t._v("过滤特定条件的对象")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Product")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n inStock"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" products"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" inStock"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Banana"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" inStock"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cherry"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" inStock"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 过滤出库存中的产品")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" inStockProducts"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" products"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("inStock\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[t._v("使用索引过滤")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 只保留偶数索引的元素")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" filteredData"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" index "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[t._v("结合对象和索引过滤")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("User")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" users"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" User"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Alice"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Bob"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Carol"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 过滤出年龄大于25的用户,并且只保留偶数索引的用户")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" selectedUsers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" User"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" users"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("user"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" user"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("age "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" index "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[t._v("移除数组中的重复元素")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" numbers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" uniqueNumbers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" numbers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("indexOf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" index\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"5"}},[s("li",[t._v("根据多个条件过滤")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Book")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n title"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n author"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n year"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" books"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Book"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1984"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" author"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"George Orwell"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" year"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1949")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n title"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"The Great Gatsby"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n author"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"F. Scott Fitzgerald"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n year"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1925")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Brave New World"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" author"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Aldous Huxley"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" year"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1932")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 过滤出在1930年之后出版的书籍,并且作者为 "Aldous Huxley"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" filteredBooks"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Book"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" books"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("book"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" book"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("year "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1930")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" book"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("author "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Aldous Huxley"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"6"}},[s("li",[s("code",[t._v("map")]),t._v(" 和"),s("code",[t._v("filter")]),t._v(" 鏈式調用,數組對象裡提取特定屬性")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("User")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" users"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" User"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Alice"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Bob"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Bob"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Charlie"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" newUsers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" users\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" isMember"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newUsers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// [{ id: 1, name: "Alice", isMember: true }, { id: 2, name: "Bob", isMember: true }, { id: 3, name: "Charlie", isMember: true }]')]),t._v("\n")])])]),s("h4",{attrs:{id:"其他使用場景"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#其他使用場景"}},[t._v("#")]),t._v(" 其他使用場景:")]),t._v(" "),s("p",[t._v("在一个复杂的餐厅程序中,我们可以设想几个更复杂的 "),s("code",[t._v("filter")]),t._v(" 使用场景,这些场景涉及多条件筛选、嵌套数据结构以及和其他数组方法的结合使用。以下是一些 TypeScript 示例:")]),t._v(" "),s("ol",[s("li",[t._v("根据多个条件筛选菜单项")])]),t._v(" "),s("p",[t._v("假设你的餐厅应用需要根据多个条件(如价格范围、食物类型、客户评分)筛选菜单项。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MenuItem")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"starter"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"main"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dessert"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n averageRating"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" menuItems"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" MenuItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 菜单项数据...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" filterCriteria "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"main"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n priceRange"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" min"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" max"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n minRating"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" filteredMenuItems "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" menuItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" filterCriteria"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v("\n item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("price "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" filterCriteria"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("priceRange"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("min "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v("\n item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("price "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" filterCriteria"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("priceRange"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("max "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v("\n item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("averageRating "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" filterCriteria"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("minRating\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",[s("li",[t._v("筛选包含特定配料的菜品及其变体")])]),t._v(" "),s("p",[t._v("考虑一个复杂的场景,其中菜品可能有多个变体(如不同的调味方式或配料)。你需要找到包含或排除特定配料的所有菜品及其变体。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MenuItemVariant")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n variantId"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n ingredients"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MenuItem")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n variants"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" MenuItemVariant"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" menuItems"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" MenuItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 菜单项及变体数据...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ingredientFilter "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cheese"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemsWithIngredient "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" menuItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("variants"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("variant"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n variant"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ingredients"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("includes")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ingredientFilter"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[t._v("结合 "),s("code",[t._v("filter")]),t._v(" 和 "),s("code",[t._v("map")]),t._v(" 筛选并转换数据")])]),t._v(" "),s("p",[t._v("在某些情况下,你可能需要先筛选出符合条件的数据,然后转换这些数据以用于显示。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" menuItemsWithRatings"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" MenuItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 含评分的菜单项数据...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" highRatedDishes "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" menuItemsWithRatings\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("averageRating "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n rating"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("averageRating"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n priceRange"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("price "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"High"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Medium"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[t._v("复杂订单过滤")])]),t._v(" "),s("p",[t._v("考虑到餐厅可能需要处理大量的订单数据,你可能需要根据订单的多个属性来筛选它们,如订单状态、金额、下单时间等。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Order")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n totalAmount"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n status"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"new"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"processing"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"delivered"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cancelled"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n orderDate"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Date"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" orders"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 订单数据...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" filteredOrders "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" orders"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"delivered"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v("\n order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("totalAmount "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v("\n order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("orderDate "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Date")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-01-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"🔸-18-every"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-18-every"}},[t._v("#")]),t._v(" 🔸 18. "),s("code",[t._v("every()")])]),t._v(" "),s("h4",{attrs:{id:"功能-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#功能-5"}},[t._v("#")]),t._v(" 功能:")]),t._v(" "),s("ul",[s("li",[t._v("检测数组所有元素是否都满足指定条件。")]),t._v(" "),s("li",[s("code",[t._v("every")]),t._v(" 方法会遍历数组中的每个元素,并使用回调函数处理每个元素,最终返回一个布尔值。")]),t._v(" "),s("li",[t._v("在回调函数中,如果"),s("strong",[t._v("所有元素都满足条件")]),t._v(","),s("code",[t._v("every")]),t._v(" 方法将返回 "),s("code",[t._v("true")]),t._v(",否则返回 "),s("code",[t._v("false")]),t._v("。")])]),t._v(" "),s("h4",{attrs:{id:"示例-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#示例-5"}},[t._v("#")]),t._v(" 示例:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("93")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("77")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("53")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("38")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("87")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("every")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("item")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" item "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n")])])]),s("h4",{attrs:{id:"使用場景-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#使用場景-4"}},[t._v("#")]),t._v(" 使用場景")]),t._v(" "),s("p",[t._v("当您需要检测数组中的所有元素是否满足指定条件时,可以使用 "),s("code",[t._v("every")]),t._v(" 方法。以下是一些 TypeScript 示例:")]),t._v(" "),s("ol",[s("li",[t._v("检测订单中的所有商品是否都有库存")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OrderItem")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n productId"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n quantity"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" orderItems"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" OrderItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" productId"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" quantity"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" productId"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" quantity"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 更多商品...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" allItemsInStock "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" orderItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("every")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("quantity "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"🔸-19-some"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-19-some"}},[t._v("#")]),t._v(" 🔸 19. "),s("code",[t._v("some()")])]),t._v(" "),s("h4",{attrs:{id:"功能-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#功能-6"}},[t._v("#")]),t._v(" 功能:")]),t._v(" "),s("ul",[s("li",[t._v("检测数组中是否有元素满足指定条件。")]),t._v(" "),s("li",[s("code",[t._v("some")]),t._v(" 方法会遍历数组中的每个元素,并使用回调函数处理每个元素,最终返回一个布尔值。")]),t._v(" "),s("li",[t._v("在回调函数中,"),s("strong",[t._v("如果有一个元素满足条件")]),t._v(","),s("code",[t._v("some")]),t._v(" 方法将返回 "),s("code",[t._v("true")]),t._v(",否则返回 "),s("code",[t._v("false")]),t._v("。")])]),t._v(" "),s("h4",{attrs:{id:"示例-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#示例-6"}},[t._v("#")]),t._v(" 示例:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("93")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("77")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("53")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("38")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("87")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("item")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" item "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("和 "),s("code",[t._v("every")]),t._v(" 方法类似,"),s("code",[t._v("some")]),t._v(" 方法也可以用于检测数组中是否有元素满足指定条件。但是,"),s("code",[t._v("some")]),t._v(" 方法只要有一个元素满足条件,就会返回 "),s("code",[t._v("true")]),t._v(",而不是所有元素都满足条件。")])]),t._v(" "),s("h3",{attrs:{id:"🔸-20-reduce"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-20-reduce"}},[t._v("#")]),t._v(" 🔸 20. "),s("code",[t._v("reduce()")])]),t._v(" "),s("h4",{attrs:{id:"功能-7"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#功能-7"}},[t._v("#")]),t._v(" 功能:")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("对数组中的每个元素执行一个由您提供的 "),s("code",[t._v("reducer")]),t._v(" 函数(升序执行),将其结果汇总为单个返回值。")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("reduce")]),t._v(" 方法對數組中每一個元素按序執行一個指定方法, 每一次允許"),s("code",[t._v("reducer")]),t._v(" 會將先前元素的計算結果作為參數傳入, 最後返回一個累積的結果")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("reduce")]),t._v(" 方法接受两个参数:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("reducer")]),t._v(" 函数:用于处理数组中的每个元素,并将其结果汇总为单个返回值。")]),t._v(" "),s("li",[s("code",[t._v("initialValue")]),t._v(":作为第一次调用 "),s("code",[t._v("reducer")]),t._v(" 函数时的第一个参数使用的值。第一次回調函數的初始值,如果指定初始值,則會作為第一次調用 callback 函數時的第一個參數使用。如果沒有提供初始值,則將使用數組中的第一個元素。在沒有初始值的空數組上調用 reduce 將報錯。")])])]),t._v(" "),s("li",[s("p",[s("code",[t._v("reducer")]),t._v(" 函数接受四个参数:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("accumulator")]),t._v(":累加器累计回调的返回值; 它是上一次调用回调时返回的累积值,或 "),s("code",[t._v("initialValue")]),t._v("。")]),t._v(" "),s("li",[s("code",[t._v("currentValue")]),t._v(":数组中正在处理的元素。")]),t._v(" "),s("li",[s("code",[t._v("currentIndex")]),t._v(":数组中正在处理的元素的索引。如果提供了 "),s("code",[t._v("initialValue")]),t._v(",则索引号为 0,否则索引为 1。")]),t._v(" "),s("li",[s("code",[t._v("array")]),t._v(":调用 "),s("code",[t._v("reduce")]),t._v(" 的数组。")]),t._v(" "),s("li",[s("code",[t._v("thisArg")]),t._v(" 可选参数。执行 "),s("code",[t._v("callback")]),t._v(" 函数时使用的 "),s("code",[t._v("this")]),t._v(" 值。")])])])]),t._v(" "),s("h4",{attrs:{id:"示例-7"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#示例-7"}},[t._v("#")]),t._v(" 示例:")]),t._v(" "),s("ol",[s("li",[t._v("计算订单总金额: 假设你有一个表示订单中各个商品及其数量的数组,你需要计算订单的总金额。")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OrderItem")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n productId"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n quantity"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" orderItems"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" OrderItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" productId"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" quantity"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" productId"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" quantity"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 更多商品...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" totalAmount "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" orderItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("total"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" total "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("quantity "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("price"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[t._v("将数组转换为对象 使用"),s("code",[t._v("reduce")]),t._v(" 方法可以将数组转换为更复杂的数据结构,比如对象。")])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("User")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" users"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" User"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Alice"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Bob"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 更多用户...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//累加器:reduce 方法的第一个参数是一个回调函数,这个回调函数接收两个参数:当前的累加器(obj)和当前正在处理的数组元素(user)。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" usersById "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" users"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" user"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("user"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" user"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *将用户对象添加到以用户ID为键的对象中*")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { 1: { id: 1, name: "Alice" }, 2: { id: 2, name: "Bob" } }')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" User "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 以空对象作为初始值")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("usersById"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { 1: { id: 1, name: "Alice" }, 2: { id: 2, name: "Bob" } }')]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("当你看到这种写法 "),s("code",[t._v("obj[user.id] = user;")]),t._v(",它是一种在 JavaScript 和 TypeScript 中常用的方式,用于将数组中的元素映射到一个对象的属性上。具体来说,这种写法是在构造一个以 "),s("code",[t._v("user.id")]),t._v(" 作为键(key),"),s("code",[t._v("user")]),t._v(" 对象本身作为值(value)的对象。")])]),t._v(" "),s("blockquote",[s("p",[t._v("在这个表达式中:")])]),t._v(" "),s("blockquote",[s("ul",[s("li",[s("code",[t._v("obj")]),t._v(" 是一个对象,通常是一个空对象 "),s("code",[t._v("{}")]),t._v(",它在 "),s("code",[t._v("reduce")]),t._v(" 函数的迭代过程中不断被更新。")]),t._v(" "),s("li",[s("code",[t._v("user")]),t._v(" 是当前正在迭代的数组元素。")]),t._v(" "),s("li",[s("code",[t._v("user.id")]),t._v(" 是 "),s("code",[t._v("user")]),t._v(" 对象的一个属性,这里用作新对象的键。")]),t._v(" "),s("li",[s("code",[t._v("obj[user.id]")]),t._v(" 表示在 "),s("code",[t._v("obj")]),t._v(" 对象中创建或更新一个以 "),s("code",[t._v("user.id")]),t._v(" 的值为键的属性。")]),t._v(" "),s("li",[s("code",[t._v("obj[user.id] = user;")]),t._v(" 表示将当前的 "),s("code",[t._v("user")]),t._v(" 对象赋值给这个键。")])])]),t._v(" "),s("ol",{attrs:{start:"3"}},[s("li",[t._v("分类汇总数据: 对数组中的项目进行分类,并计算每个类别中的项目数量。")])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Product")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n category"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" products"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" category"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Electronics"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" category"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Books"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 更多产品...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" categoryCount "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" products"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("category"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("category"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[s("code",[t._v("{} as { [key: string]: number });")]),t._v(" 是一種 type assertion, 用來告訴編譯器, 這個空對象的類型是 "),s("code",[t._v("{ [key: string]: number }")]),t._v("。 "),s("code",[t._v("{ [key: string]: number }:")]),t._v("这是一个索引签名类型。它描述了一个对象,这个对象可以拥有任意数量的属性,但所有属性的键(key)都是字符串类型,而对应的值(value)都是数字类型。")])]),t._v(" "),s("blockquote",[s("p",[t._v("[key: string]: 表示对象的键是字符串类型。key 在这里只是一个占位符,你可以使用任何名称。\nnumber: 表示属性值的类型必须是数字。")])]),t._v(" "),s("ol",{attrs:{start:"4"}},[s("li",[t._v("创建值的累积数组: 创建一个新数组,其中每个元素是原始数组中对应元素及其之前所有元素的累积和。")])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" numbers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" cumulativeSum "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" numbers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("acc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("acc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n acc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" acc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("acc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n acc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" acc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"使用場景-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#使用場景-5"}},[t._v("#")]),t._v(" 使用場景:")]),t._v(" "),s("p",[t._v("在餐厅应用程序(Restaurant App)的开发中,"),s("code",[t._v("reduce")]),t._v(" 方法可以在许多场景中发挥重要作用,尤其是在处理数据汇总、统计分析以及复杂的数组转换时。以下是一些针对餐厅应用的 TypeScript 示例,展示了 "),s("code",[t._v("reduce")]),t._v(" 方法的不同用途:")]),t._v(" "),s("ol",[s("li",[t._v("统计不同类型菜品的数量")])]),t._v(" "),s("p",[t._v("假设你的餐厅应用需要对菜单中不同类型的菜品进行统计。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MenuItem")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"starter"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"main"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dessert"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" menuItems"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" MenuItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 菜单数据...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemCountByType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" menuItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[t._v("计算每日总销售额")])]),t._v(" "),s("p",[t._v("计算一天内所有订单的总销售额。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Order")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n totalAmount"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n date"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Date"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" orders"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 当日订单数据...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" totalSales "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" orders"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("total"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" total "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("totalAmount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[t._v("汇总顾客反馈")])]),t._v(" "),s("p",[t._v("将所有顾客的评论汇总成一个字符串。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Review")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n comment"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" reviews"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Review"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 顾客评论数据...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" allComments "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" reviews"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("comments"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" review"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" comments "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" review"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("comment "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('" "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[t._v("创建菜品成分列表")])]),t._v(" "),s("p",[t._v("假设你需要从所有菜品中创建一个包含所有独特成分的列表。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Dish")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n ingredients"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" dishes"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Dish"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 菜品数据...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" allIngredients "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dishes\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ingredients"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dish"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" ingredients"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("concat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dish"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ingredients"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" self"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" self"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("indexOf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 移除重复项")]),t._v("\n")])])]),s("ol",{attrs:{start:"5"}},[s("li",[t._v("分类订单并计算每类的总金额")])]),t._v(" "),s("p",[t._v("假设你需要按顾客类型(比如会员和非会员)分类订单,并计算每一类的总金额。")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CustomerOrder")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n customerId"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n totalAmount"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n isMember"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" customerOrders"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CustomerOrder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 顾客订单数据...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" totalAmountByCustomerType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" customerOrders"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("totals"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("isMember "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"members"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nonMembers"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n totals"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("totals"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("totalAmount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" totals"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" members"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" nonMembers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("hr"),t._v(" "),s("h3",{attrs:{id:"🔸-21-reduceright"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-21-reduceright"}},[t._v("#")]),t._v(" 🔸 21. "),s("code",[t._v("reduceRight()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:类似于"),s("code",[t._v("reduce()")]),t._v(",但从右到左执行。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 示例与`reduce()`类似,仅改变迭代方向")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"🔸-22-includes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-22-includes"}},[t._v("#")]),t._v(" 🔸 22. "),s("code",[t._v("includes()")])]),t._v(" "),s("h4",{attrs:{id:"功能-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#功能-8"}},[t._v("#")]),t._v(" 功能:")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("判断数组是否包含指定的值, 返回布尔值。")])]),t._v(" "),s("li",[s("p",[t._v("只能檢測基本類型的值, 不能檢測引用類型的值")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("includes")]),t._v(" 方法接受两个参数:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("searchElement")]),t._v(":要查找的元素。")]),t._v(" "),s("li",[s("code",[t._v("fromIndex")]),t._v(":可选参数。开始查找的位置。如果省略,则从数组的第一个元素(索引位置 0)开始查找。如果该值为负数,则按升序从 "),s("code",[t._v("array.length + fromIndex")]),t._v(" 的索引开始搜索。如果 "),s("code",[t._v("fromIndex")]),t._v(" 大于或等于数组的长度,则 "),s("code",[t._v("includes")]),t._v(" 不会查找数组,返回 "),s("code",[t._v("false")]),t._v("。")])])])]),t._v(" "),s("h4",{attrs:{id:"示例-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#示例-8"}},[t._v("#")]),t._v(" 示例:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" site "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"facebook"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"google"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"youtube"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("site"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("includes")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"youtube"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("site"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("includes")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"yahoo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n")])])]),s("h3",{attrs:{id:"_23-🔸-from"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_23-🔸-from"}},[t._v("#")]),t._v(" 23.🔸 "),s("code",[t._v("from()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:从类数组或可迭代对象创建一个新数组。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" all "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"张飞"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"28"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"男"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"率土"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"鸿图"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"三战"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("length")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("all"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"_24-🔸-find"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_24-🔸-find"}},[t._v("#")]),t._v(" 24. 🔸 "),s("code",[t._v("find()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:返回数组中满足提供的测试函数的第一个元素的值。否则返回"),s("code",[t._v("undefined")]),t._v("。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("55")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("66")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("77")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("88")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("99")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" res "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("item")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" item "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("60")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 66")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"_25-🔸-findindex"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_25-🔸-findindex"}},[t._v("#")]),t._v(" 25. 🔸 "),s("code",[t._v("findIndex()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("55")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("66")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("77")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("88")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("99")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" index "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("findIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("item")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" item "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("60")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"_26-🔸-fill"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_26-🔸-fill"}},[t._v("#")]),t._v(" 26. 🔸 "),s("code",[t._v("fill()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:用一个固定值填充数组中从起始索引到终止索引内的全部元素。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fill")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"填充"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// ["a", "填充", "c"]')]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"_27-🔸-flat"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_27-🔸-flat"}},[t._v("#")]),t._v(" 27. 🔸 "),s("code",[t._v("flat()")])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("功能:创建一个新数组,其中所有子数组元素递归地连接到指定深度。")])]),t._v(" "),s("li",[s("p",[t._v("示例:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" arr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"拉平一次"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// [1, 2, 3, 4, [5]]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" arr2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 拉平两次")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"拉平两次"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// [1, 2, 3, 4, 5]")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"_28-🔸-flatmap"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_28-🔸-flatmap"}},[t._v("#")]),t._v(" 28. 🔸 "),s("code",[t._v("flatMap()")])]),t._v(" "),s("ul",[s("li",[t._v("功能:首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。")]),t._v(" "),s("li",[t._v("示例:"),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" list "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("55")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("66")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("77")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("88")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("99")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" newArr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flatMap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"flatMap方法:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" newArr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 结果: [[55, 0], [66, 1], [77, 2], [88, 3], [99, 4], [100, 5]]")]),t._v("\n")])])])])])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/3.f8c28e7e.js b/assets/js/3.f8c28e7e.js new file mode 100644 index 00000000..3d7232bd --- /dev/null +++ b/assets/js/3.f8c28e7e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3,18,21],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return d})),n.d(e,"k",(function(){return h})),n.d(e,"l",(function(){return f})),n.d(e,"c",(function(){return g})),n.d(e,"j",(function(){return m}));n(90);const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return s.test(i)?t:i+".html"+n}function d(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return h(n,e,r);if(Array.isArray(e))return Object.assign(h(n,e[0],r),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},242:function(t,e,n){"use strict";n.r(e);var r={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(243),n(14)),s=Object(i.a)(r,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},243:function(t,e,n){"use strict";n(240)},245:function(t,e,n){},250:function(t,e,n){},252:function(t,e,n){"use strict";n(245)},253:function(t,e,n){"use strict";n.r(e);var r=n(266),i=n(255),s=n(239);function a(t,e){if("group"===e.type){const n=e.path&&Object(s.e)(t,e.path),r=e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(s.e)(t,e.path));return n||r}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:r.default,SidebarLink:i.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(s.e)(this.$route,t.regularPath)}}},l=n(14),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,r){return e("li",{key:r},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:r===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(r)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},255:function(t,e,n){"use strict";n.r(e);var r=n(239);function i(t,e,n,r,i){const s={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(s.style={"padding-left":i+"rem"}),t("RouterLink",s,n)}function s(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(r.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,u,e.level-1),s(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(r.e)(a,u.path),d="auto"===u.type?p||u.children.some(t=>Object(r.e)(a,u.basePath+"#"+t.slug)):p,h="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):i(t,u.path,u.title||u.path,d),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[h,s(t,u.children,u.basePath,a,f)];if((d||b)&&u.headers&&!r.d.test(u.path)){return[h,s(t,Object(r.c)(u.headers),u.path,a,f)]}return h}},o=(n(252),n(14)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},263:function(t,e,n){"use strict";n(250)},266:function(t,e,n){"use strict";n.r(e);var r=n(239),i={name:"SidebarGroup",components:{DropdownTransition:n(242).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=n(253).default},methods:{isActive:r.e}},s=(n(263),n(14)),a=Object(s.a)(i,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/30.ab821c7e.js b/assets/js/30.ab821c7e.js new file mode 100644 index 00000000..228e7e04 --- /dev/null +++ b/assets/js/30.ab821c7e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{315:function(t,s,a){"use strict";a.r(s);var r=a(14),i=Object(r.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"⚪️-javascript-articles-の研究例をいくつか"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-javascript-articles-の研究例をいくつか"}},[this._v("#")]),this._v(" ⚪️ Javascript -"),t("em",[this._v("articles")]),this._v(" の研究例をいくつか")])])}),[],!1,null,null,null);s.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/31.c2296a43.js b/assets/js/31.c2296a43.js new file mode 100644 index 00000000..ee471e75 --- /dev/null +++ b/assets/js/31.c2296a43.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{320:function(t,e,r){"use strict";r.r(e);var n=r(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"next-js"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#next-js"}},[t._v("#")]),t._v(" Next.js")]),t._v(" "),e("p",[t._v("Reading lists:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://juejin.cn/post/7270331043234791458",target:"_blank",rel:"noopener noreferrer"}},[t._v("梳理 NextJS13 两种路由下的不同渲染方式:SSG,ISR,SSR,RSC"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://juejin.cn/post/7204085076504920119",target:"_blank",rel:"noopener noreferrer"}},[t._v("理解前端基础渲染模式| CSR、SSR、同构、静态化"),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://juejin.cn/post/7160279477690466335",target:"_blank",rel:"noopener noreferrer"}},[t._v("Next.js 之前端渲染模式"),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://malik11217.medium.com/%E7%90%86%E8%A7%A3-next-js-app-router-%E7%9A%84-data-fetching-%E8%88%87-server-components-%E4%B8%8D%E5%86%8D%E7%82%BA-ssr-ssg-isr-%E7%AD%89%E5%90%8D%E8%A9%9E%E7%85%A9%25E",target:"_blank",rel:"noopener noreferrer"}},[t._v("理解 Next.js App Router 的 Data Fetching 與 Server Components — 不再為 SSR/SSG/ISR 等名詞煩惱"),e("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/32.a64339eb.js b/assets/js/32.a64339eb.js new file mode 100644 index 00000000..532839ec --- /dev/null +++ b/assets/js/32.a64339eb.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{319:function(t,s,e){"use strict";e.r(s);var n=e(14),r=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"⚪️-next-js-を基礎から理解する"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-next-js-を基礎から理解する"}},[this._v("#")]),this._v(" ⚪️ Next.js を基礎から理解する")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/33.a7f43a2e.js b/assets/js/33.a7f43a2e.js new file mode 100644 index 00000000..7c0ad512 --- /dev/null +++ b/assets/js/33.a7f43a2e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{318:function(t,s,a){"use strict";a.r(s);var e=a(14),r=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"⚪️-next-js-articles-の研究例をいくつか"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-next-js-articles-の研究例をいくつか"}},[t._v("#")]),t._v(" ⚪️ Next.js-"),s("em",[t._v("articles")]),t._v(" の研究例をいくつか")]),t._v(" "),s("h2",{attrs:{id:"🔸-ext-js-13-的-app-目录模式功能梳理-文章連結"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-ext-js-13-的-app-目录模式功能梳理-文章連結"}},[t._v("#")]),t._v(" 🔸 ext.js 13 的 app 目录模式功能梳理 "),s("a",{attrs:{href:"https://juejin.cn/post/7221162775074734135",target:"_blank",rel:"noopener noreferrer"}},[t._v("文章連結"),s("OutboundLink")],1)]),t._v(" "),s("h3",{attrs:{id:"约定页面相关内容"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#约定页面相关内容"}},[t._v("#")]),t._v(" 约定页面相关内容")]),t._v(" "),s("p",[t._v("指约定一个页面需要有一个单独的目录,目录下约定以下文件:")]),t._v(" "),s("p",[s("code",[t._v("page.js")]),t._v(" - 页面组件("),s("code",[t._v("app/page.js")]),t._v(" 代表路由为 / 的页面,其实就类似于取代 "),s("code",[t._v("index.js")]),t._v("),有 "),s("code",[t._v("page.js")]),t._v("才能表明该约定文件路由是一个页面\n"),s("code",[t._v("layout.js")]),t._v(" - 布局组件,切换路由时保留状态,不重新渲染。\n"),s("code",[t._v("template.js")]),t._v(" - 模版组件,和 "),s("code",[t._v("layout")]),t._v(" 类似,但切换路由时会重新渲染,不保留状态。\n"),s("code",[t._v("loading.js")]),t._v(" - 加载组件,就是使用 Suspense 组件包裹 "),s("code",[t._v("Page")]),t._v(" 组件,在 "),s("code",[t._v("Page")]),t._v(" 组件渲染返回内容之前显示加载组件。\n"),s("code",[t._v("error.js")]),t._v(" - 错误文件,页面渲染异常的时候显示的组件。\n"),s("code",[t._v("not-found.js")]),t._v("- 页面 404 组件,只在 app 目录下第一级目录生效,存在时只有根 "),s("code",[t._v("layout")]),t._v(" 生效。")]),t._v(" "),s("p",[t._v("除了 not-found.js ,其他的约定组件则对 app 下所有目录生效。")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[t._v("app\n├── features\n│ ├── metadata\n│ │ └── page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ ├── layout"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ ├── template"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ ├── loading"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ └── error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n├── page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n├── layout"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n├── template"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n├── loading"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n├── error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n└── not"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("found"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n")])])]),s("h3",{attrs:{id:"平行路由和插槽功能"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#平行路由和插槽功能"}},[t._v("#")]),t._v(" 平行路由和插槽功能")]),t._v(" "),s("p",[t._v("也就是多个平行的路由可以在同一个页面当成组件来显示,提升代码的组织能力。 使用方式为:使用 "),s("code",[t._v("@")]),t._v(" 开头的目录名下面的文件,将会自动注入到 "),s("code",[t._v("Layout")]),t._v(" 组件的 "),s("code",[t._v("props")]),t._v(" 中。比如: 数据面板页面,页面分为了两个模块:用户数据模块、性能数据模块")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[t._v("app\n├── dashboard\n│ ├── "),s("span",{pre:!0,attrs:{class:"token decorator"}},[s("span",{pre:!0,attrs:{class:"token at operator"}},[t._v("@")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("userInfo")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 用户行为数据模块")]),t._v("\n│ │ ├── devices "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 用户设备信息")]),t._v("\n│ │ │ └── page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ │ ├── locations "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 用户地理位置分布")]),t._v("\n│ │ │ └── page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ │ ├── "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ │ └── page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ ├── "),s("span",{pre:!0,attrs:{class:"token decorator"}},[s("span",{pre:!0,attrs:{class:"token at operator"}},[t._v("@")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("performance")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 性能数据模块")]),t._v("\n│ │ ├── app "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// app 性能数据")]),t._v("\n│ │ │ └── page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ │ ├── web "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// web性能数据")]),t._v("\n│ │ │ └── page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ │ ├── "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ │ ├── page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ │ └── "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n│ └── layout"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n├── page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n└── layout"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tsx\n")])])]),s("h1",{attrs:{id:"nextjs-渲染方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nextjs-渲染方式"}},[t._v("#")]),t._v(" Nextjs 渲染方式")]),t._v(" "),s("h2",{attrs:{id:"🔹-next-js-中的渲染模式文章連結"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔹-next-js-中的渲染模式文章連結"}},[t._v("#")]),t._v(" 🔹 Next.js 中的渲染模式"),s("a",{attrs:{href:"https://juejin.cn/post/7160279477690466335",target:"_blank",rel:"noopener noreferrer"}},[t._v("文章連結"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"🔸-理解前端基础渲染模式-csr、ssr、同构、静态化文章連結"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-理解前端基础渲染模式-csr、ssr、同构、静态化文章連結"}},[t._v("#")]),t._v(" 🔸 理解前端基础渲染模式| CSR、SSR、同构、静态化"),s("a",{attrs:{href:"https://juejin.cn/post/7204085076504920119",target:"_blank",rel:"noopener noreferrer"}},[t._v("文章連結"),s("OutboundLink")],1)]),t._v(" "),s("h3",{attrs:{id:"什麼是渲染"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#什麼是渲染"}},[t._v("#")]),t._v(" 什麼是渲染?")]),t._v(" "),s("p",[t._v("渲染可理解為將頁面數據和頁面模板組裝成 html 的過程, 也就是 "),s("code",[t._v("data")]),t._v("+"),s("code",[t._v("template")]),t._v(" = "),s("code",[t._v("html")]),t._v(", "),s("code",[t._v("data")]),t._v("可以是為 null, null 也是一種數據, "),s("code",[t._v("template")]),t._v("可以是為 null, null 也是一種模板, 這樣就可以得到一個空的 html, 這個 html 也是一個頁面, 只是沒有任何內容而已.")]),t._v(" "),s("h3",{attrs:{id:"客户端渲染-csr"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#客户端渲染-csr"}},[t._v("#")]),t._v(" 客户端渲染(CSR)")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("CSR(Client Side Rendering)就是 "),s("code",[t._v("data + template = html")]),t._v(" 过程在客户端进行,服務端直接返回一個空的 html, 然後客戶端再去請求數據, 然後再將數據和模板組裝成 html, 這樣的好處是服務端只需要返回一個空的 "),s("code",[t._v("html")]),t._v(", 這樣可以減輕服務端的壓力, 但是客戶端需要等待數據請求完成, 然後再將數據和模板組裝成 html, 這樣的好處是可以減輕服務端的壓力, 但是客戶端需要等待數據請求完成, 然後再將數據和模板組裝成 "),s("code",[t._v("html")])])]),t._v(" "),s("li",[s("p",[t._v("CSR(Client Side Rendering)就是在浏览器从服务器中获取到的只是一个带有空 div 标签的 html 文件,然后执行 js 文件生成 dom 和操作 dom,日常中开发的后台管理类的系统大多都是 CSR 的模式。")])])]),t._v(" "),s("blockquote",[s("p",[t._v("打包的时候生成只有"),s("code",[t._v("css")]),t._v("、"),s("code",[t._v("js")]),t._v("等外链标签的空白页面,客户端在请求时,服务端不做任何处理,直接以原文件的形式返回给客户端客户端,客户端获取到页面后,在加载完 js 后才通过 js 来渲染页面内容。")])]),t._v(" "),s("h3",{attrs:{id:"服务端渲染-ssr"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#服务端渲染-ssr"}},[t._v("#")]),t._v(" 服务端渲染(SSR)")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("SSR(Server Side Rendering)是在服务端已经完成渲染工作,浏览器从服务器获得的是完整的网页的 dom 字符串。不同于以前通过后端模板等方案生成页面,现在的 React、Vue、Svelte 等优秀框架都有 SSR 的解决方案。")])]),t._v(" "),s("li",[s("p",[t._v("具体解释就是:服务端渲染的模式下,当用户第一次请求页面时,由服务器把需要的组件或页面渲染成 HTML 字符串,然后把它返回给客户端。客户端拿到手的,是可以直接渲染然后呈现给用户的 HTML 内容,不需要为了生成 DOM 内容自己再去跑一遍 JS 代码。使用服务端渲染的网站,可以说是“所见即所得”,页面上呈现的内容,我们在 html 源文件里也能找到。")])])]),t._v(" "),s("h3",{attrs:{id:"同构渲染-ssr-csr"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#同构渲染-ssr-csr"}},[t._v("#")]),t._v(" 同构渲染(SSR + CSR)")]),t._v(" "),s("blockquote",[s("p",[t._v("以上產生的問題思考: 渲染本質上就職"),s("strong",[t._v("字符串的拼接")]),t._v(" ,將數據渲染進一些固定格式的 "),s("code",[t._v("html")]),t._v(" 代碼中形成最終的 "),s("code",[t._v("html")]),t._v(" 展示在用戶頁面上, 因为字符串的拼接必然会损耗一些性能资源。")])]),t._v(" "),s("ul",[s("li",[t._v("服务器端渲染消耗 "),s("code",[t._v("server")]),t._v(" 端的性能")]),t._v(" "),s("li",[t._v("客户端渲染,常见的手段,比如是直接生成 "),s("code",[t._v("DOM")]),t._v(" 插入到 "),s("code",[t._v("html")]),t._v(" 中,或者是使用一些前端的模板引擎等。他们初次渲染的原理大多是将原 "),s("code",[t._v("html")]),t._v(" 中的数据标记(例如"),s("code",[t._v(t._s(t.text))]),t._v(")替换。消耗的是 "),s("code",[t._v("client")]),t._v(" 端的性能")])]),t._v(" "),s("p",[t._v("什麼是同構?")]),t._v(" "),s("p",[t._v("同构应用(Isomorphic Application)是一种能够在服务器端和客户端同时运行的应用程序。")]),t._v(" "),s("p",[t._v("在服务端先进行渲染一次(SSR,组装页面 html 内容),客户端拿到代码后,再进行渲染一次(CSH(client-side hydration),也就是 hydrate,主要对 html 进行事件绑定和内容校验,如果 hydrate 发现内容不一致的话,会在开发环境提示警告),后续页面的所有操作和渲染行为都和 CSR 一致(didMount 后的更新页面内容都属于正常的 CSR 了)。")]),t._v(" "),s("p",[t._v("虚拟"),s("code",[t._v("DOM(Virtual DOM)")]),t._v("是用于构建同构应用的关键概念之一。虚拟 DOM 是一个抽象的 "),s("code",[t._v("JavaScript")]),t._v(" 对象树,"),s("strong",[t._v("它模拟了真实的 DOM 结构,但不会直接与浏览器的 DOM 树进行交互。")]),t._v(" 相反,虚拟 DOM 用于在服务器端和客户端之间共享页面渲染逻辑。")]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("性能优化:")]),t._v(" 直接操作浏览器的真实 DOM 树是一项昂贵的操作,因为每次修改都会导致浏览器重新布局和绘制。虚拟 DOM 允许应用程序在内存中构建和修改虚拟 DOM 树,然后通过比较虚拟 DOM 树的变化来找到最小的更新,从而减少对真实 DOM 的操作,提高性能。")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("跨平台渲染:")]),t._v(" 虚拟 DOM 不仅可以用于客户端浏览器,还可以在服务器端渲染(Server-Side Rendering,SSR)中使用。这意味着同一份虚拟 DOM 代码可以用于服务器端渲染,将 HTML 直接发送给客户端,以加快首次加载速度和提高 SEO。")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("可扩展性:")]),t._v(" 虚拟 DOM 允许应用程序将页面的渲染逻辑与具体的渲染目标(如浏览器、服务器、移动应用等)分离开来。这使得应用程序更容易在不同的环境中运行和扩展。")])])]),t._v(" "),s("p",[t._v("**构建同构应用的最终目的是通过一份源代码构建出两份 JavaScript 代码,一份用于在服务器端运行渲染出 HTML,另一份用于在客户端运行并接管页面的交互。**这样,用户在访问同构应用时,首次加载页面时可以获得服务器端渲染的内容,而后续交互则由客户端接管,提供更好的用户体验和性能。")]),t._v(" "),s("h2",{attrs:{id:"快速理解-next-js-中各种渲染方式的作用及区别-ssg、ssr、isr、csr文章連結"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#快速理解-next-js-中各种渲染方式的作用及区别-ssg、ssr、isr、csr文章連結"}},[t._v("#")]),t._v(" 快速理解 Next.js 中各种渲染方式的作用及区别(SSG、SSR、ISR、CSR"),s("a",{attrs:{href:"https://juejin.cn/post/7213653429415559223",target:"_blank",rel:"noopener noreferrer"}},[t._v("文章連結"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"🔸-快速理解-next-js-中数据获取方式的作用及区别-getinitialprops、getser-versideprops、getstaticprops文章連結"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-快速理解-next-js-中数据获取方式的作用及区别-getinitialprops、getser-versideprops、getstaticprops文章連結"}},[t._v("#")]),t._v(" 🔸 快速理解 Next.js 中数据获取方式的作用及区别(getInitialProps、getSer verSideProps、getStaticProps"),s("a",{attrs:{href:"https://juejin.cn/post/7214831158873571383",target:"_blank",rel:"noopener noreferrer"}},[t._v("文章連結"),s("OutboundLink")],1)]),t._v(" "),s("h1",{attrs:{id:"nextjs-路由相關"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nextjs-路由相關"}},[t._v("#")]),t._v(" Nextjs 路由相關")]),t._v(" "),s("h2",{attrs:{id:"🔸-一起来学-next-js-api-路由篇文章連結"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-一起来学-next-js-api-路由篇文章連結"}},[t._v("#")]),t._v(" 🔸 一起来学 next.js - API 路由篇"),s("a",{attrs:{href:"https://cloud.tencent.com/developer/article/2282750",target:"_blank",rel:"noopener noreferrer"}},[t._v("文章連結"),s("OutboundLink")],1)])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/34.b9fe4fba.js b/assets/js/34.b9fe4fba.js new file mode 100644 index 00000000..bd2ae24e --- /dev/null +++ b/assets/js/34.b9fe4fba.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{322:function(e,t,r){"use strict";r.r(t);var a=r(14),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"react"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#react"}},[e._v("#")]),e._v(" React")]),e._v(" "),t("blockquote",[t("p",[e._v("React は、インタラクティブなユーザインターフェイスの作成にともなう苦痛を取り除きます。アプリケーションの各状態に対応するシンプルな View を設計するだけで、React はデータの変更を検知し、関連するコンポーネントだけを効率的に更新、描画します。")])]),e._v(" "),t("blockquote",[t("p",[e._v("宣言的な View を用いてアプリケーションを構築することで、コードはより見通しが立ちやすく、デバッグのしやすいものになります。")])]),e._v(" "),t("h2",{attrs:{id:"references"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[e._v("#")]),e._v(" References")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://react.dev/reference/react",target:"_blank",rel:"noopener noreferrer"}},[e._v("React 公式文書"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://ja.legacy.reactjs.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ユーザインターフェース構築のための JavaScript ライブラリ"),t("OutboundLink")],1),e._v(" React を学びましょう。")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://alexkondov.com/tao-of-react/?ref=jonas.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tao of React - Software Design, Architecture & Best Practices"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://frontendmastery.com/posts/the-new-wave-of-react-state-management/?ref=jonas.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("The new wave of React state management"),t("OutboundLink")],1),e._v(" (Excellent read!)")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://alexsidorenko.com/blog/react-render-usememo?ref=jonas.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("A Visual Guide to React Rendering - useMemo"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://overreacted.io/react-as-a-ui-runtime/?ref=jonas.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("React as a UI Runtime"),t("OutboundLink")],1),e._v(" (By Dan Abramov from the React team)\n"),t("a",{attrs:{href:"https://react.dev/learn/you-might-not-need-an-effect?ref=jonas.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("You Might Not Need an Effect"),t("OutboundLink")],1),e._v(" (Official React docs)")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://overreacted.io/a-complete-guide-to-useeffect/?ref=jonas.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("A Complete Guide to useEffect"),t("OutboundLink")],1),e._v(" (By Dan Abramov)\n"),t("a",{attrs:{href:"https://blog.thoughtspile.tech/2021/11/15/unintentional-layout-effect/?ref=jonas.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("useEffect sometimes fires before paint"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://overreacted.io/making-setinterval-declarative-with-react-hooks/?ref=jonas.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("Making setInterval Declarative with React Hooks"),t("OutboundLink")],1),e._v(" (By Dan Abramov)")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.isquaredsoftware.com/2018/03/redux-not-dead-yet/?ref=jonas.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("Redux - Not Dead Yet!"),t("OutboundLink")],1),e._v(" (By Mark Erikson from the Redux team)")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.isquaredsoftware.com/2021/01/context-redux-differences/",target:"_blank",rel:"noopener noreferrer"}},[e._v('Why React Context is Not a "State Management" Tool'),t("OutboundLink")],1),e._v(" (By Mark Erikson)")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/35.6015d88a.js b/assets/js/35.6015d88a.js new file mode 100644 index 00000000..33e53548 --- /dev/null +++ b/assets/js/35.6015d88a.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{321:function(t,r,e){"use strict";e.r(r);var a=e(14),s=Object(a.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"⚪️-react-js-articles-の研究例をいくつか"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-react-js-articles-の研究例をいくつか"}},[t._v("#")]),t._v(" ⚪️ React.js -"),r("em",[t._v("articles")]),t._v(" の研究例をいくつか")]),t._v(" "),r("h2",{attrs:{id:"🔸-react-ssr-原理解析和实践"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#🔸-react-ssr-原理解析和实践"}},[t._v("#")]),t._v(" 🔸 "),r("a",{attrs:{href:"https://juejin.cn/post/7144905013016395783",target:"_blank",rel:"noopener noreferrer"}},[t._v("React SSR 原理解析和实践"),r("OutboundLink")],1)]),t._v(" "),r("h2",{attrs:{id:"🔸-从零开始-react-服务器渲染-ssr-同构-😏-基于-koa"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#🔸-从零开始-react-服务器渲染-ssr-同构-😏-基于-koa"}},[t._v("#")]),t._v(" 🔸 "),r("a",{attrs:{href:"https://juejin.cn/post/6844903777766473742",target:"_blank",rel:"noopener noreferrer"}},[t._v("从零开始 React 服务器渲染(SSR)同构 😏(基于 Koa"),r("OutboundLink")],1)]),t._v(" "),r("h2",{attrs:{id:"🔸-react-服务端渲染从入门到精通"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#🔸-react-服务端渲染从入门到精通"}},[t._v("#")]),t._v(" 🔸 "),r("a",{attrs:{href:"https://juejin.cn/post/6844903807994822669",target:"_blank",rel:"noopener noreferrer"}},[t._v("React 服务端渲染从入门到精通"),r("OutboundLink")],1)])])}),[],!1,null,null,null);r.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/36.2ee99065.js b/assets/js/36.2ee99065.js new file mode 100644 index 00000000..72bd9b81 --- /dev/null +++ b/assets/js/36.2ee99065.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{323:function(t,e,a){"use strict";a.r(e);var s=a(14),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"⚪️react-を基礎から理解する"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#⚪️react-を基礎から理解する"}},[t._v("#")]),t._v(" ⚪️React を基礎から理解する")]),t._v(" "),e("h2",{attrs:{id:"🔶-react-api-とは"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#🔶-react-api-とは"}},[t._v("#")]),t._v(" 🔶 React API とは")]),t._v(" "),e("p",[t._v("React API とは、React が提供する機能のことです。React API は、React のコンポーネントを作成するために必要な機能を提供します。")]),t._v(" "),e("h2",{attrs:{id:"🔶-react-api-の種類"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#🔶-react-api-の種類"}},[t._v("#")]),t._v(" 🔶 React API の種類")]),t._v(" "),e("p",[t._v("React API には、以下の種類があります。")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("React.createElement()\n"),e("code",[t._v("React.createElement(type, [props], [...children])")])]),t._v(" "),e("ul",[e("li",[t._v("用来创建 React 元素")]),t._v(" "),e("li",[t._v("React の要素は、一度作成すると変更することができず、新しい要素を作成してレンダリングすることしかできない。")])])]),t._v(" "),e("li",[e("p",[t._v("ReactDOM.createRoot()\n"),e("code",[t._v("createRoot(container[, options])")])]),t._v(" "),e("ul",[e("li",[t._v("用来创建 React 的根容器,容器用来放置 React 元素")])])]),t._v(" "),e("li",[e("p",[t._v("ReactDOM.render()\n"),e("code",[t._v("root.render(element)")])]),t._v(" "),e("ul",[e("li",[t._v("用来将 React 元素渲染到根元素中")]),t._v(" "),e("li",[t._v("根元素中所有的内容都会被删除,被 React 元素所替换")]),t._v(" "),e("li",[t._v("当重复调用 render()时,React 会将两次的渲染结果进行比较,")]),t._v(" "),e("li",[t._v("它会确保只修改那些发生变化的元素,对 DOM 做最少的修改")])])])]),t._v(" "),e("h3",{attrs:{id:"▫️-react-createelement"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#▫️-react-createelement"}},[t._v("#")]),t._v(" ▫️ "),e("code",[t._v("React.createElement")])]),t._v(" "),e("ul",[e("li",[e("p",[t._v("React 要素を作成するためのメソッドで、DOM 要素ではなく React 要素を生成します。")])]),t._v(" "),e("li",[e("p",[t._v("DOM 要素は最終的にページに表示される要素であり、React 要素は実際に操作する要素です。")])]),t._v(" "),e("li",[e("p",[t._v("両者は仮想 DOM を介して操作され、相互に関連しています。")])]),t._v(" "),e("li",[e("p",[t._v("原則として、React 要素を操作する際には、原生の DOM 要素を直接操作せず、React の仮想 DOM 構造を壊さないように心がけるべきです。")])]),t._v(" "),e("li",[e("p",[e("code",[t._v("React.createElement")]),t._v(" 関数の戻り値は React 要素であり、React 内の仮想 DOM 構造において操作されます。")])]),t._v(" "),e("li",[e("p",[t._v("React でのイベントはキャメルケースで表記されるべきであり、例えば、onClick、onMouseOver、onMouseOut などがあります。")])]),t._v(" "),e("li",[e("p",[e("code",[t._v("React")]),t._v(" 要素は、type、props、children の 3 つのプロパティを持つオブジェクトである。")]),t._v(" "),e("ul",[e("li",[t._v("type: string | function")]),t._v(" "),e("li",[t._v("props: object")]),t._v(" "),e("li",[t._v("children: ReactElement | string | number")]),t._v(" "),e("li",[t._v("return: ReactElement")])])]),t._v(" "),e("li",[e("p",[t._v("要素の命名規則:")]),t._v(" "),e("ul",[e("li",[t._v("要素の名前: HTML タグは小文字である必要があり、React では大文字はコンポーネントとして解釈されます。")]),t._v(" "),e("li",[t._v("要素のプロパティ: オブジェクトで、キーがプロパティの名前、値がプロパティの値です。")]),t._v(" "),e("li",[t._v("要素の子要素: 1 つ以上の子要素で、テキスト、または要素、または要素の配列が可能です。")])]),t._v(" "),e("blockquote",[e("p",[t._v("注意:React において、イベントの設定と属性の設定は異なります。イベントの設定時には、属性名をキャメルケースに変更する必要があります。例えば、"),e("code",[t._v("onClick")]),t._v("は"),e("code",[t._v("onclick")]),t._v("ではなく"),e("code",[t._v("onClick")]),t._v("となります。これは、ネイティブイベントと React イベントを区別するためであり、そのため React イベントの属性名はキャメルケースである必要があります。")])]),t._v(" "),e("blockquote",[e("p",[t._v("React において、"),e("code",[t._v("onClick")]),t._v("はコードを受け取るのではなく、関数を受け取ります。これは、"),e("code",[t._v("onClick")]),t._v("がトリガーされたときに関数が実行されることを意味します。"),e("code",[t._v('onClick={() => alert("click me")}')]),t._v("のように書くと、レンダリング時に即座に実行されず、クリック時にのみ実行されます。"),e("code",[t._v('onClick={() => alert("click me")}')]),t._v("のように直接書くと、"),e("code",[t._v("onClick")]),t._v("には"),e("code",[t._v('alert("click me")')]),t._v("の戻り値が代入され、レンダリング時に実行されてしまいます。これを避け、クリック時に実行されるようにするためには、アロー関数を使用することが適切です。")])]),t._v(" "),e("ul",[e("li",[e("code",[t._v("const div = React.createElement('div', {}, button)")]),t._v(" 可以在子元素裡直接放 button 進去")])])])]),t._v(" "),e("div",{staticClass:"language-js extra-class"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div id"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"root"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//create a react element")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" button "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createElement")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"button"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("id")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btn"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'button'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("className")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'btn'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("onClick")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'clicked'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Click me"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//get the root element, 就是把dom元素轉換成react裏的根元素, 這樣才能render, 這裏的rootElement就是一個dom元素")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" rootElement "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" document"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"root"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//render the react element into the root element")]),t._v("\nReactDOM"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("render")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("button"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rootElement"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"▫️reactdom-createroot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#▫️reactdom-createroot"}},[t._v("#")]),t._v(" ▫️"),e("code",[t._v("ReactDOM.createRoot")])]),t._v(" "),e("ul",[e("li",[e("code",[t._v("ReactDOM.createRoot")]),t._v(" 関数は、React の根要素を作成するための関数です。")])]),t._v(" "),e("h3",{attrs:{id:"▫️reactdom-render"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#▫️reactdom-render"}},[t._v("#")]),t._v(" ▫️"),e("code",[t._v("ReactDOM.render")])]),t._v(" "),e("ul",[e("li",[e("code",[t._v("ReactDOM.render")]),t._v(" 関数は、React 要素をレンダリングするための関数です。")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/37.847bad24.js b/assets/js/37.847bad24.js new file mode 100644 index 00000000..beaf154f --- /dev/null +++ b/assets/js/37.847bad24.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{326:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"⚪️-react-hooks-を基礎から理解する"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-react-hooks-を基礎から理解する"}},[t._v("#")]),t._v(" ⚪️ React Hooks を基礎から理解する")]),t._v(" "),s("h2",{attrs:{id:"🔷-usestate-とは"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-usestate-とは"}},[t._v("#")]),t._v(" 🔷 useState とは")]),t._v(" "),s("p",[t._v("useState()は、関数コンポーネントで state を管理(state の保持と更新)するための React フックであり、最も利用されるフックです。")]),t._v(" "),s("p",[t._v("state とはコンポーネントが内部で保持する「状態」のことで、画面上に表示されるデータ等、アプリケーションが保持している状態を指しています。state は props と違い後から変更することができます")]),t._v(" "),s("h3",{attrs:{id:"▫️-usestate-の注意点"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-usestate-の注意点"}},[t._v("#")]),t._v(" ▫️ useState の注意点")]),t._v(" "),s("p",[s("strong",[t._v("1. Accepts a single parameter, the initial state value, which can be any data type:")])]),t._v(" "),s("blockquote",[s("p",[t._v("唯一のパラメータを受け取り、それが状態の初期値であり、初期値は任意のデータ型であることができます。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example with a string initial state")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("text"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setText"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example with a number initial state")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example with an object initial state")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("person"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setPerson"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"John"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("age")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("text"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("person"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("person"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("age"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setText")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Bye"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Change Text"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("2. Returns an array containing the state value and a method to update the state:")])]),t._v(" "),s("blockquote",[s("p",[t._v('戻り値は、状態値と状態を更新するためのメソッドが含まれた配列で、メソッド名は "set" で始まり、後に状態名が続きます。')])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example using a boolean state")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("isActive"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setIsActive"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("3. "),s("code",[t._v("useState()")]),t._v(" can be used multiple times to store multiple states:")])]),t._v(" "),s("blockquote",[s("p",[t._v("useState()は複数回使用でき、異なる状態値を保存できます。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example with two different states")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"John"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("age"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setAge"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("4. Parameter can be a function, and the initial state is determined by the function's return value. The function is only called once, it used when the initial value is dynamic.:")])]),t._v(" "),s("blockquote",[s("p",[t._v("パラメータは関数であることができ、関数が返すものが初期状態になります。関数は一度だけ呼び出され、初期の動的値の場合に使用されます。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example with a function as the initial state")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("props")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 從外部 props 中取得 count 的值,如果不存在,預設為 0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" propsCount "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" props"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("count "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 使用 useState,將初始值設置為一個函數,這個函數會在初始化時被調用一次")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 這裡可以進行一些邏輯處理,例如動態計算初始值")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" propsCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//這樣寫是有錯誤的 ❌,因為每次渲染都會調用 useState,這樣會導致每次渲染都會調用函數,這樣就不是只調用一次了。 正確寫法如下:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("props")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" props"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("count "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//這樣,這個函數就只會在渲染的時候執行。")]),t._v("\n\n")])])]),s("p",[s("strong",[t._v("5.状態の設定メソッドの引数は値または関数にすることができます(つまり、値を渡すことも、関数を渡すこともできます。関数の戻り値によって新しい状態が設定されます。")])]),t._v(" "),s("p",[s("code",[t._v("setCount()")]),t._v(" の引数は値であるか、あるいは関数であるか選択できます。関数の場合、その関数の引数は現在の状態値であり、関数の戻り値が新しい状態値となります。")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 値を渡す")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("新しい値"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 関数を渡す")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("現在のCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ここで計算やロジックを行います")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 戻り値が新しい状態値になります")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("何らかの計算")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("現在のCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example with a function as the parameter")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("handleCountChange")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// setCount(count + 1);")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("prevCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" prevCount "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleCountChange"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Change Count"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[s("strong",[t._v("6. 状態の設定メソッド自体が非同期です")])]),t._v(" "),s("p",[t._v("状態の更新は非同期で行われるため、"),s("code",[t._v("setCount")]),t._v(" を即座に呼び出しても、React はすぐに状態を更新しません。状態更新後に何らかの操作を実行する必要がある場合は、"),s("code",[t._v("useEffect")]),t._v(" を使用するか、関数式の更新で前の状態値を使用します。")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// useEffect を使用する例")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ここで何らかの操作を実行します。これは状態が更新された後に実行されます")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Count updated:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// count を useEffect の依存リストに追加することを忘れずに")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// あるいは関数式の更新で前の状態値を使用する例")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("前のCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ここで前の状態値(前のCount)を使用します")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" 前のCount "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("7. "),s("code",[t._v("useState()")]),t._v(" can be used in a custom hook:")])]),t._v(" "),s("blockquote",[s("p",[t._v("useState()はカスタムフックで使用できます。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Custom hook")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useCounter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("initialCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("initialCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("increment")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("prevCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" prevCount "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("decrement")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("prevCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" prevCount "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" increment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" decrement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Component using the custom hook")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" increment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" decrement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useCounter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("increment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Increment"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("decrement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Decrement"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("hr"),t._v(" "),s("h2",{attrs:{id:"🔶-usereducer-とは"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔶-usereducer-とは"}},[t._v("#")]),t._v(" 🔶 useReducer とは")]),t._v(" "),s("blockquote",[s("p",[s("a",{attrs:{href:"https://qiita.com/seira/items/2fbad56e84bda885c84c",target:"_blank",rel:"noopener noreferrer"}},[t._v("React hooks を基礎から理解する (useReducer 編)"),s("OutboundLink")],1)])]),t._v(" "),s("p",[t._v("状態管理のためのフックで、"),s("code",[t._v("useState")]),t._v(" と似たような機能。"),s("code",[t._v("useState")]),t._v(" は "),s("code",[t._v("useReducer")]),t._v(" に内部実装されています。")]),t._v(" "),s("p",[s("code",[t._v("(state, action) => newState")]),t._v(" という型の "),s("code",[t._v("reducer")]),t._v(" を受け取り、現在の "),s("code",[t._v("state")]),t._v(" と "),s("code",[t._v("dispatch")]),t._v(" 関数の両方を返します。")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useReducer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"初期値"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("code",[t._v("reducer")]),t._v(" は "),s("code",[t._v("state")]),t._v(" を更新するための関数で、"),s("code",[t._v("dispatch")]),t._v(" は、"),s("code",[t._v("reducer")]),t._v(" を実行するための呼び出し関数です。 (変数を宣言するときに、state の更新方法をあらかじめ設定しておくことが出来る。)\n"),s("code",[t._v("dispatch(action)")]),t._v("で実行\n"),s("code",[t._v("action")]),t._v(" は何をするのかを示すオブジェクト \n"),s("code",[t._v("{type: increment, payload: 0}")]),t._v("のように、type プロパティ("),s("code",[t._v("action")]),t._v(" の識別子)と値のプロパティで構成されている。")]),t._v(" "),s("h3",{attrs:{id:"▫️-usereducer-の注意点"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-usereducer-の注意点"}},[t._v("#")]),t._v(" ▫️ useReducer の注意点")]),t._v(" "),s("p",[s("strong",[t._v("1. "),s("code",[t._v("useReducer")]),t._v(" は "),s("code",[t._v("useState")]),t._v(" の代替ではない")])]),t._v(" "),s("blockquote",[s("p",[t._v("useState と useReducer の比較")])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("特性")]),t._v(" "),s("th",[s("code",[t._v("useState")])]),t._v(" "),s("th",[s("code",[t._v("useReducer")])])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("扱える state 的 type")]),t._v(" "),s("td",[t._v("数値、文字列、オブジェクト、論理値")]),t._v(" "),s("td",[t._v("オブジェクト、配列")])]),t._v(" "),s("tr",[s("td",[t._v("関連する state 的取り扱い")]),t._v(" "),s("td",[t._v("☓")]),t._v(" "),s("td",[t._v("複数を同時に取り扱うことが出来る")])]),t._v(" "),s("tr",[s("td",[t._v("ローカル or グローバル")]),t._v(" "),s("td",[t._v("ローカル")]),t._v(" "),s("td",[t._v("グローバル "),s("code",[t._v("useContext()")]),t._v(" と一緒に取り扱う")])])])]),t._v(" "),s("hr"),t._v(" "),s("h2",{attrs:{id:"🔷-usecontext-とは"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-usecontext-とは"}},[t._v("#")]),t._v(" 🔷 useContext とは")]),t._v(" "),s("p",[t._v("React コンポーネントのツリーに対して「グローバル」とみなすデータについて利用するように設計されています。\nコンポーネントの再利用をより難しくする為、慎重に利用しなくてはなりません。")]),t._v(" "),s("p",[t._v("Context によってコンポーネントツリー間におけるデータの橋渡しについて、すべての階層ごとに渡す必要性がなくなり、props バケツリレーをしなくても下の階層で Context に収容されているデータにアクセスできるようになりました。")]),t._v(" "),s("p",[t._v("useContext とは、Context 機能をよりシンプルに使えるようになった機能。\n親から Props で渡されていないのに、Context に収容されているデータへよりシンプルにアクセスできるというものです。")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://camo.qiitausercontent.com/d85d663b26e6c050651d65ac61d80a50ab125eb5/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3231383635362f31353330363034392d653661652d666439352d653035312d3133623633363365626636352e676966",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"https://dev.classmethod.jp/articles/react-i-checked-again-how-to-use-usecontext/",alt:"[React] useContextの使い方を改めて確認してみた"}})]),t._v(" "),s("hr"),t._v(" "),s("ul",[s("li",[t._v("without useReducer")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useState "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("props")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" props"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Child "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("count "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("add"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Parent")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("props")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" props"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Parent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Child count"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("MyApp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Root "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Parent count"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" container "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"root"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" root "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ReactDOM"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createRoot")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("container"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nroot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("render")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyApp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("The above code leads to the problem that the more nested levels are, the more props are passed, and the more difficult the code is to maintain.")])]),t._v(" "),s("ul",[s("li",[t._v("useReducer 使わない場合")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" createContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useContext "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1. Create a context object")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" MyContext "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 3. Retrieve values from the context object using useContext and destructure the object")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("MyContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Child "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("count "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("add"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Parent")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// const { count, setCount } = props;")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 4. Retrieve values from the context object using useContext and destructure the object")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" count "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("MyContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Parent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* \n Child component can access context values directly */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Child"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("Child"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("MyApp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 2. Configure the context provider and pass the value.\n The 'value' prop contains the data to be passed, and all child components,\n including nested ones, can access it using useContext. */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Provider value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Root "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Parent component can access context values directly */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Parent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("MyContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Provider"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" container "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"root"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" root "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ReactDOM"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createRoot")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("container"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nroot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("render")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyApp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ul",[s("li",[t._v("useReducer と useContext を使わない場合")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" createContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useReducer "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Define the initial state and reducer function")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" initialState "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("count")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reducer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" action")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("switch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"increment"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("count")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("count "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a context object")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" MyContext "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Retrieve values from the context object using useContext and destructure the object")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dispatch "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("MyContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Child "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"increment"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("add"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Parent")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Retrieve values from the context object using useContext and destructure the object")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" state "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("MyContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Parent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Child component can access context values directly */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Child "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("MyApp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Use useReducer to manage state")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useReducer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" initialState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Configure the context provider and pass the value */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Provider value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dispatch "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("Root "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("h2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Parent component can access context values directly */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Parent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("MyContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Provider"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" container "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"root"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" root "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ReactDOM"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createRoot")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("container"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nroot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("render")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyApp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"🔷-useeffect-とは"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-useeffect-とは"}},[t._v("#")]),t._v(" 🔷 useEffect とは")]),t._v(" "),s("p",[t._v("'useEffect' を使うと、'useEffect' に渡された関数はレンダーの結果が画面に反映された後に動作します。\nつまり 'useEffect' とは、「関数の実行タイミングを React のレンダリング後まで遅らせる 'hook'」です。")]),t._v(" "),s("p",[t._v("副作用の処理(DOM の書き換え、変数代入、API 通信など UI 構築以外の処理)を関数コンポーネントで扱えます。\nクラスコンポーネントでのライフサイクルメソッドに当たります。")]),t._v(" "),s("p",[t._v("'componentDidMount'\n'componentDidUpdate'\n'componentWillUnmount'")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://ja.legacy.reactjs.org/docs/hooks-effect.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("副作用フックの利用法\n"),s("OutboundLink")],1)]),t._v(" "),s("h3",{attrs:{id:"▫️-副作用を実行、制御するために-useeffect-を利用する"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-副作用を実行、制御するために-useeffect-を利用する"}},[t._v("#")]),t._v(" ▫️ 副作用を実行、制御するために useEffect を利用する")]),t._v(" "),s("p",[t._v("useEffect()の基本構文は以下の通りです。関数コンポーネントのトップレベルで宣言します。")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token regex"}},[s("span",{pre:!0,attrs:{class:"token regex-delimiter"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token regex-source language-regex"}},[t._v("_ 第 1 引数には実行させたい副作用関数を記述_")]),s("span",{pre:!0,attrs:{class:"token regex-delimiter"}},[t._v("/")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"副作用関数が実行されました!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("依存する変数の配列"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 第 2 引数には副作用関数の実行タイミングを制御する依存データを記述")]),t._v("\n")])])]),s("p",[t._v("第 2 引数を指定することにより、第 1 引数に渡された副作用関数の実行タイミングを制御することができます。React は第 2 引数の依存配列の中身の値を比較して、副作用関数をスキップするかどうかを判断します。")]),t._v(" "),s("h3",{attrs:{id:"▫️-執行時機"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-執行時機"}},[t._v("#")]),t._v(" ▫️ 執行時機")]),t._v(" "),s("p",[t._v("可以把"),s("code",[t._v("useEffect")]),t._v(" 函數卡奴走 componentDidiMount、componentDidUpdate、componentWillUnmount 三個生命週期函數的組合體。")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("useEffect(() => {}); componentDidMount + componentDidUpdate;")])]),t._v(" "),s("li",[s("code",[t._v("useEffect(() => {}, []); componentDidMount;")])]),t._v(" "),s("li",[s("code",[t._v("useEffect(() => () => {}); componentWillUnmount;")])])]),t._v(" "),s("p",[t._v("以下是 "),s("code",[t._v("useEffect")]),t._v(" 的理解:")]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[s("code",[t._v("useEffect(() => {});")]),t._v(" - "),s("code",[t._v("componentDidMount")]),t._v(" + "),s("code",[t._v("componentDidUpdate")]),t._v(":")])]),t._v(" "),s("ul",[s("li",[t._v("この形式の "),s("code",[t._v("useEffect")]),t._v(" は、コンポーネントのレンダリング後に実行され、コンポーネントが更新されるたびにも実行されます。")]),t._v(" "),s("li",[s("code",[t._v("componentDidMount")]),t._v(" と "),s("code",[t._v("componentDidUpdate")]),t._v(" の組み合わせに相当します。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ここにあるコードはコンポーネントのレンダリング後および更新時に実行されます")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("li",[s("p",[s("strong",[s("code",[t._v("useEffect(() => {}, []);")]),t._v(" - "),s("code",[t._v("componentDidMount")]),t._v(":")])]),t._v(" "),s("ul",[s("li",[t._v("この形式の "),s("code",[t._v("useEffect")]),t._v(" は、コンポーネントのレンダリング後にのみ実行され、コンポーネントの更新時には実行されません。")]),t._v(" "),s("li",[s("code",[t._v("componentDidMount")]),t._v(" だけが実行された場合と同じです。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ここにあるコードはコンポーネントのレンダリング後に一度だけ実行されます")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("li",[s("p",[s("strong",[s("code",[t._v("useEffect(() => () => {});")]),t._v(" - "),s("code",[t._v("componentWillUnmount")]),t._v(":")])]),t._v(" "),s("ul",[s("li",[t._v("この形式の "),s("code",[t._v("useEffect")]),t._v(" では、返り値として返された関数はコンポーネントがアンマウント(消える)される際に実行され、"),s("code",[t._v("componentWillUnmount")]),t._v(" に相当します。")]),t._v(" "),s("li",[t._v("返り値として返された関数はコンポーネントがアンマウントされる前に実行され、リソースのクリーンアップや購読の解除に使用できます。")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ここにあるコードはコンポーネントのレンダリング後に実行されます")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 返り値として返された関数はコンポーネントがアンマウントされる前に実行されます")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// リソースのクリーンアップや購読の解除などのコード")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"▫️-useeffect-の使い方"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-useeffect-の使い方"}},[t._v("#")]),t._v(" ▫️ useEffect の使い方")]),t._v(" "),s("ol",[s("li",[t._v("為 window 對象添加滾動事件 - "),s("code",[t._v("componentDidMount")]),t._v(" + "),s("code",[t._v("componentDidUpdate")])])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useEffect "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onScroll")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"onScroll"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 組件渲染後,添加滾動事件")]),t._v("\n window"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEventListener")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"scroll"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" onScroll"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 組件卸載時,移除滾動事件")]),t._v("\n window"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeEventListener")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"scroll"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" onScroll"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("App"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" App"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[t._v("定時器:掛載定時器,要在組件渲染後才能掛載,所以要在 useEffect 中掛載定時器")])]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useEffect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useState "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" ReactDom "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react-dom"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" timerId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setInterval")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("count "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clearInterval")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timerId"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("span"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("span"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" ReactDOM"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unmountComponentAtNode")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n 卸載組件\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("div"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"▫️-useeffect-依賴項"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-useeffect-依賴項"}},[t._v("#")]),t._v(" ▫️ useEffect 依賴項")]),t._v(" "),s("blockquote",[s("p",[t._v("依存配列の値が変化した場合のみ副作用関数を実行させる\nuseEffect()の第2引数に[count]を渡すと、count に変化があったときだけ副作用関数を実行します。")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useEffect "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" makeStyles "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"@material-ui/core/styles"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" ButtonGroup "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"@material-ui/core/ButtonGroup"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Button "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"@material-ui/core/Button"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Input "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"@material-ui/core/Input"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" useStyles "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("makeStyles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("theme")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("root")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"& > *"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("margin")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" theme"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("spacing")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("EffectFunc")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" classes "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useStyles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("lastName")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("firstName")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("回クリックされました")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("回クリックされました")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ButtonGroup color"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"primary"')]),t._v(" aria"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("label"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"outlined primary button group"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("prev")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" prev "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("ボタン"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("Button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Button onClick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("リセット"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("Button"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("ButtonGroup"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("私の名前は")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("lastName"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("firstName"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("です")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("form className"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("classes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("root"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" noValidate autoComplete"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"off"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Input\n placeholder"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"姓"')]),t._v("\n value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("lastName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n onChange"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("e")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("lastName")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Input\n placeholder"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"名"')]),t._v("\n value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("firstName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n onChange"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("e")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("firstName")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" e"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("form"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" EffectFunc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"🔷-useref-とは"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-useref-とは"}},[t._v("#")]),t._v(" 🔷 useRef とは")]),t._v(" "),s("p",[s("code",[t._v("useRef")]),t._v(" 是 React 提供的一个 Hook,其主要特点是用于在函数组件中保存和访问可变的引用。以下是 "),s("code",[t._v("useRef")]),t._v(" 的主要特点:")]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("保存可变的引用:")]),t._v(" "),s("code",[t._v("useRef")]),t._v(" 创建一个对象,该对象的 "),s("code",[t._v("current")]),t._v(" 属性可以被赋值为任何可变的值。这使得在整个组件的生命周期内都可以访问和修改该值,而不引发组件重新渲染。")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("不触发重新渲染:")]),t._v(" 当 "),s("code",[t._v("useRef")]),t._v(" 的 "),s("code",[t._v("current")]),t._v(" 属性被修改时,不会触发组件的重新渲染。这使得它非常适合存储不需要引起视图更新的数据,例如 DOM 元素引用、定时器 ID、或其他持久性数据。")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("持久性数据存储:")]),t._v(" "),s("code",[t._v("useRef")]),t._v(" 创建的引用是持久的,即使组件重新渲染,引用仍然保持不变。这与 "),s("code",[t._v("useState")]),t._v(" 不同,后者在重新渲染时会创建新的状态。")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("访问 DOM 元素:")]),t._v(" "),s("code",[t._v("useRef")]),t._v(" 常用于引用 DOM 元素。当 "),s("code",[t._v("ref")]),t._v(" 属性附加到 JSX 元素上时,"),s("code",[t._v("useRef")]),t._v(" 的 "),s("code",[t._v("current")]),t._v(" 属性将持有该元素的引用。")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("适用于保存上一个值:")]),t._v(" "),s("code",[t._v("useRef")]),t._v(" 也常用于保存上一个状态值,因为它不会引发重新渲染,可以在渲染期间保留其值。")])])]),t._v(" "),s("p",[t._v("下面是一个简单的示例,演示了 "),s("code",[t._v("useRef")]),t._v(" 保存 DOM 元素引用的情况:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useEffect "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("ExampleComponent")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" inputRef "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" useRef "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" HTMLInputElement "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在组件挂载后,通过 inputRef.current 访问 input 元素")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("focus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("input ref"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("在这个例子中,"),s("code",[t._v("inputRef")]),t._v(" 用于引用 "),s("code",[t._v("input")]),t._v(" 元素,而不需要通过 "),s("code",[t._v("document.getElementById")]),t._v(" 或其他方式获取。")]),t._v(" "),s("blockquote",[s("p",[t._v("key characteristics of the "),s("code",[t._v("useRef")]),t._v(" hook:")])]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("Mutable Reference:")]),t._v(" "),s("code",[t._v("useRef")]),t._v(" creates a mutable object that persists across renders.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Preservation of Value:")]),t._v(" The value assigned to "),s("code",[t._v("current")]),t._v(" property of the "),s("code",[t._v("useRef")]),t._v(" object persists between renders.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Doesn't Trigger Re-renders:")]),t._v(" Updating the "),s("code",[t._v("current")]),t._v(" property of a "),s("code",[t._v("useRef")]),t._v(" does not trigger a re-render of the component.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Preserving Values Without Re-renders:")]),t._v(" It's useful for holding values that need to be preserved between renders but don't require triggering a re-render.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Common Use Cases:")])])])]),t._v(" "),s("ul",[s("li",[t._v("Managing and maintaining references to DOM elements.")]),t._v(" "),s("li",[t._v("Holding values that should persist without causing re-renders.")]),t._v(" "),s("li",[t._v("Storing mutable values without triggering component updates.")])]),t._v(" "),s("ol",{attrs:{start:"6"}},[s("li",[s("p",[s("strong",[t._v("When to Use:")]),t._v(" "),s("code",[t._v("useRef")]),t._v(" is useful for managing and maintaining references to DOM elements, storing mutable values that don't trigger re-renders, and storing mutable values that you want to persist across renders.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("When Not to Use:")]),t._v(" "),s("code",[t._v("useRef")]),t._v(" should not be used to manage state or trigger re-renders.")])])]),t._v(" "),s("blockquote",[s("p",[s("strong",[t._v("Note:")]),t._v(" "),s("code",[t._v("useRef")]),t._v(" is not a replacement for "),s("code",[t._v("useState")]),t._v(". Always use "),s("code",[t._v("useState")]),t._v(" when you need to manage state that changes over time. "),s("code",[t._v("useRef")]),t._v(" is useful for storing mutable values that don't change over time, such as a reference to a DOM node or a value computed in a previous render.")])]),t._v(" "),s("blockquote",[s("p",[s("strong",[t._v("Note:")]),t._v(" "),s("code",[t._v("useRef")]),t._v(" returns a mutable ref object whose "),s("code",[t._v(".current")]),t._v(" property is initialized to the passed argument ("),s("code",[t._v("initialValue")]),t._v("). The returned object will persist for the full lifetime of the component.")])]),t._v(" "),s("blockquote",[s("p",[s("strong",[t._v("Note:")]),t._v(" "),s("code",[t._v("useRef()")]),t._v(" is useful for more than the "),s("code",[t._v("ref")]),t._v(" attribute. It’s handy for keeping any mutable value around similar to how you’d use instance fields in classes.")])]),t._v(" "),s("h2",{attrs:{id:"🔷-usecallback-とは"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-usecallback-とは"}},[t._v("#")]),t._v(" 🔷 useCallback とは")]),t._v(" "),s("h3",{attrs:{id:"🔺-example"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔺-example"}},[t._v("#")]),t._v(" 🔺 Example")]),t._v(" "),s("p",[t._v("在實際應用中,"),s("code",[t._v("useCallback")]),t._v(" 的使用場景通常涉及到優化性能,特別是在 React 應用中傳遞回調函數給子組件的情況。以下是一個實際應用的例子:")]),t._v(" "),s("p",[t._v('假設你有一個點餐應用(類似 SkipTheDishes),你有一個頁面顯示用戶的訂單列表。每個訂單都有一個狀態,比如"已下單"、"準備中"、"配送中"等。你的應用可能會有一個組件來顯示單個訂單的詳細信息,並且你希望在點擊"更新狀態"按鈕時觸發一個回調函數來更新訂單的狀態。')]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useCallback "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("OrderDetails")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" onUpdateStatus "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" handleUpdateStatus "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useCallback")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在這裡處理更新訂單狀態的邏輯")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("onUpdateStatus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" newStatus"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("onUpdateStatus"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" newStatus"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 顯示訂單詳細信息 */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("p")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Order ID: ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("p")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Status: ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 更新狀態按鈕 */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleUpdateStatus"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Update Status")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("OrderList")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" orders "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" handleUpdateStatus "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useCallback")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("orderId"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" newStatus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在這裡處理更新訂單狀態的邏輯")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 這個函數可能會在 OrderDetails 組件中使用,因此使用 useCallback 進行優化")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Updating status of order ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("orderId"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" to ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("newStatus"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Order List")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 顯示訂單列表 */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("orders"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("order")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OrderDetails")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("key")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("order")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onUpdateStatus")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleUpdateStatus"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("SkipTheDishesApp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("orders"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setOrders"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 初始訂單數據 */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OrderList")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("orders")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("orders"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("在這個例子中,"),s("code",[t._v("handleUpdateStatus")]),t._v(' 函數是一個回調函數,當你點擊"Update Status"按鈕時,這個函數會被觸發。由於它被傳遞給 '),s("code",[t._v("OrderDetails")]),t._v(" 組件,我們使用 "),s("code",[t._v("useCallback")]),t._v(" 來確保它只在 "),s("code",[t._v("onUpdateStatus")]),t._v("、"),s("code",[t._v("order.id")]),t._v(" 或 "),s("code",[t._v("newStatus")]),t._v(" 改變時才重新創建。這樣可以避免不必要的組件重新渲染,提高應用性能。")])]),t._v(" "),s("hr"),t._v(" "),s("h2",{attrs:{id:"🔷-usememo-とは"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-usememo-とは"}},[t._v("#")]),t._v(" 🔷 useMemo とは")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://www.joshwcomeau.com/react/usememo-and-usecallback/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Understanding useMemo and useCallback-Josh"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"🔶-hooks-compare"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔶-hooks-compare"}},[t._v("#")]),t._v(" 🔶 Hooks compare")]),t._v(" "),s("h3",{attrs:{id:"▫️-usecallback-vs-usememo"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-usecallback-vs-usememo"}},[t._v("#")]),t._v(" ▫️ useCallback vs useMemo")]),t._v(" "),s("blockquote",[s("p",[s("code",[t._v("useMemo")]),t._v(" 和 "),s("code",[t._v("useCallback")]),t._v("接收的参数都是一样,都是在其依赖项发生变化后才执行,都是返回缓存的值,区别在于 "),s("code",[t._v("useMemo")]),t._v(" 返回的是函数运行的结果,"),s("code",[t._v("useCallback")]),t._v(" 返回的是函数,这个回调函数是经过处理后的也就是说父组件传递一个函数给子组件的时候,由于是无状态组件每一次都会重新生成新的 "),s("code",[t._v("props")]),t._v(" 函数,这样就使得每一次传递给子组件的函数都发生了变化,这时候就会触发子组件的更新,这些更新是没有必要的,此时我们就可以通过 "),s("code",[t._v("useCallback")]),t._v(" 来处理此函数,然后作为 props 传递给子组件。")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 用react.memo */")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" DemoChildren "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("memo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("props")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 只有初始化的时候打印了 子组件更新 */")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"子组件更新"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n props"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInfo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"子组件"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("子组件")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("DemoUseCallback")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" id "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("number"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setNumber"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 此时usecallback的第一参数 (sonName)=>{ console.log(sonName) }\n 经过处理赋值给 getInfo */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" getInfo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useCallback")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("sonName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sonName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 点击按钮触发父组件更新 ,但是子组件没有更新 */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setNumber")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("number "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("增加")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DemoChildren")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("getInfo")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("getInfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/38.2cfb7649.js b/assets/js/38.2cfb7649.js new file mode 100644 index 00000000..fb6625f0 --- /dev/null +++ b/assets/js/38.2cfb7649.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{324:function(t,e,s){"use strict";s.r(e);var r=s(14),a=Object(r.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"react-redux-を基礎から理解する"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#react-redux-を基礎から理解する"}},[this._v("#")]),this._v(" React Redux を基礎から理解する")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/39.ae4e90ef.js b/assets/js/39.ae4e90ef.js new file mode 100644 index 00000000..ed1242d8 --- /dev/null +++ b/assets/js/39.ae4e90ef.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{325:function(e,t,r){"use strict";r.r(t);var a=r(14),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"typescript-reference-guide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#typescript-reference-guide"}},[e._v("#")]),e._v(" Typescript Reference Guide")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/intro.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TypeScript Handbook"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://qiita.com/kamenaris/items/8393c08dde3584d5e6ba",target:"_blank",rel:"noopener noreferrer"}},[e._v("TypeScript で型をご安全に メモ"),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://chodocs.cn/ts/ch4.html",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"shortcut-reference"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#shortcut-reference"}},[e._v("#")]),e._v(" Shortcut Reference")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/basic-types.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Basic Types"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/interfaces.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Interfaces"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/classes.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Classes"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/functions.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Functions"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/generics.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Generics"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/enums.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Enums"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/type-inference.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Type Inference"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/type-compatibility.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Type Compatibility"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/advanced-types.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Advanced Types"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/symbols.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Symbols"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Iterators and Generators"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/modules.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Modules"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/namespaces.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Namespaces"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"table-of-contents"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#table-of-contents"}},[e._v("#")]),e._v(" Table of Contents")]),e._v(" "),t("ul",[t("li",[t("p",[t("a",{attrs:{href:"#basic-types"}},[e._v("Basic Types")])]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#boolean"}},[e._v("Boolean")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#number"}},[e._v("Number")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#string"}},[e._v("String")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#array"}},[e._v("Array")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#tuple"}},[e._v("Tuple")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#enum"}},[e._v("Enum")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#any"}},[e._v("Any")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#void"}},[e._v("Void")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#null-and-undefined"}},[e._v("Null and Undefined")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#never"}},[e._v("Never")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#object"}},[e._v("Object")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#type-assertions"}},[e._v("Type Assertions")])])])]),e._v(" "),t("li",[t("p",[t("a",{attrs:{href:"#advanced-types"}},[e._v("advanced-types")])]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#intersection-types"}},[e._v("Intersection Types")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#union-types"}},[e._v("Union Types")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#type-guards-and-differentiating-types"}},[e._v("Type Guards and Differentiating Types")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#type-aliases"}},[e._v("Type Aliases")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#string-literal-types"}},[e._v("String Literal Types")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#numeric-literal-types"}},[e._v("Numeric Literal Types")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#enum-member-types"}},[e._v("Enum Member Types")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#discriminated-unions"}},[e._v("Discriminated Unions")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#polymorphic-this-types"}},[e._v("Polymorphic this types")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#index-types"}},[e._v("Index types")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#mapped-types"}},[e._v("Mapped types")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#key-remapping-via-as"}},[e._v("Key Remapping via as")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#conditional-types"}},[e._v("Conditional Types")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#predefined-conditional-types"}},[e._v("Predefined conditional types")])])])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/4.9eb8282d.js b/assets/js/4.9eb8282d.js new file mode 100644 index 00000000..7e6e4f57 --- /dev/null +++ b/assets/js/4.9eb8282d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{277:function(t,e,n){},291:function(t,e,n){"use strict";n(277)},313:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:(t,{props:e,slots:n})=>t("span",{class:["badge",e.type],style:{verticalAlign:e.vertical}},e.text||n().default)},p=(n(291),n(14)),l=Object(p.a)(i,void 0,void 0,!1,null,"15b7b770",null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/40.2b6981d1.js b/assets/js/40.2b6981d1.js new file mode 100644 index 00000000..ff2c201e --- /dev/null +++ b/assets/js/40.2b6981d1.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{330:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"⚪️-typescript-advanced-knowledge"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-typescript-advanced-knowledge"}},[t._v("#")]),t._v(" ⚪️ TypeScript Advanced Knowledge")]),t._v(" "),s("h2",{attrs:{id:"type-aliases"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#type-aliases"}},[t._v("#")]),t._v(" Type Aliases")]),t._v(" "),s("p",[t._v("Type aliases are used to give a new name to a type, often used with union types.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Name")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Type Alias Name: This creates a type alias NameResolver for a function that takes no parameters and returns a string. It represents a function that resolves a name.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NameResolver")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Type Alias NameOrResolver: NameOrResolver is a union type alias that can be either a Name (string) or a NameResolver (function returning string). This allows flexibility in accepting different types for the getName function.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NameOrResolver")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" NameResolver"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Function getName: The getName function takes a parameter x of type NameOrResolver. If x is a string, it's returned directly. If it's a function, the function is invoked to get the name. This function illustrates the flexibility provided by type aliases.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" NameOrResolver"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("x")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h4",{attrs:{id:"advantages"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#advantages"}},[t._v("#")]),t._v(" Advantages:")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("Readability:")]),t._v(" "),s("ul",[s("li",[t._v("Type aliases allow you to give meaningful names to types, improving code readability.\nIn this example, Name, NameResolver, and NameOrResolver make the code more self-explanatory.")])])]),t._v(" "),s("li",[s("p",[t._v("Reusability:")]),t._v(" "),s("ul",[s("li",[t._v("Type aliases promote the reuse of types throughout your codebase.\nIf you need to represent a name or a function that resolves a name in multiple places, using type aliases avoids redundancy.")])])]),t._v(" "),s("li",[s("p",[t._v("Flexibility:")]),t._v(" "),s("ul",[s("li",[t._v("By combining different types into a union (NameOrResolver), you gain flexibility in function parameters.\nThis flexibility allows the getName function to accept either a name or a name resolver function.")])])])]),t._v(" "),s("h2",{attrs:{id:"string-literal-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#string-literal-types"}},[t._v("#")]),t._v(" String Literal Types")]),t._v(" "),s("p",[t._v("Restrict values to a specific set of string literals.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EventNames")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"click"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"scroll"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mousemove"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("handleEvent")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("el"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Element"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" event"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" EventNames"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// do something")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("handleEvent")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" Element"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"scroll"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("handleEvent")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" Element"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jump"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// error")]),t._v("\n")])])]),s("h2",{attrs:{id:"tuples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tuples"}},[t._v("#")]),t._v(" Tuples")]),t._v(" "),s("blockquote",[s("p",[t._v("Arrays store elements of the same type, while tuples store elements of different types.")])]),t._v(" "),s("ol",[s("li",[t._v("Tuple types allow you to express an array with a fixed number of elements whose types are known, but need not be the same.")]),t._v(" "),s("li",[t._v("When accessing or modifying elements with a known index, the correct type is returned.")]),t._v(" "),s("li",[t._v('During initialization, all internal elements must be included unless the element is marked as "optional."')])]),t._v(" "),s("h3",{attrs:{id:"accessing-tuple-elements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#accessing-tuple-elements"}},[t._v("#")]),t._v(" Accessing Tuple Elements")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" john"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"John"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" kevin"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1.")]),t._v("\njohn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"johnny dept"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\njohn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"100"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// error")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 2.")]),t._v("\nkevin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Kevin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Initializing with missing elements will result in an error unless the element is optional.")]),t._v("\n")])])]),s("h3",{attrs:{id:"tuple-overflow"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tuple-overflow"}},[t._v("#")]),t._v(" Tuple Overflow")]),t._v(" "),s("p",[t._v("When adding elements beyond the original tuple limit, the type is restricted to the union type of each type in the tuple.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" tom"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tom"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ntom"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"male"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ntom"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Type 'boolean' is not assignable to type 'string | number'. ts(2345)")]),t._v("\n")])])]),s("h2",{attrs:{id:"enum"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#enum"}},[t._v("#")]),t._v(" Enum")]),t._v(" "),s("p",[t._v("Enums are used to define a set of named constants, making it easier to document or identify code.\nSure, here are the explanations in English:")]),t._v(" "),s("h3",{attrs:{id:"incremental-enum"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#incremental-enum"}},[t._v("#")]),t._v(" Incremental Enum:")]),t._v(" "),s("p",[t._v("In TypeScript, an incremental enum refers to a numeric enum where each member's value automatically increases. Here's an example:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Numeric Enum (increases by default)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),t._v(" Weekday "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Monday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 0")]),t._v("\n Tuesday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1")]),t._v("\n Wednesday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 2")]),t._v("\n Thursday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 3")]),t._v("\n Friday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 4")]),t._v("\n Saturday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 5")]),t._v("\n Sunday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 6")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Usage")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" today "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Weekday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Wednesday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("today"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Outputs: 2")]),t._v("\n")])])]),s("p",[t._v("In this example, "),s("code",[t._v("Weekday")]),t._v(" is a numeric enum, and its members automatically increase starting from 0. If no value is specified for a member, TypeScript increments it based on the value of the preceding member.")]),t._v(" "),s("p",[t._v("If you manually set a value for a member and want subsequent members to increment automatically, you can do it like this:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),t._v(" Weekday "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Monday "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1")]),t._v("\n Tuesday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 2")]),t._v("\n Wednesday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 3")]),t._v("\n Thursday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 4")]),t._v("\n Friday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 5")]),t._v("\n Saturday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 6")]),t._v("\n Sunday"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 7")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Here, "),s("code",[t._v("Monday")]),t._v(" is manually set to 1, and the following members will increment accordingly. This kind of enum can enhance code clarity and readability in certain situations.")]),t._v(" "),s("h3",{attrs:{id:"string-enum"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#string-enum"}},[t._v("#")]),t._v(" String Enum:")]),t._v(" "),s("p",[t._v("String enums in TypeScript are enums where each member has an associated string value. They are beneficial for serialization and debugging because the runtime values are meaningful and readable. Here's an example:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// String Enum")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),t._v(" Direction "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Up "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UP"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Down "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DOWN"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Left "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LEFT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Right "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"RIGHT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Usage")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" myDirection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Direction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myDirection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// Outputs: "LEFT"')]),t._v("\n")])])]),s("h3",{attrs:{id:"heterogeneous-enum"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#heterogeneous-enum"}},[t._v("#")]),t._v(" heterogeneous enum")]),t._v(" "),s("p",[t._v("In this example, "),s("code",[t._v("Direction")]),t._v(" is a string enum where each member has an associated string value. This allows for more meaningful representations during runtime, especially when debugging or serializing enum values.\nHeterogeneous Enums refer to enums where the member values have different data types. This situation typically occurs in enums that mix numeric and string members. Here's an example of a heterogeneous enum:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),t._v(" Status "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Success "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n NotFound "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Not Found"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Error "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Internal Server Error"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Usage")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" successStatus"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Status "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Success"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" notFoundStatus"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Status "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("NotFound"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" errorStatus"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Status "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("successStatus"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Outputs: 200")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("notFoundStatus"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// Outputs: "Not Found"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("errorStatus"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// Outputs: "Internal Server Error"')]),t._v("\n")])])]),s("p",[t._v("In this example, the "),s("code",[t._v("Status")]),t._v(" enum has three members, each with a different data type for its value. One member has a numeric value ("),s("code",[t._v("Success")]),t._v("), and the other two have string values ("),s("code",[t._v("NotFound")]),t._v(" and "),s("code",[t._v("Error")]),t._v("). This allows the enum to represent status codes or messages with different data types, and you can choose the appropriate member based on the context. The usage of heterogeneous enums is relatively less common and is typically employed when handling data of different types simultaneously.")]),t._v(" "),s("h3",{attrs:{id:"interface-enum"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#interface-enum"}},[t._v("#")]),t._v(" interface enum")]),t._v(" "),s("p",[t._v("In TypeScript, "),s("code",[t._v("enum")]),t._v(" is commonly used to define a set of named numeric constants, while "),s("code",[t._v("interface")]),t._v(" is used to define the structure of objects. These two concepts are typically used for different purposes, where one represents a group of related constants, and the other represents the shape of objects.")]),t._v(" "),s("p",[t._v("Here is an example using both "),s("code",[t._v("enum")]),t._v(" and "),s("code",[t._v("interface")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Define a set of direction constants using enum")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),t._v(" Direction "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Up "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UP"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Down "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DOWN"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Left "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LEFT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Right "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"RIGHT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Define the structure of an object with coordinates and direction using interface")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")])]),t._v(" Point "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n y"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n direction"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Direction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using constants from the enum")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create an object adhering to the Point interface using the defined enum")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" point"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Point "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n y"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n direction"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Direction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("point"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"const-enum"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#const-enum"}},[t._v("#")]),t._v(" const enum")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://www.konosumi.net/entry/2021/05/09/130648",alt:"TypeScriptにおけるenumとconst enumの違いを、tscのコンパイル結果から確認してみる"}})]),t._v(" "),s("p",[s("img",{attrs:{src:"https://qiita.com/kat0/items/d8e6f9f5eda1e17caa50",alt:"enumとconstsの使い分け"}})]),t._v(" "),s("h3",{attrs:{id:"reverse-mapping"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#reverse-mapping"}},[t._v("#")]),t._v(" Reverse mapping")]),t._v(" "),s("p",[t._v("Reverse mapping refers to the capability in an enum type where, in addition to the normal mapping from names to values, there is also a mapping from enum values back to their names. This feature provides more flexibility in certain programming scenarios.")]),t._v(" "),s("p",[t._v("In TypeScript, when you assign initial values to enum members, TypeScript automatically generates both forward mapping (from enum names to values) and reverse mapping (from enum values to names). Here's an example:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),t._v(" Direction "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Up "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UP"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Down "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DOWN"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Left "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LEFT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Right "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"RIGHT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Forward mapping")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Direction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Up"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Output: UP")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Reverse mapping")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Direction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UP"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Output: Up")]),t._v("\n")])])]),s("p",[t._v("In this example, the value of the enum member "),s("code",[t._v("Direction.Up")]),t._v(" is the string "),s("code",[t._v('"UP"')]),t._v(". Through "),s("code",[t._v('Direction["UP"]')]),t._v(", you can retrieve the name of this member, which is "),s("code",[t._v('"Up"')]),t._v(". This illustrates the concept of reverse mapping, where you find the corresponding name based on the enum value.")]),t._v(" "),s("p",[t._v("Reverse mapping can be useful in various scenarios, such as generating labels on the user interface based on enum values or determining enum values based on user-inputted strings.")]),t._v(" "),s("p",[t._v("In this example, "),s("code",[t._v("enum Direction")]),t._v(" defines four constants representing different directions, and then "),s("code",[t._v("interface Point")]),t._v(" defines the structure of an object with "),s("code",[t._v("x")]),t._v(", "),s("code",[t._v("y")]),t._v(", and "),s("code",[t._v("direction")]),t._v(" properties, where "),s("code",[t._v("direction")]),t._v(" uses constants from the "),s("code",[t._v("Direction")]),t._v(" enum. Finally, an object "),s("code",[t._v("point")]),t._v(" is created that conforms to the structure defined by the "),s("code",[t._v("Point")]),t._v(" interface.")]),t._v(" "),s("h2",{attrs:{id:"classes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#classes"}},[t._v("#")]),t._v(" Classes")]),t._v(" "),s("blockquote",[s("p",[t._v("While JavaScript has the concept of classes, many JavaScript programmers may not be very familiar with classes. Here's a brief introduction to class-related concepts:")])]),t._v(" "),s("ul",[s("li",[s("p",[s("strong",[t._v("Class")]),t._v(": Defines the abstract characteristics of a thing, including its properties and methods.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Object")]),t._v(": An instance of a class, created through the "),s("code",[t._v("new")]),t._v(" keyword.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Object-Oriented Programming (OOP) Three Pillars")]),t._v(": Encapsulation, Inheritance, and Polymorphism.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Encapsulation")]),t._v(": Hides the details of data operations, exposing only the necessary interfaces. It ensures that external callers can interact with the object through provided interfaces without knowing the internal details.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Inheritance")]),t._v(": A mechanism where a subclass inherits properties and behaviors from a superclass. The subclass retains the characteristics of the superclass and may have additional features.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Polymorphism")]),t._v(": Different classes related through inheritance can respond to the same method in different ways. For example, a "),s("code",[t._v("Cat")]),t._v(" and a "),s("code",[t._v("Dog")]),t._v(" both inheriting from an "),s("code",[t._v("Animal")]),t._v(" class may have different implementations of the "),s("code",[t._v("eat")]),t._v(" method.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Accessors (Getter & Setter)")]),t._v(": Methods to change the reading and assigning behavior of properties.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Modifiers (Access Modifiers)")]),t._v(": Keywords that limit the nature of members or types, such as "),s("code",[t._v("public")]),t._v(" indicating a public property or method.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Abstract Class")]),t._v(": A base class meant for other classes to inherit from. Instances of an abstract class cannot be created, and abstract methods within it must be implemented by its subclasses.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Interfaces")]),t._v(": Common properties or methods shared among different classes, abstracted into an interface. Classes can implement (or adhere to) multiple interfaces.")])])]),t._v(" "),s("h3",{attrs:{id:"readonly"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#readonly"}},[t._v("#")]),t._v(" "),s("code",[t._v("readonly")])]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("readonly")]),t._v(" keyword is used to declare read-only properties and can only appear in property declarations or index signatures.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n readonly name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("constructor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" a "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Jack'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Jack")]),t._v("\na"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Tom'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// index.ts(10,3): TS2540: Cannot assign to 'name' because it is a read-only property.")]),t._v("\n")])])]),s("p",[t._v("Note that if "),s("code",[t._v("readonly")]),t._v(" is used along with other access modifiers, it should come after them.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// public readonly name;")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("constructor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" readonly name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"instance-properties"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#instance-properties"}},[t._v("#")]),t._v(" Instance Properties")]),t._v(" "),s("p",[t._v("In ES7 proposals, instance properties can be defined directly inside the class.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Jack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"static-properties"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#static-properties"}},[t._v("#")]),t._v(" Static Properties")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" num "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("42")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"access-modifiers"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#access-modifiers"}},[t._v("#")]),t._v(" Access Modifiers")]),t._v(" "),s("p",[t._v("In TypeScript, access modifiers include "),s("code",[t._v("public")]),t._v(", "),s("code",[t._v("private")]),t._v(", and "),s("code",[t._v("protected")]),t._v(".")]),t._v(" "),s("ul",[s("li",[s("p",[s("strong",[s("code",[t._v("public")])]),t._v(": Accessible anywhere (default). The modified property or method is public, meaning it can be accessed from any part of the code. All properties and methods are public by default.")])]),t._v(" "),s("li",[s("p",[s("strong",[s("code",[t._v("private")])]),t._v(": Cannot be accessed outside the declaring class. The modified property or method is private, and it cannot be accessed from outside the class where it is declared.")])]),t._v(" "),s("li",[s("p",[s("strong",[s("code",[t._v("protected")])]),t._v(": Accessible within the declaring class and its subclasses. The modified property or method is protected, similar to private. However, it can be accessed within the declaring class and its subclasses.")])])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("constructor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" dog "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cute"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dog"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 'name' is a private property and can only be accessed within class 'Animal'.")]),t._v("\ndog"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tom"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 'name' is a private property and can only be accessed within class 'Animal'.")]),t._v("\n")])])]),s("p",[t._v("Note: "),s("code",[t._v("private")]),t._v(" does not restrict access in the compiled code; it provides compile-time checking only.")]),t._v(" "),s("h3",{attrs:{id:"getters-and-setters"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#getters-and-setters"}},[t._v("#")]),t._v(" Getters and Setters")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("User")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Private property to store the password")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" _password"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"******"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Getter method to retrieve the password")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("password")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("_password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Setter method to update the password")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("password")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newPass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("_password "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" newPass"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// When printing the password in the setter, use this.password instead of u-password")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example usage")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" u "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("User")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Get the current password")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" currentPassword "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" u"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("currentPassword"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Output: ******")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set a new password")]),t._v("\nu"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("password "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newPassword"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"abstract-classes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#abstract-classes"}},[t._v("#")]),t._v(" Abstract Classes")]),t._v(" "),s("p",[s("code",[t._v("abstract")]),t._v(" is used to define abstract classes and abstract methods, and instances cannot be created from them.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("constructor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sayHi")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" a "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Jack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// index.ts(9,11): error TS2511: Cannot create an instance of the abstract class 'Animal'.")]),t._v("\n")])])]),s("p",[t._v("In the example above, we define an abstract class "),s("code",[t._v("Animal")]),t._v(" and an abstract method "),s("code",[t._v("sayHi")]),t._v(". Attempting to instantiate an abstract class directly results in an error.")]),t._v(" "),s("h4",{attrs:{id:"implementing-abstract-methods"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#implementing-abstract-methods"}},[t._v("#")]),t._v(" Implementing Abstract Methods")]),t._v(" "),s("p",[t._v("Secondly, abstract methods within an abstract class must be implemented by subclasses:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("constructor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sayHi")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Cat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("eat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" is eating.")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" cat "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Cat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tom"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// index.ts(9,7): error TS2515: Non-abstract class 'Cat' does not implement inherited abstract member 'sayHi' from class 'Animal'.")]),t._v("\n")])])]),s("p",[t._v("In this example, the "),s("code",[t._v("Cat")]),t._v(" class inherits from "),s("code",[t._v("Animal")]),t._v(" but fails to implement the abstract method "),s("code",[t._v("sayHi")]),t._v(", resulting in a compilation error.")]),t._v(" "),s("p",[t._v("Here's a correct usage example:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("constructor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sayHi")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Cat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sayHi")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Meow, My name is ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" cat "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Cat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tom"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("In this corrected example, we implement the "),s("code",[t._v("sayHi")]),t._v(" method in the "),s("code",[t._v("Cat")]),t._v(" class, making it a valid subclass of the abstract "),s("code",[t._v("Animal")]),t._v(" class.")]),t._v(" "),s("p",[t._v("It's important to note that even though it's an abstract method, TypeScript still generates the corresponding class in the compiled result, as seen in the generated JavaScript code.")]),t._v(" "),s("p",[t._v("Note: Abstract classes are present in the compiled code.")]),t._v(" "),s("h3",{attrs:{id:"here-are-a-few-common-scenarios-where-abstract-classes-are-beneficial-in-typescript"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#here-are-a-few-common-scenarios-where-abstract-classes-are-beneficial-in-typescript"}},[t._v("#")]),t._v(" Here are a few common scenarios where abstract classes are beneficial in TypeScript:")]),t._v(" "),s("p",[t._v("Abstract classes in TypeScript serve the primary purpose of providing a base class for deriving other classes. They can include both concrete implementations and abstract members, which must be implemented in derived classes. Abstract classes cannot be instantiated on their own; they are meant to be used as base classes for other classes.")]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("Sharing Implementation Logic:")]),t._v("\nAbstract classes can contain shared implementation logic that may be common across derived classes. By placing this logic in the abstract class, redundancy in code can be avoided.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Shape")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("calculateArea")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("displayArea")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Area: ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("calculateArea")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Circle")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Shape")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("constructor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" radius"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("super")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("calculateArea")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" Math"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("PI")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("radius "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("**")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" circle "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Circle")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ncircle"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("displayArea")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Outputs: Area: 78.54")]),t._v("\n")])])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Enforcing Specific Interface Implementation:")]),t._v("\nAbstract members in an abstract class must be implemented in derived classes. This helps ensure that derived classes have specific behavior or properties.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Printer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("printDocument")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LaserPrinter")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Printer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("printDocument")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Printing document (laser): ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("document"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InkjetPrinter")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Printer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("printDocument")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Printing document (inkjet): ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("document"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Providing a Common Interface:")]),t._v("\nAbstract classes can define a set of common methods or properties to ensure a consistent interface across derived classes.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("makeSound")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("move")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Moving..."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Dog")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("makeSound")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Woof! Woof!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bird")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Animal")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("makeSound")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Chirp! Chirp!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])]),t._v(" "),s("p",[t._v("In summary, abstract classes in TypeScript are a tool for building class hierarchies and providing a consistent interface. They help establish stricter relationships between classes and ensure certain behaviors remain consistent throughout the class hierarchy.")]),t._v(" "),s("h2",{attrs:{id:"class-and-interface-interactions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#class-and-interface-interactions"}},[t._v("#")]),t._v(" Class and Interface Interactions")]),t._v(" "),s("h3",{attrs:{id:"class-implements-interface"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#class-implements-interface"}},[t._v("#")]),t._v(" Class Implements Interface")]),t._v(" "),s("p",[t._v("When different classes share common features, interfaces can be used, and classes implement them.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Chatroom")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Customer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CustomA")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Customer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Chatroom")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"welcome to A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CustomB")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Customer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Chatroom")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"welcome to B"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("A class can implement multiple interfaces:")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Chatroom")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Shop")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Customer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Custom")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Customer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Chatroom")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Shop "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"welcome~"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buy successful"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("For more interface and class interaction patterns, "),s("a",{attrs:{href:"https://willh.gitbook.io/typescript-tutorial/advanced/class-and-interfaces#jie-mian-ji-cheng-jie-mian",target:"_blank",rel:"noopener noreferrer"}},[t._v("check here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"generators-and-iterators"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#generators-and-iterators"}},[t._v("#")]),t._v(" generators and iterators")]),t._v(" "),s("blockquote",[s("p",[t._v("In TypeScript, generators and iterators are often used together to provide a convenient way to implement iterable objects. Let's discuss generators, iterators, and how to use them in TypeScript.")])]),t._v(" "),s("h3",{attrs:{id:"iterators"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#iterators"}},[t._v("#")]),t._v(" Iterators")]),t._v(" "),s("p",[t._v("In TypeScript, an iterator is an object with a "),s("code",[t._v("next")]),t._v(" method. The "),s("code",[t._v("next")]),t._v(" method returns an object with "),s("code",[t._v("value")]),t._v(" and "),s("code",[t._v("done")]),t._v(" properties, indicating the current value of the iteration and whether it is done.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Iterator"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" done"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example: Iterator for a range of numbers")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createNumberRangeIterator")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n start"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n end"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Iterator"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" current "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" start"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" done"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" current"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" done"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" current "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" end "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n current"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" numberIterator "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createNumberRangeIterator")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("numberIterator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// { value: 1, done: false }")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("numberIterator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// { value: 2, done: false }")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("numberIterator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// { value: 3, done: false }")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("numberIterator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// { value: undefined, done: true }")]),t._v("\n")])])]),s("h3",{attrs:{id:"generators"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#generators"}},[t._v("#")]),t._v(" Generators")]),t._v(" "),s("p",[t._v("Generators are a special type of function declared using "),s("code",[t._v("function*")]),t._v(". They can pause execution using "),s("code",[t._v("yield")]),t._v(" to return a value and can later resume execution. Generator functions return an iterator.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example: Generator for a range of numbers")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createNumberRangeGenerator")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n start"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n end"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Generator"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" start"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" end"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" i"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" numberGenerator "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createNumberRangeGenerator")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("numberGenerator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// { value: 1, done: false }")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("numberGenerator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// { value: 2, done: false }")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("numberGenerator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// { value: 3, done: false }")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("numberGenerator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// { value: undefined, done: true }")]),t._v("\n")])])]),s("h3",{attrs:{id:"using-generators-and-iterators"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#using-generators-and-iterators"}},[t._v("#")]),t._v(" Using Generators and Iterators")]),t._v(" "),s("p",[t._v("Generators offer a more concise and readable syntax. You can use the "),s("code",[t._v("for...of")]),t._v(" loop to iterate over the values generated by the generator.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using a generator to create a number range")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createNumberRangeGenerator")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n start"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n end"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Generator"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" start"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" end"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" i"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Iterating over the generator")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" num "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createNumberRangeGenerator")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("num"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Output:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 2")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 3")]),t._v("\n")])])]),s("p",[t._v("Generators and iterators provide a flexible and clear way to handle a sequence of values, especially when dealing with large datasets or asynchronous operations.")]),t._v(" "),s("h2",{attrs:{id:"generics"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#generics"}},[t._v("#")]),t._v(" Generics")]),t._v(" "),s("blockquote",[s("p",[t._v("Generics allow you to define functions, interfaces, or classes without specifying the exact type, and instead, determine the type during usage.")])]),t._v(" "),s("h3",{attrs:{id:"basic-usage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#basic-usage"}},[t._v("#")]),t._v(" Basic Usage")]),t._v(" "),s("p",[t._v("Let's start with a function, "),s("code",[t._v("createArray")]),t._v(", that creates an array of a specified length and fills each element with a default value:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createArray")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createArray")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Result: ['x', 'x', 'x']")]),t._v("\n")])])]),s("p",[t._v("The issue here is that the return type ("),s("code",[t._v("Array")]),t._v(") allows any type in the array. To address this, we introduce generics:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createArray")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createArray")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Result: ['x', 'x', 'x']")]),t._v("\n")])])]),s("p",[t._v("Now, the function is generic, and you can specify the type (e.g., "),s("code",[t._v("string")]),t._v(") when calling it.")]),t._v(" "),s("h3",{attrs:{id:"multiple-type-parameters"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#multiple-type-parameters"}},[t._v("#")]),t._v(" Multiple Type Parameters")]),t._v(" "),s("p",[t._v("Define multiple type parameters in a generic function, like in the "),s("code",[t._v("swap")]),t._v(" function:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("U")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tuple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("U")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("U")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("tuple"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tuple"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"seven"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Result: ['seven', 7]")]),t._v("\n")])])]),s("p",[t._v("Here, "),s("code",[t._v("swap")]),t._v(" takes a tuple and swaps its elements.")]),t._v(" "),s("h3",{attrs:{id:"generic-constraints"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#generic-constraints"}},[t._v("#")]),t._v(" Generic Constraints")]),t._v(" "),s("p",[t._v("When using generic variables inside a function, you might need to constrain them. For example:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Lengthwise")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n length"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("loggingIdentity")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" Lengthwise"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arg"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" arg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("loggingIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" length"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prints the length of the object")]),t._v("\n")])])]),s("p",[t._v("Here, "),s("code",[t._v("loggingIdentity")]),t._v(" has a generic constraint to ensure that the type "),s("code",[t._v("T")]),t._v(" extends the "),s("code",[t._v("Lengthwise")]),t._v(" interface, which has a "),s("code",[t._v("length")]),t._v(" property.")]),t._v(" "),s("h3",{attrs:{id:"generic-interface"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#generic-interface"}},[t._v("#")]),t._v(" Generic Interface")]),t._v(" "),s("p",[t._v("Interfaces can also be generic. Here's an example:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CreateArrayFunc")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" createArray"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CreateArrayFunc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("createArray")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createArray")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Result: ['x', 'x', 'x']")]),t._v("\n")])])]),s("p",[t._v("You can also move the generic type parameter to the interface level.")]),t._v(" "),s("h3",{attrs:{id:"generic-class"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#generic-class"}},[t._v("#")]),t._v(" Generic Class")]),t._v(" "),s("p",[t._v("Like interfaces, classes can also use generics:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GenericNumber"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n zeroValue"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("add")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" myGenericNumber "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GenericNumber"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmyGenericNumber"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("zeroValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmyGenericNumber"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("add")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("This "),s("code",[t._v("GenericNumber")]),t._v(" class can work with various numeric types.")]),t._v(" "),s("h3",{attrs:{id:"default-generic-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#default-generic-types"}},[t._v("#")]),t._v(" Default Generic Types")]),t._v(" "),s("p",[t._v("Starting TypeScript 2.3, you can specify default types for generic parameters:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createArray")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("This allows you to provide a default type ("),s("code",[t._v("string")]),t._v(" in this case) when a specific type is not explicitly provided.")]),t._v(" "),s("p",[t._v("Generics enhance the flexibility and type safety of your code, allowing you to create reusable and type-agnostic components. They are particularly useful when you want to create functions or classes that can work with a variety of data types.")]),t._v(" "),s("h3",{attrs:{id:"more-generics"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#more-generics"}},[t._v("#")]),t._v(" More Generics")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" echo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arg"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" arg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" isObj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arg"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" arg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isArray")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" arg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!==")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isObj")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isObj")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"John"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isObj")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isObj")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"John"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isObj")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("////////////////////////////////////")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" isTrue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arg"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" arg"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("is")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isArray")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("arg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" arg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("is")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isObj")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("keys")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arg "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" arg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("is")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" arg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("is")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("arg "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//{ arg: false, is: false }")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//{ arg: 0, is: false }")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//{ arg: true, is: true }")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//{ arg: 1, is: true }")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Dave"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// modified")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Dave"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// modified")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("NaN")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isTrue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("////////////////////////////////////")]),t._v("\n")])])]),s("h2",{attrs:{id:"common-techniques"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#common-techniques"}},[t._v("#")]),t._v(" Common Techniques")]),t._v(" "),s("h3",{attrs:{id:"extracting-variable-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#extracting-variable-types"}},[t._v("#")]),t._v(" Extracting Variable Types")]),t._v(" "),s("p",[t._v("Use "),s("code",[t._v("typeof")]),t._v(" to extract variable types:")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" a "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" b "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("A")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// number")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("B")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// { x: number, y: number }")]),t._v("\n")])])]),s("h3",{attrs:{id:"binding-function-this"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#binding-function-this"}},[t._v("#")]),t._v(" Binding Function "),s("code",[t._v("this")])]),t._v(" "),s("p",[t._v("Bind "),s("code",[t._v("this")]),t._v(" on the first parameter. "),s("a",{attrs:{href:"https://www.typescriptlang.org/docs/handbook/functions.html#this",target:"_blank",rel:"noopener noreferrer"}},[t._v("See reference"),s("OutboundLink")],1)]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("say")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello: "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("test")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" str"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("say")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("str"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"index-variables"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#index-variables"}},[t._v("#")]),t._v(" Index Variables")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("A")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 'in' iterates over sub-properties, resulting in the type: string")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("B")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"built-in-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#built-in-types"}},[t._v("#")]),t._v(" Built-in Types")]),t._v(" "),s("p",[t._v("TypeScript provides built-in utility types:")]),t._v(" "),s("h4",{attrs:{id:"record"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#record"}},[t._v("#")]),t._v(" Record")]),t._v(" "),s("p",[t._v("Generates an object type with keys of type K and values of type T.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Record"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("K")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("P")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Record"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Record"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"y"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n y"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"partial"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#partial"}},[t._v("#")]),t._v(" Partial")]),t._v(" "),s("p",[t._v("Makes all properties of T optional.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Partial"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("P")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("P")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Foo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n b"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Partial"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n b"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 'a' is optional")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"required"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#required"}},[t._v("#")]),t._v(" Required")]),t._v(" "),s("p",[t._v("Opposite of "),s("code",[t._v("Partial")]),t._v(", makes all properties of T required.")]),t._v(" "),s("h4",{attrs:{id:"readonly-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#readonly-2"}},[t._v("#")]),t._v(" Readonly")]),t._v(" "),s("p",[t._v("Makes all properties of T readonly.")]),t._v(" "),s("h4",{attrs:{id:"pick"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#pick"}},[t._v("#")]),t._v(" Pick")]),t._v(" "),s("p",[t._v("Selects properties from T specified by K.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Pick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("K")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("P")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("P")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Foo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n b"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n c"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Pick"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Foo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n b"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n c"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"exclude"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#exclude"}},[t._v("#")]),t._v(" Exclude")]),t._v(" "),s("p",[t._v("Exclude from T those types that are assignable to U.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exclude"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("U")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("U")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("never")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Exclude"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nfoo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"extract"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#extract"}},[t._v("#")]),t._v(" Extract")]),t._v(" "),s("p",[t._v("Extract from T those types that are assignable to U.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Extract"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("U")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("U")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("never")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Extract"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"parameters"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("p",[t._v("Returns a tuple type based on the parameters of a function.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Parameters"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("args"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("args"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("infer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("P")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("P")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("never")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Foo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Parameters"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// [string, number]")]),t._v("\n")])])]),s("h4",{attrs:{id:"returntype"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#returntype"}},[t._v("#")]),t._v(" ReturnType")]),t._v(" "),s("p",[t._v("Returns the return type of a function.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ReturnType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("args"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("T")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("args"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("infer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("R")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("R")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Foo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReturnType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Returns boolean type")]),t._v("\n")])])]),s("h3",{attrs:{id:"🔹-index-signature"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔹-index-signature"}},[t._v("#")]),t._v(" 🔹 index signature")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Index Signatures")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// interface TransactionObj {")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// readonly [index: string]: number")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// }")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TransactionObj")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("readonly")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("index"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n Pizza"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n Books"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n Job"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" todaysTransactions"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" TransactionObj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Pizza"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Books"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Job"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("todaysTransactions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Pizza"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("todaysTransactions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pizza"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" prop"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pizza"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("todaysTransactions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("prop"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" todaysNet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("transactions"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" TransactionObj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" total "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" transaction "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" transactions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n total "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" transactions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("transaction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" total"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("todaysNet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("todaysTransactions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//todaysTransactions.Pizza = 40")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("todaysTransactions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Dave"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// undefined")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("///////////////////////////////////")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Student")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("GPA")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n classes"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" student"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Student "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Doug"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("GPA")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n classes"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("test"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//because of the index signature, this is allowed")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" Student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//'name: Doug' ,'GPA: 3.5' ​​​​​, 'classes: 100,200' ​​​​​, 'test: undefined'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("keys")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 'Doug' , 3.5 , [ 100, 200 ]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" logStudentKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("student"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" Student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Student ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//'Student name: Doug'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("logStudentKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/////////////////////////////////")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// interface Incomes {")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// [key: string]: number")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// }")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Streams")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"salary"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bonus"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sidehustle"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Incomes")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Record"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Streams"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" monthlyIncomes"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Incomes "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n salary"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("500")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bonus"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n sidehustle"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" revenue "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" monthlyIncomes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("monthlyIncomes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("revenue "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" Incomes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 500 , 100 , 250")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("🔺 "),s("strong",[s("code",[t._v("student[key as keyof typeof student]")])]),t._v(":")]),t._v(" "),s("p",[t._v("Inside the function passed to "),s("code",[t._v("map")]),t._v(", each key is used to access the corresponding value in the "),s("code",[t._v("student")]),t._v(" object. - "),s("code",[t._v("key")]),t._v(" is a variable holding the current property name being iterated over. - "),s("code",[t._v("key as keyof typeof student")]),t._v(" is a TypeScript type assertion. It tells TypeScript to treat "),s("code",[t._v("key")]),t._v(" as one of the keys of the type of "),s("code",[t._v("student")]),t._v(". This is necessary because, by default, the type of "),s("code",[t._v("key")]),t._v(" would be just "),s("code",[t._v("string")]),t._v(", which is too general. The "),s("code",[t._v("keyof typeof student")]),t._v(" type is more specific, representing the union of all literal types of the keys in the "),s("code",[t._v("student")]),t._v(" object.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[t._v("Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("keys")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" student"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("🔺 補充理解在 JavaScript 和 TypeScript 中,对象属性可以通过两种方式访问")]),t._v(" "),s("blockquote",[s("p",[t._v("点符号("),s("code",[t._v(".")]),t._v(")和方括号符号("),s("code",[t._v("[]")]),t._v(")。在您提供的代码中,"),s("code",[t._v("todaysTransactions")]),t._v(" 是一个对象,其中包含了不同的属性(如 "),s("code",[t._v("Pizza")]),t._v("、"),s("code",[t._v("Books")]),t._v(" 和 "),s("code",[t._v("Job")]),t._v("),每个属性都有对应的值。")])]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("点符号")]),t._v(": "),s("code",[t._v("todaysTransactions.Pizza")]),t._v("。这种方式是直接访问对象的属性,其中 "),s("code",[t._v("Pizza")]),t._v(" 是属性的字面量名称。")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("方括号符号")]),t._v(": "),s("code",[t._v("todaysTransactions['Pizza']")]),t._v(" 和 "),s("code",[t._v("todaysTransactions[prop]")]),t._v("。这种方式用于当属性名是动态的或者是一个变量时。在这种情况下,属性名需要作为字符串传递。")])])]),t._v(" "),s("p",[t._v("在代码中,"),s("code",[t._v("prop")]),t._v(" 是一个字符串类型的变量,其值为 "),s("code",[t._v("'Pizza'")]),t._v("。因此,当你使用 "),s("code",[t._v("todaysTransactions[prop]")]),t._v(" 时,它实际上是 "),s("code",[t._v("todaysTransactions['Pizza']")]),t._v(" 的简写。由于 "),s("code",[t._v("prop")]),t._v(" 变量的值是 "),s("code",[t._v("'Pizza'")]),t._v(",所以这个表达式最终访问的是 "),s("code",[t._v("todaysTransactions")]),t._v(" 对象中 "),s("code",[t._v("Pizza")]),t._v(" 这个属性的值。")]),t._v(" "),s("h3",{attrs:{id:"accessing-object-properties-dynamically-in-typescript"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#accessing-object-properties-dynamically-in-typescript"}},[t._v("#")]),t._v(" Accessing object properties dynamically in TypeScript")]),t._v(" "),s("p",[t._v("Accessing object properties dynamically in TypeScript can be achieved through various methods, including dot notation, square brackets, and the "),s("code",[t._v("keyof")]),t._v(" operator. Each method has its specific use cases and benefits depending on the requirements of your application.")]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("Using Square Brackets")]),t._v(": This method is particularly useful when the property name is dynamic, such as in the case of user input or other runtime conditions. For example, you might have a TypeScript React component where you need to access properties of an object based on user interactions or input. Here's a simple example:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("User")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n email"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" user"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" User "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Alice"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n email"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"alice@example.com"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" propertyName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"email"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" propertyValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" user"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("propertyName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Outputs: alice@example.com")]),t._v("\n")])])]),s("p",[t._v("In this example, "),s("code",[t._v("propertyName")]),t._v(" is a variable that holds the name of the property you want to access. This approach is useful in scenarios like handling form inputs dynamically.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Using "),s("code",[t._v("keyof")]),t._v(" with TypeScript")]),t._v(": The "),s("code",[t._v("keyof")]),t._v(" operator is another powerful feature in TypeScript, which you can use to create a union type of all the keys in an object. This is particularly useful for ensuring type safety when accessing properties dynamically. Here's an example:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("User")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n email"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UserKeys")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" User"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" user"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" User "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Bob"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n email"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bob@example.com"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" propertyName"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" UserKeys "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" propertyValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" user"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("propertyName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("propertyValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Outputs: Bob")]),t._v("\n")])])]),s("p",[t._v("In this example, "),s("code",[t._v("propertyName")]),t._v(" is a variable of type "),s("code",[t._v("UserKeys")]),t._v(", which is a union of all keys in the "),s("code",[t._v("User")]),t._v(" interface. This ensures that only valid property names can be assigned to "),s("code",[t._v("propertyName")]),t._v(".")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Dynamic Property Access in React Components")]),t._v(": In React components, you might encounter scenarios where you need to dynamically access or update the state based on user input or interaction. For example, if you are building a form with multiple fields, you can use the square bracket notation to update the state for each field dynamically:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useState "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" FormComponent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("FC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("formState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setFormState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("handleChange")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("event"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ChangeEvent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("HTMLInputElement"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setFormState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("formState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("event"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" event"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("form"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("input name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),t._v(" onChange"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleChange"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("input name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"email"')]),t._v(" onChange"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleChange"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* ... other form fields ... */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("form"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("In this React component, "),s("code",[t._v("handleChange")]),t._v(" function updates the "),s("code",[t._v("formState")]),t._v(" dynamically based on the input field's "),s("code",[t._v("name")]),t._v(" attribute.")])])]),t._v(" "),s("p",[t._v("🔺 For more detailed information, you can refer to these resources:")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://www.typescriptsos.com/faqs/how-to-dynamically-access-object-property-in-typescript/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Typescript SOS - How to dynamically access object property in typescript"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://www.squash.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Squash.io - How to Get an Object Value by Dynamic Keys in TypeScript"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://www.bennadel.com/go/3126",target:"_blank",rel:"noopener noreferrer"}},[t._v("Ben Nadel - Object Access: Bracket-Notation vs. Dot-Notation With TypeScript In Angular 2 RC 4"),s("OutboundLink")],1)])]),t._v(" "),s("h2",{attrs:{id:"reference-articles"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#reference-articles"}},[t._v("#")]),t._v(" Reference Articles")]),t._v(" "),s("ol",[s("li",[s("a",{attrs:{href:"https://willh.gitbook.io/typescript-tutorial/",target:"_blank",rel:"noopener noreferrer"}},[t._v("TypeScript for Beginners"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://juejin.cn/post/6873080212675166215#heading-15",target:"_blank",rel:"noopener noreferrer"}},[t._v("TypeScript Practical Tips and Tricks"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/41.b55d51e9.js b/assets/js/41.b55d51e9.js new file mode 100644 index 00000000..740cc780 --- /dev/null +++ b/assets/js/41.b55d51e9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{337:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"🔶-typescript-basic-knowledge"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔶-typescript-basic-knowledge"}},[t._v("#")]),t._v(" 🔶 TypeScript Basic Knowledge")]),t._v(" "),s("h2",{attrs:{id:"🔸-primitive-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-primitive-types"}},[t._v("#")]),t._v(" 🔸 Primitive Types")]),t._v(" "),s("p",[s("code",[t._v("string")]),t._v(", "),s("code",[t._v("number")]),t._v(", "),s("code",[t._v("boolean")]),t._v(", "),s("code",[t._v("null")]),t._v(", "),s("code",[t._v("undefined")]),t._v(", "),s("code",[t._v("Symbol")])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Known type")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" str"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello World"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Unknown with expectation")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" num "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("unknown")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getNumber")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Known expectation")]),t._v("\nnum "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getNumber")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Function returning a number")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getNumber")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Void function")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("count")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"any-type"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#any-type"}},[t._v("#")]),t._v(" Any Type")]),t._v(" "),s("p",[t._v("A variable of any type cannot change its type during operations.")]),t._v(" "),s("ol",[s("li",[t._v("Any type allows any operation, and the return type is of any.")]),t._v(" "),s("li",[t._v("When a variable is declared without specifying a type and no value is assigned, it defaults to any.")])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" someText"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will cause an error if set to number")]),t._v("\nsomeText "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"someText"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n")])])]),s("h2",{attrs:{id:"🔸-never"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔸-never"}},[t._v("#")]),t._v(" 🔸 Never")]),t._v(" "),s("p",[t._v("A function that never returns, or a function that always throws an error.")]),t._v(" "),s("ul",[s("li",[t._v("bottom level type")]),t._v(" "),s("li",[t._v("can be assigned to any type")])]),t._v(" "),s("p",[t._v("In TypeScript, the "),s("code",[t._v("never")]),t._v(" type is often used in the context of exhaustiveness checking, particularly in situations like "),s("code",[t._v("switch")]),t._v(" statements. The "),s("code",[t._v("never")]),t._v(" type represents the type of values that never occur. It is used to indicate that a function will not return normally (e.g., it throws an error or has an infinite loop).")]),t._v(" "),s("p",[t._v("Let's discuss how "),s("code",[t._v("never")]),t._v(" is commonly used with "),s("code",[t._v("switch")]),t._v(" statements and the "),s("code",[t._v("default")]),t._v(" case:")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Fruit")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Apple"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Banana"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Orange"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFruitColor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fruit"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Fruit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("switch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fruit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Apple"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Red"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Banana"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Yellow"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Orange"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Orange"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The default case is marked as unreachable, and its return type is 'never'.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is because TypeScript can infer that the switch is exhaustive, covering all possible values of 'Fruit'.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" exhaustiveCheck"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("never")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fruit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" exhaustiveCheck"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This line will never be reached.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Explanation:")]),t._v(" "),s("ol",[s("li",[t._v("The "),s("code",[t._v("Fruit")]),t._v(" type is defined as a union of string literals representing different fruit names.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("getFruitColor")]),t._v(" function takes a "),s("code",[t._v("fruit")]),t._v(" argument of type "),s("code",[t._v("Fruit")]),t._v(" and returns a string representing the color.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("switch")]),t._v(" statement is used to handle different cases based on the value of "),s("code",[t._v("fruit")]),t._v(".")]),t._v(" "),s("li",[t._v("For each known fruit case ("),s("code",[t._v("'Apple'")]),t._v(", "),s("code",[t._v("'Banana'")]),t._v(", "),s("code",[t._v("'Orange'")]),t._v("), the function returns the corresponding color.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("default")]),t._v(" case is marked with "),s("code",[t._v("never")]),t._v(". This indicates to TypeScript that this case should never be reached because we've covered all possible values of "),s("code",[t._v("Fruit")]),t._v(".")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("exhaustiveCheck")]),t._v(" variable is of type "),s("code",[t._v("never")]),t._v(", which means TypeScript understands that it can never have a value, and this line will never be executed.")])]),t._v(" "),s("p",[t._v("This pattern helps TypeScript catch situations where you might forget to handle a specific case in a "),s("code",[t._v("switch")]),t._v(" statement, providing better safety and avoiding unintentional bugs.")]),t._v(" "),s("h2",{attrs:{id:"型アノテーション-type-annotation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#型アノテーション-type-annotation"}},[t._v("#")]),t._v(" 型アノテーション(Type Annotation)")]),t._v(" "),s("p",[t._v("TypeScript では value: Type というフォーマットで宣言時の変数 に型の注釈がつけられる\nアノテー ションによって静的に型付けされた情報はコンパイル時のチェックに用いられ、書かれたコード中 に型の不整合があるとコンパイルエラーになる")]),t._v(" "),s("h2",{attrs:{id:"型推論-type-inference"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#型推論-type-inference"}},[t._v("#")]),t._v(" 型推論(Type Inference)")]),t._v(" "),s("p",[t._v("When the type is not explicitly specified, TypeScript infers the type based on the assigned value.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" typeS "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"seven"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ntypeS "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Inferred as string due to the initial value being a string")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" typeA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ntypeA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"six"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ntypeA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Inferred as any since no initial value is given")]),t._v("\n")])])]),s("h2",{attrs:{id:"union-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#union-types"}},[t._v("#")]),t._v(" Union Types")]),t._v(" "),s("p",[t._v("Represents a value that can be one of multiple types, using "),s("code",[t._v("|")]),t._v(" to separate types.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" unionC"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Ray"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nunionC "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLength")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("something"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" something"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Can only access properties common to both types, error")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"object-types-interface"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#object-types-interface"}},[t._v("#")]),t._v(" Object Types - Interface")]),t._v(" "),s("p",[t._v("Commonly used to describe the shape of objects.")]),t._v(" "),s("ol",[s("li",[t._v("Interface names typically start with a capital letter.")]),t._v(" "),s("li",[t._v("Optional properties are denoted with "),s("code",[t._v("?")]),t._v(" to enhance flexibility.")]),t._v(" "),s("li",[t._v("Index signatures allow any property of a certain type.")]),t._v(" "),s("li",[t._v("Use "),s("code",[t._v("readonly")]),t._v(" to mark properties as read-only.")])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Person")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("readonly")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Optional property")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("prop"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Any property of type any")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// [prop: string]: string; // Uncommenting restricts any property to string type")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" tom"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Person "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3387")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tom"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// age: 30,")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Constraints Tom to have the same shape as Person (no more, no less)")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Cannot modify readonly property after initialization, error")]),t._v("\ntom"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4069")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Function interfaces or interfaces with function properties are also possible:")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyFunction")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyObject")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("jump")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"array-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#array-types"}},[t._v("#")]),t._v(" Array Types")]),t._v(" "),s("p",[t._v("Several ways to define array types:")]),t._v(" "),s("ol",[s("li",[t._v("Type + square brackets")]),t._v(" "),s("li",[t._v("Array generics (Array)")]),t._v(" "),s("li",[t._v("Interface for arrays")]),t._v(" "),s("li",[t._v("Tuple types (IArguments, NodeList, HTMLCollection, Element...)")])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" myArr"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmyArr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Method calls are type-checked, error")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 2.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" myArr2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Array")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nmyArr2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 3.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NumberArray")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("index"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" myArr3"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" NumberArray "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 4. Built-in array interfaces")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" args"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IArguments "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arguments"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("For more built-in objects, refer to "),s("a",{attrs:{href:"https://willh.gitbook.io/typescript-tutorial/basics/built-in-objects",target:"_blank",rel:"noopener noreferrer"}},[t._v("this link"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"function-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#function-types"}},[t._v("#")]),t._v(" Function Types")]),t._v(" "),s("blockquote",[s("p",[t._v("Functions have input and output types, considering both is crucial.")])]),t._v(" "),s("ol",[s("li",[s("p",[t._v("Declaration")])]),t._v(" "),s("li",[s("p",[t._v("Expression")]),t._v(" "),s("ul",[s("li",[t._v("Be cautious when using the => syntax; it might be confusing and is recommended to use the declaration syntax.")])])]),t._v(" "),s("li",[s("p",[t._v("Interface definition")])]),t._v(" "),s("li",[s("p",[t._v("Optional parameters marked with ?, which cannot follow required parameters.")])]),t._v(" "),s("li",[s("p",[t._v("Default parameter values make parameters optional.")])]),t._v(" "),s("li",[s("p",[t._v("Rest parameters can be defined using an array type (any[]).")])]),t._v(" "),s("li",[s("p",[t._v("Overloads allow a function to accept different numbers or types of parameters.")])])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sumFn")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sumFn")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sumFn")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 2.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("sumFnEx")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n y"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 3.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Isum")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" mySum"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Isum")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 4. & 5.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n firstName"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n lastName"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n age"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("firstName"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("lastName"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(", now age ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("age"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"johnny"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 6.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("array"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("items"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n items"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n array"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 7.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Define precise input and output types for numbers, then implement logic")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reverse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reverse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reverse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("split")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reverse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("join")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("split")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reverse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("join")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"type-assertion"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#type-assertion"}},[t._v("#")]),t._v(" Type Assertion")]),t._v(" "),s("p",[t._v("Manually specify a value's type, commonly used in React's TSX (TS for JSX) to distinguish between TypeScript and ES6 arrow functions.")]),t._v(" "),s("ol",[s("li",[s("p",[t._v("When dealing with union types, sometimes a specific type's property needs to be accessed.")]),t._v(" "),s("ul",[s("li",[t._v("Caution is needed to avoid runtime errors when accessing properties immediately after assertion.")])])]),t._v(" "),s("li",[s("p",[t._v("Parent class inheritance assertion")])]),t._v(" "),s("li",[s("p",[t._v('"XXX as any" should be a last resort for solving type issues, use sparingly.')])]),t._v(" "),s("li",[s("p",[t._v("Type assertion reinforcement (for old code returning any, explicitly assert its type after calling)")])]),t._v(" "),s("li",[s("p",[t._v("Type assertions are only effective during compilation, having no impact on the compiled code.")])]),t._v(" "),s("li",[s("p",[t._v("Type declarations are stricter; prefer using them whenever possible.")])])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Cat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("run")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Fish")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("swim")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("animal"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Cat "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" Fish"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Accessing swim directly after assertion may cause runtime errors")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// if (typeof animal.swim === 'function') {")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("animal "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" Fish"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("swim "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"function"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Is a fish"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 2.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ApiError")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n code"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HttpError")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n statusCode"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("isApiError")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" ApiError"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("code "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 3.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Accessing any property is legal, but this is a last resort")]),t._v("\nwindow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("foo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("window "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("foo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 4.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getCache")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("window "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cache"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Cat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("run")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Type assertion")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" tomCat "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getCache")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tom"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" Cat"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Type declaration (more strict)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// const tomCat: Cat = getCache('tom');")]),t._v("\ntomCat"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("run")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"declaration-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#declaration-files"}},[t._v("#")]),t._v(" Declaration Files")]),t._v(" "),s("p",[t._v("When using third-party libraries, include their declaration files to enable type checking.")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://ts.xcatliu.com/basics/declaration-files.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Declaration Syntax Reference"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://microsoft.github.io/TypeSearch/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Declaration File Search"),s("OutboundLink")],1)])]),t._v(" "),s("p",[t._v("Usually, declaration statements are placed in separate files, e.g., jQuery.d.ts.")]),t._v(" "),s("ol",[s("li",[s("code",[t._v("declare var/let/const")])]),t._v(" "),s("li",[s("code",[t._v("declare namespace")]),t._v(" creates a namespace to avoid global pollution; use the namespace when accessing its interfaces.")]),t._v(" "),s("li",[t._v("For library declaration files, it is recommended to use "),s("code",[t._v("@types")]),t._v(" for centralized management. Install with "),s("code",[t._v("npm install @types/library --save-dev")]),t._v(". No further configuration is needed for global declarations.")]),t._v(" "),s("li",[t._v("For NPM declaration files, export and import are required to use types within modules.")])]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1. Using jQuery as an example")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("declare")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("jQuery")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("selector"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 2. Example (illustrative purposes only)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("declare")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("namespace")]),t._v(" Vue "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("component")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mixin")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"declaration-merging"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#declaration-merging"}},[t._v("#")]),t._v(" Declaration Merging")]),t._v(" "),s("p",[t._v("Taking jQuery as an example, it is both a function and an object with properties. Multiple declaration statements that do not conflict will be merged.")]),t._v(" "),s("div",{staticClass:"language-ts extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ts"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("declare")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("jQuery")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("selector"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("declare")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("namespace")]),t._v(" jQuery "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ajax")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" settings"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/42.f21bd3bd.js b/assets/js/42.f21bd3bd.js new file mode 100644 index 00000000..89822fad --- /dev/null +++ b/assets/js/42.f21bd3bd.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{329:function(r,e,t){"use strict";t.r(e);var o=t(14),n=Object(o.a)({},(function(){var r=this,e=r._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":r.$parent.slotKey}},[e("h1",{attrs:{id:"formik-yup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#formik-yup"}},[r._v("#")]),r._v(" Formik & Yup")]),r._v(" "),e("p",[r._v("🔺 ### Reference:")]),r._v(" "),e("ul",[e("li",[e("p",[e("a",{attrs:{href:"https://zenn.dev/nus3/articles/73f6832da17f5406d4af",target:"_blank",rel:"noopener noreferrer"}},[r._v("Formik と React Hook Form を実装してみて"),e("OutboundLink")],1)])]),r._v(" "),e("li",[e("p",[e("a",{attrs:{href:"https://formik.org/docs/overview",target:"_blank",rel:"noopener noreferrer"}},[r._v("Formik documentation"),e("OutboundLink")],1)])]),r._v(" "),e("li",[e("p",[e("a",{attrs:{href:"https://legacy.reactjs.org/docs/forms.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("Forms - react "),e("OutboundLink")],1)])])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/43.8e67900b.js b/assets/js/43.8e67900b.js new file mode 100644 index 00000000..8551a4bd --- /dev/null +++ b/assets/js/43.8e67900b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{328:function(e,t,r){"use strict";r.r(t);var a=r(14),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"🔺-memo-メモ"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#🔺-memo-メモ"}},[e._v("#")]),e._v(" 🔺 MEMO メモ")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://qiita.com/e99h2121/items/833b34ed6c34020af8f9",target:"_blank",rel:"noopener noreferrer"}},[e._v("「ファインマンテクニック」を使って複雑な概念をよりよく理解する"),t("OutboundLink")],1)]),e._v(" "),t("h3",{attrs:{id:"🔺-react"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#🔺-react"}},[e._v("#")]),e._v(" 🔺 react")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://juejin.cn/post/7080888443865137188",target:"_blank",rel:"noopener noreferrer"}},[e._v("function component vs class component"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://react.dev/learn/conditional-rendering",target:"_blank",rel:"noopener noreferrer"}},[e._v("conditional rendering"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://react.dev/learn/rendering-lists",target:"_blank",rel:"noopener noreferrer"}},[e._v("list and key"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.freecodecamp.org/news/how-to-build-forms-in-react/#:~:text=Controlled%20Components%20in%20React,immediately%20reflected%20in%20the%20state.",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to Build Forms in React - Controlled Components in React"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://react.dev/reference/react-dom/components/form#noun-labs-1201738-(2)",target:"_blank",rel:"noopener noreferrer"}},[e._v("form"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"🔺-reacthooks"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#🔺-reacthooks"}},[e._v("#")]),e._v(" 🔺 reactHooks")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://react.dev/learn/passing-data-deeply-with-context#before-you-use-context",target:"_blank",rel:"noopener noreferrer"}},[e._v("passing-data-deeply-with-context"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://react.dev/learn/scaling-up-with-reducer-and-context",target:"_blank",rel:"noopener noreferrer"}},[e._v("scaling-up-with-reducer-and-context"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://juejin.cn/post/7118937685653192735?searchId=20231203144532DC30BB5CFA5FD3A1A5A7#heading-16",target:"_blank",rel:"noopener noreferrer"}},[e._v("React hooks を基本からまとめてみた "),t("OutboundLink")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:""}},[e._v("React hooks を基礎から理解する (useState 編)")])]),e._v(" "),t("li",[t("a",{attrs:{href:"https://qiita.com/seira/items/e62890f11e91f6b9653f",target:"_blank",rel:"noopener noreferrer"}},[e._v("React hooks を基礎から理解する (useEffect 編)"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:""}},[e._v("React hooks を基礎から理解する (useContext 編)")])]),e._v(" "),t("li",[t("a",{attrs:{href:""}},[e._v("React hooks を基礎から理解する (useReducer 編)")])]),e._v(" "),t("li",[t("a",{attrs:{href:""}},[e._v("React hooks を基礎から理解する (useCallback 編)")])]),e._v(" "),t("li",[t("a",{attrs:{href:""}},[e._v("React hooks を基礎から理解する (useMemo 編)")])]),e._v(" "),t("li",[t("a",{attrs:{href:""}},[e._v("React hooks を基礎から理解する (useRef 編)")])])])])]),e._v(" "),t("h3",{attrs:{id:"🔺-typescript"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#🔺-typescript"}},[e._v("#")]),e._v(" 🔺 typescript")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://react-typescript-cheatsheet.netlify.app/docs/advanced/patterns_by_usecase",target:"_blank",rel:"noopener noreferrer"}},[e._v("React TypeScript Cheatsheet"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.reactandtypescript.dev/examples/functional-components",target:"_blank",rel:"noopener noreferrer"}},[e._v("Use TypeScript with React Components"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.youtube.com/watch?v=9lUN3sqAjQQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("Use TypeScript with React Components Video"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/44.0e1420d6.js b/assets/js/44.0e1420d6.js new file mode 100644 index 00000000..004dbc97 --- /dev/null +++ b/assets/js/44.0e1420d6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{334:function(t,a,s){"use strict";s.r(a);var n=s(14),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"🔻-使用される場面"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔻-使用される場面"}},[t._v("#")]),t._v(" 🔻 使用される場面")]),t._v(" "),a("h3",{attrs:{id:"例子-1-javascript-data-transformation-using-object-values-and-map"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#例子-1-javascript-data-transformation-using-object-values-and-map"}},[t._v("#")]),t._v(" "),a("strong",[t._v("例子 1: JavaScript Data Transformation Using "),a("code",[t._v("Object.values")]),t._v(" and "),a("code",[t._v("map")])])]),t._v(" "),a("div",{staticClass:"language-ts extra-class"},[a("pre",{pre:!0,attrs:{class:"language-ts"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" animals"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" colors "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../constants"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ANIMAL_OPTIONS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" SelectOption"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Object"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("values")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("animals"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("animal"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n value"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" animal"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n label"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" animal"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("charAt")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" animal"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toLowerCase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("COLOR_OPTIONS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" SelectOption"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Object"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("values")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("colors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("color"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n value"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" color"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n label"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" color"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("charAt")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" color"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toLowerCase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("ol",[a("li",[a("p",[a("strong",[t._v("Extracting Object Values with "),a("code",[t._v("Object.values")])]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("Object.values")]),t._v(" is a method that takes an object as an argument and returns an array containing all the values of that object's properties.")]),t._v(" "),a("li",[t._v("Example Usage: In the context of a "),a("code",[t._v("countries")]),t._v(" object, "),a("code",[t._v("Object.values(countries)")]),t._v(" would extract all country names and create an array of these names, such as "),a("code",[t._v("['CANADA', 'UNITED KINGDOM', 'AUSTRALIA']")]),t._v(".")])])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("Transforming Array Elements with "),a("code",[t._v("map")])]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("The "),a("code",[t._v("map")]),t._v(" method creates a new array by performing a specified operation on each element of an array.")]),t._v(" "),a("li",[t._v("In the given example, "),a("code",[t._v("map")]),t._v(" is used to transform each country name into an object with two properties: "),a("code",[t._v("value")]),t._v(" and "),a("code",[t._v("label")]),t._v(".\n"),a("ul",[a("li",[a("code",[t._v("value")]),t._v(": The original country name.")]),t._v(" "),a("li",[a("code",[t._v("label")]),t._v(": The country name formatted with the first letter in uppercase and the rest in lowercase, achieved through "),a("code",[t._v("country.charAt(0)")]),t._v(" (first character) and "),a("code",[t._v("country.slice(1).toLowerCase()")]),t._v(" (remaining characters in lowercase).")])])])])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("Resulting Data Structure")]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("The combination of "),a("code",[t._v("Object.values")]),t._v(" and "),a("code",[t._v("map")]),t._v(" results in an array of objects, each representing a country option. Each object has a "),a("code",[t._v("value")]),t._v(" (the original uppercase country name) and a "),a("code",[t._v("label")]),t._v(" (formatted with only the first letter capitalized).")]),t._v(" "),a("li",[t._v("Example Output: An array of objects like "),a("code",[t._v("{ canada: 'Canada', unitedkingdom: 'United Kingdom', australia: 'Australia' }")]),t._v(", where the keys are lowercase versions of the country names and the values are formatted as specified.")])])])]),t._v(" "),a("p",[a("strong",[t._v("Key Takeaways")]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("These methods are effective for converting and preparing data from objects into a specific format, such as options for a dropdown menu.")]),t._v(" "),a("li",[a("code",[t._v("Object.values")]),t._v(" and "),a("code",[t._v("map")]),t._v(" offer a common and powerful pattern for data handling and transformation in JavaScript, ensuring consistency and readability in your code.")])]),t._v(" "),a("hr"),t._v(" "),a("h3",{attrs:{id:"例子-2-用array-prototype-reduce-把-array-轉換成-object"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#例子-2-用array-prototype-reduce-把-array-轉換成-object"}},[t._v("#")]),t._v(" **例子 2: 用"),a("code",[t._v("Array.prototype.reduce")]),t._v(" 把 "),a("code",[t._v("array")]),t._v(" 轉換成 "),a("code",[t._v("object")]),t._v(" **")]),t._v(" "),a("ol",[a("li",[a("p",[a("strong",[t._v("Defining the Array")]),t._v(":\nFirst, define an array containing country names. For example:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" countries "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Canada"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"United Kingdom"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Australia"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("Using "),a("code",[t._v("reduce")]),t._v(" to Transform into an Object")]),t._v(":\nUse the "),a("code",[t._v("reduce")]),t._v(" method to iterate over the array, transforming each array element (country name) into both key and value of the object.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" countriesObject "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" countries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("obj"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" country")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" key "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" country"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toLowerCase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("replace")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token regex"}},[a("span",{pre:!0,attrs:{class:"token regex-delimiter"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token regex-source language-regex"}},[t._v(" ")]),a("span",{pre:!0,attrs:{class:"token regex-delimiter"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token regex-flags"}},[t._v("g")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n obj"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" country"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" obj"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("In this example, the "),a("code",[t._v("reduce")]),t._v(" method takes two parameters: an accumulator ("),a("code",[t._v("obj")]),t._v(") and the current element ("),a("code",[t._v("country")]),t._v("). We first convert the country name to lowercase and remove all spaces to create the key, then assign the original country name ("),a("code",[t._v("country")]),t._v(") as the value.")])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("Accessing Country Names Using the Object")]),t._v(":\nOnce the object is created, you can use it as Cameron described:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("country "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" countriesObject"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("canada"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Logic to handle the scenario")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("blockquote",[a("p",[t._v("在您提供的代码示例中,使用 "),a("code",[t._v("reduce")]),t._v(" 方法创建对象时,指定了键(key)和值(value)的过程如下:")])]),t._v(" "),a("ul",[a("li",[a("p",[a("strong",[t._v("键(Key)的创建")]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("键是通过将国家名转换为小写并移除所有空格来创建的。在代码中,这是通过 "),a("code",[t._v("country.toLowerCase().replace(/ /g, '')")]),t._v(" 实现的。")]),t._v(" "),a("li",[t._v("这里,"),a("code",[t._v("country")]),t._v(" 是数组中的当前元素(即国家名)。"),a("code",[t._v("toLowerCase()")]),t._v(" 方法将国家名转换为小写,"),a("code",[t._v("replace(/ /g, '')")]),t._v(" 方法则移除所有空格。")]),t._v(" "),a("li",[t._v("这个转换后的字符串(国家名的小写无空格版本)被用作对象的键。")])])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("值(Value)的指定")]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("值直接使用原始的国家名(即数组中的当前元素 "),a("code",[t._v("country")]),t._v(")。")]),t._v(" "),a("li",[t._v("在 "),a("code",[t._v("obj[key] = country;")]),t._v(" 这行代码中,"),a("code",[t._v("obj")]),t._v(" 是累加器对象,"),a("code",[t._v("key")]),t._v(" 是经过处理的国家名,"),a("code",[t._v("country")]),t._v("是原始的国家名。")]),t._v(" "),a("li",[t._v("因此,每次迭代时,都会在"),a("code",[t._v("obj")]),t._v(" 对象中添加一个新属性,其属性名为处理后的国家名,属性值为原始国家名。")])])])]),t._v(" "),a("p",[t._v("这种方式确保了在生成的对象中,每个键(处理后的国家名)都对应一个值(原始的国家名)。例如,如果 "),a("code",[t._v("countries")]),t._v(" 数组包含 "),a("code",[t._v("'Canada'")]),t._v(",则生成的对象会有一个属性,其键为 "),a("code",[t._v("'canada'")]),t._v(",值为 "),a("code",[t._v("'Canada'")]),t._v("。")])])]),t._v(" "),a("h3",{attrs:{id:"称为-属性访问器语法"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#称为-属性访问器语法"}},[t._v("#")]),t._v(" 称为“属性访问器语法”")]),t._v(" "),a("p",[t._v("在 Javascript 中, 使用 "),a("code",[t._v("obj[key] = country;")]),t._v(" 这种使用方括号 ("),a("code",[t._v("[]")]),t._v(") 的语法是访问或设置对象属性的一种方式,称为“属性访问器语法”。在这个特定的上下文中,它用于动态地设置对象的属性。当您需要动态地将变量的值用作对象键(key)时,使用方括号 ("),a("code",[t._v("[]")]),t._v(") 语法是非常重要和实用的。这种语法使您可以根据变量的值来动态设置或访问对象的属性。")]),t._v(" "),a("p",[a("strong",[t._v("使用方括号语法动态处理对象属性:")])]),t._v(" "),a("ol",[a("li",[a("p",[a("strong",[t._v("动态属性名")]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("使用 "),a("code",[t._v("obj[key]")]),t._v(" 时,"),a("code",[t._v("key")]),t._v(" 是一个变量,其值可以在每次迭代或函数调用中改变。方括号允许使用变量的值作为属性名。")]),t._v(" "),a("li",[t._v("相比之下,点语法(如 "),a("code",[t._v("obj.key")]),t._v(')用于访问名为 "key" 的固定属性,而不是变量 '),a("code",[t._v("key")]),t._v(" 的值。")])])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("设置对象属性")]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("表达式 "),a("code",[t._v("obj[key] = country")]),t._v(" 表示在对象 "),a("code",[t._v("obj")]),t._v(" 上设置一个属性,其属性名为变量 "),a("code",[t._v("key")]),t._v(" 的值,属性值为 "),a("code",[t._v("country")]),t._v("。")]),t._v(" "),a("li",[t._v("在迭代过程中,根据每个 "),a("code",[t._v("country")]),t._v(" 的值动态创建或更新 "),a("code",[t._v("obj")]),t._v(" 的属性。")])])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("灵活性和实用性")]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("方括号语法在运行时动态确定属性名,特别适用于处理变量属性名或由表达式计算得到的属性名。")]),t._v(" "),a("li",[t._v("这种方法提高了灵活性,允许根据不同情况和数据设置不同的属性名。")])])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("应用场景")]),t._v(":")]),t._v(" "),a("ul",[a("li",[t._v("当处理需要根据运行时数据动态创建或访问对象属性的场景(如用户输入、结果计算或数组迭代)时,方括号语法是必需的。")])])])]),t._v(" "),a("p",[a("strong",[t._v("结论")]),t._v(":\n使用方括号 ("),a("code",[t._v("obj[key]")]),t._v(") 语法是 JavaScript 中一种强大的特性,允许您的代码根据不同情况动态地处理对象属性。它在如 "),a("code",[t._v("reduce")]),t._v(" 方法这样的场景中特别有用,因为它允许根据数组中的每个元素动态构建对象的属性,确保代码的灵活性和一致性。")]),t._v(" "),a("h2",{attrs:{id:"🔻-dan-tutorial-チュートリアル"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔻-dan-tutorial-チュートリアル"}},[t._v("#")]),t._v(" 🔻 Dan tutorial チュートリアル")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" people "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bob'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("age")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("position")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'developer'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'peter'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("age")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("position")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'designer'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'susy'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("age")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("position")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'the boss'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// without using map method")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" name "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" person "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" People"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n names"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("person"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toUpperCase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("names"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// ["BOB", "PETER", "SUSY"]')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//with map method")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" names "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("person")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" person"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toUpperCase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//with map method")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" names"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("person")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("person"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toUpperCase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//with map method")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" age "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" newPeople "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("person")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("firstName")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" person"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toUpperCase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("oldAge")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" person"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("age "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/45.53b109cf.js b/assets/js/45.53b109cf.js new file mode 100644 index 00000000..e3a1e49f --- /dev/null +++ b/assets/js/45.53b109cf.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{333:function(t,s,a){"use strict";a.r(s);var i=a(14),n=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"axios"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#axios"}},[this._v("#")]),this._v(" Axios")])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/46.f7c681d7.js b/assets/js/46.f7c681d7.js new file mode 100644 index 00000000..aad6bfbf --- /dev/null +++ b/assets/js/46.f7c681d7.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{332:function(s,a,t){"use strict";t.r(a);var n=t(14),e=Object(n.a)({},(function(){var s=this,a=s._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"コンフィギュレーション"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#コンフィギュレーション"}},[s._v("#")]),s._v(" コンフィギュレーション")]),s._v(" "),a("h2",{attrs:{id:"install-update-nvm"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-update-nvm"}},[s._v("#")]),s._v(" Install & Update nvm")]),s._v(" "),a("p",[s._v("To install or update Node Version Manager (nvm), you can use the following commands:")]),s._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("bash")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("export")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("NVM_DIR")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-z")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${XDG_CONFIG_HOME-}")]),s._v('"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("printf")]),s._v(" %s "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${"),a("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("HOME")]),s._v("}")]),s._v('/.nvm"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("printf")]),s._v(" %s "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${XDG_CONFIG_HOME}")]),s._v('/nvm"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v('"')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-s")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$NVM_DIR")]),s._v('/nvm.sh"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v(". "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$NVM_DIR")]),s._v('/nvm.sh"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# This loads nvm")]),s._v("\n")])])]),a("p",[s._v("Don't forget to source your shell configuration file after the installation:")]),s._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("source")]),s._v(" ~/.bashrc\n")])])]),a("p",[s._v("For zsh users, you can modify your "),a("code",[s._v(".zshrc")]),s._v(" file using the following steps:")]),s._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nano")]),s._v(" .zshrc\n")])])]),a("p",[s._v("To automatically call "),a("code",[s._v("nvm use")]),s._v(" if "),a("code",[s._v(".nvmrc")]),s._v(" is present, you can add the following snippet to your "),a("code",[s._v(".zshrc")]),s._v(":")]),s._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("export")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("NVM_DIR")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-z")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${XDG_CONFIG_HOME-}")]),s._v('"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("printf")]),s._v(" %s "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${"),a("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("HOME")]),s._v("}")]),s._v('/.nvm"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("printf")]),s._v(" %s "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${XDG_CONFIG_HOME}")]),s._v('/nvm"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v('"')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-s")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$NVM_DIR")]),s._v('/nvm.sh"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v(". "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$NVM_DIR")]),s._v('/nvm.sh"')]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Place this after nvm initialization!")]),s._v("\nautoload "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-U")]),s._v(" add-zsh-hook\n\n"),a("span",{pre:!0,attrs:{class:"token function-name function"}},[s._v("load-nvmrc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("local")]),s._v(" nvmrc_path\n "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("nvmrc_path")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),s._v("nvm_find_nvmrc"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v('"')]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-n")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$nvmrc_path")]),s._v('"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("local")]),s._v(" nvmrc_node_version\n "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("nvmrc_node_version")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),s._v("nvm version "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${nvmrc_path}")]),s._v('"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v('"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$nvmrc_node_version")]),s._v('"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"N/A"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n nvm "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$nvmrc_node_version")]),s._v('"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),s._v("nvm version"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v('"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n nvm use\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-n")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("PWD")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("$OLDPWD")]),s._v(" nvm_find_nvmrc"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v('"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),s._v("nvm version"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v('"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),s._v("nvm version default"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v('"')]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Reverting to nvm default version"')]),s._v("\n nvm use default\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\nadd-zsh-hook chpwd load-nvmrc\nload-nvmrc\n")])])]),a("p",[s._v("This configuration will ensure that "),a("code",[s._v("nvm use")]),s._v(" is called automatically based on the presence of a "),a("code",[s._v(".nvmrc")]),s._v(" file in your project directory.")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/47.8ca3627f.js b/assets/js/47.8ca3627f.js new file mode 100644 index 00000000..e4d0909a --- /dev/null +++ b/assets/js/47.8ca3627f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{336:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"⚪️-reacthooks-を深く理解する"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-reacthooks-を深く理解する"}},[t._v("#")]),t._v(" ⚪️ ReactHooks を深く理解する")]),t._v(" "),s("h2",{attrs:{id:"🔷-useeffect"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-useeffect"}},[t._v("#")]),t._v(" 🔷 useEffect")]),t._v(" "),s("h3",{attrs:{id:"▫️-what-is-useeffect"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-what-is-useeffect"}},[t._v("#")]),t._v(" ▫️ what is "),s("code",[t._v("useEffect")])]),t._v(" "),s("p",[s("code",[t._v("useEffect")]),t._v(" 是 React 中的一個 Hook,它主要用於處理副作用操作,例如異步數據的獲取、對已渲染的結果進行更新渲染等。")]),t._v(" "),s("ul",[s("li",[s("p",[t._v("第二個參數:依賴數組")]),t._v(" "),s("p",[s("code",[t._v("useEffect")]),t._v(" 的第二個參數,通常是一個依賴數組,決定了 "),s("code",[t._v("useEffect")]),t._v(" 何時執行。這個參數的作用有以下幾種情況:")]),t._v(" "),s("ol",[s("li",[s("p",[t._v("空數組 "),s("code",[t._v("[]")]),t._v(":當依賴數組為空時,"),s("code",[t._v("useEffect")]),t._v(" 只會在組件挂載時運行一次,就像 "),s("code",[t._v("componentDidMount")]),t._v("。這對於僅在組件挂載和卸載時執行一次的操作非常有用,例如初始化資料")])]),t._v(" "),s("li",[s("p",[t._v("非空數組 "),s("code",[t._v("[依賴1, 依賴2, ...]")]),t._v(":當依賴數組中的任何一個依賴發生變化時,"),s("code",[t._v("useEffect")]),t._v(" 會運行。這對於需要根據特定狀態或 prop 執行操作的情況非常有用。如果你希望 "),s("code",[t._v("useEffect")]),t._v(" 在每次渲染時都運行,則不傳入第二個參數即可。")])])]),t._v(" "),s("p",[t._v("簡而言之,"),s("code",[t._v("useEffect")]),t._v(" 的第二個參數決定了該 hook 何時執行,它提供了對 hook 執行的細粒度控制。")])]),t._v(" "),s("li",[s("p",[t._v("side effect(外部影響內部): 從外部獲取數據,對內部渲染的結果產生了作用")])])]),t._v(" "),s("h3",{attrs:{id:"▫️-basic-purpose"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-basic-purpose"}},[t._v("#")]),t._v(" ▫️ Basic Purpose")]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useEffect "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("MyComponent")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"---回调中---"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("querySelector")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"h1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"當前的值: "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 这里的空数组表示只在组件挂载时运行一次")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"***组件中***"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("count "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Hello World! ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" container "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"root"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 这里假设你的根 DOM 元素的 id 是 "root"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" MyComponent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("輸出結果")])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("如果组件首次挂载(加载),那么输出将如下所示:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("***组件中***\n---回调中---\nnull\n當前的值: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n")])])]),s("ul",[s("li",[s("code",[t._v("***组件中***")]),t._v("会在每次组件函数被调用时输出。")]),t._v(" "),s("li",[s("code",[t._v("---回调中---")]),t._v("会在"),s("code",[t._v("useEffect")]),t._v("的回调函数内部输出,只有在组件挂载时才会执行一次。")]),t._v(" "),s("li",[s("code",[t._v("null")]),t._v("是因为在组件挂载时,"),s("code",[t._v("

    ")]),t._v("元素还没有被渲染到 DOM 中,所以"),s("code",[t._v('document.querySelector("h1")')]),t._v("返回"),s("code",[t._v("null")]),t._v("。")]),t._v(" "),s("li",[s("code",[t._v("當前的值: 0")]),t._v("表示"),s("code",[t._v("count")]),t._v("的初始值为 0。")])])]),t._v(" "),s("li",[s("p",[t._v("如果用户点击"),s("code",[t._v("

    ")]),t._v("元素以增加"),s("code",[t._v("count")]),t._v("的值,那么每次点击后的输出将如下所示,以点击两次为例:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("***组件中***\n---回调中---\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("Hello World"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v("<")]),t._v("/h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("\n當前的值: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n***组件中***\n---回调中---\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("Hello World"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("2")]),t._v("<")]),t._v("/h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("\n當前的值: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n")])])]),s("ul",[s("li",[s("code",[t._v("***组件中***")]),t._v("会在每次组件函数被调用时输出。")]),t._v(" "),s("li",[s("code",[t._v("---回调中---")]),t._v("会在"),s("code",[t._v("useEffect")]),t._v("的回调函数内部输出,但它只在组件挂载时执行一次,所以之后点击"),s("code",[t._v("

    ")]),t._v("元素不会再次触发该输出。")]),t._v(" "),s("li",[s("code",[t._v("

    Hello World! 1

    ")]),t._v("和"),s("code",[t._v("

    Hello World! 2

    ")]),t._v("是每次点击后,React 重新渲染组件后生成的"),s("code",[t._v("

    ")]),t._v("元素。")]),t._v(" "),s("li",[s("code",[t._v("當前的值: 1")]),t._v("和"),s("code",[t._v("當前的值: 2")]),t._v("表示"),s("code",[t._v("count")]),t._v("的值在每次点击后更新。")])])])]),t._v(" "),s("h3",{attrs:{id:"▫️-second-argument-dependency-array"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-second-argument-dependency-array"}},[t._v("#")]),t._v(" ▫️ Second Argument - Dependency Array")]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useEffect "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setPage"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"---回调中---"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("querySelector")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"h1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"當前的值: "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 这里的空数组表示只在组件挂载时运行一次")]),t._v("\n\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"***组件中***"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("count "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Hello World! ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setPage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("page "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Next Page ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" App"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v('如果同时点击 "Hello World!" '),s("code",[t._v("

    ")]),t._v(' 元素和 "Next Page" 按钮,会同时触发'),s("code",[t._v("count")]),t._v("和"),s("code",[t._v("page")]),t._v("的更新,因此"),s("code",[t._v("useEffect")]),t._v("将在两者之间交替触发。以下是可能的打印结果示例:")]),t._v(" "),s("ol",[s("li",[s("p",[t._v('初始渲染(挂载)后,点击 "Hello World!" '),s("code",[t._v("

    ")]),t._v(' 元素和 "Next Page" 按钮:')]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("***组件中***\n---回调中---\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("Hello World"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("0")]),t._v("<")]),t._v("/h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("\n當前的值: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n***组件中***\n---回调中---\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("Hello World"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("0")]),t._v("<")]),t._v("/h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("\n當前的值: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n")])])]),s("ul",[s("li",[t._v("初始渲染时,"),s("code",[t._v("count")]),t._v(" 的值为 0,"),s("code",[t._v("page")]),t._v(" 的值为 1。")]),t._v(" "),s("li",[t._v('同时点击 "Hello World!" '),s("code",[t._v("

    ")]),t._v(' 元素和 "Next Page" 按钮,'),s("code",[t._v("count")]),t._v(" 和 "),s("code",[t._v("page")]),t._v(" 的值会同时更新,但是由于"),s("code",[t._v("useEffect")]),t._v("的依赖数组包含了这两者,它会在其中任何一个发生变化时触发。所以 "),s("code",[t._v("useEffect")]),t._v(" 打印了新的 "),s("code",[t._v("count")]),t._v(" 值为 0 和新的 "),s("code",[t._v("page")]),t._v(" 值为 2,以及其他信息。")])])]),t._v(" "),s("li",[s("p",[t._v('点击 "Hello World!" '),s("code",[t._v("

    ")]),t._v(' 元素后再点击 "Next Page" 按钮:')]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("***组件中***\n---回调中---\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("Hello World"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("0")]),t._v("<")]),t._v("/h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("\n當前的值: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n***组件中***\n---回调中---\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("Hello World"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("0")]),t._v("<")]),t._v("/h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("\n當前的值: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n***组件中***\n---回调中---\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("Hello World"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("0")]),t._v("<")]),t._v("/h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("\n當前的值: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n***组件中***\n---回调中---\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("Hello World"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v("<")]),t._v("/h"),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("1")]),t._v(">")]),t._v("\n當前的值: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n")])])]),s("ul",[s("li",[t._v('首先点击 "Hello World!" '),s("code",[t._v("

    ")]),t._v(" 元素,"),s("code",[t._v("count")]),t._v(" 的值递增到 1,但 "),s("code",[t._v("page")]),t._v(" 仍然是 1,所以 "),s("code",[t._v("useEffect")]),t._v(" 不会触发。")]),t._v(" "),s("li",[t._v('然后点击 "Next Page" 按钮,'),s("code",[t._v("page")]),t._v(" 的值从 1 增加到 2,同时 "),s("code",[t._v("count")]),t._v(" 仍然是 1,这次 "),s("code",[t._v("useEffect")]),t._v(" 会触发,并打印新的 "),s("code",[t._v("page")]),t._v(" 值为 2,以及其他信息。")])])])]),t._v(" "),s("p",[t._v('总结:同时点击 "Hello World!" '),s("code",[t._v("

    ")]),t._v(' 元素和 "Next Page" 按钮会导致'),s("code",[t._v("count")]),t._v("和"),s("code",[t._v("page")]),t._v("的值同时更新,但是由于"),s("code",[t._v("useEffect")]),t._v("的依赖数组包含了这两者,它会在其中任何一个发生变化时触发,从而打印出相应的信息。"),s("code",[t._v("***组件中***")]),t._v(" 在每次组件函数被调用时都会输出,但它与这两个值无关。")]),t._v(" "),s("h3",{attrs:{id:"▫️-return-of-cleanup-function"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-return-of-cleanup-function"}},[t._v("#")]),t._v(" ▫️ Return of Cleanup Function")]),t._v(" "),s("p",[t._v("理解清除函数 ("),s("code",[t._v("return")]),t._v(" 函数) 在 "),s("code",[t._v("useEffect")]),t._v(" 中的作用非常重要,它用于处理副作用的清理和资源释放。以下是关于为什么需要清除函数以及一些常见用例的优化笔记:")]),t._v(" "),s("blockquote",[s("p",[t._v("为什么需要清除函数?")])]),t._v(" "),s("ol",[s("li",[s("p",[t._v("因為 "),s("code",[t._v("useEffect")]),t._v(" 會反覆執行")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("资源释放")]),t._v(":"),s("code",[t._v("useEffect")]),t._v(" 可以用于处理需要清理的操作,比如关闭数据库连接、取消网络请求、清除定时器等。这是因为在组件卸载或下一次 "),s("code",[t._v("useEffect")]),t._v(" 触发之前,React 会调用清除函数,以确保资源被正确释放,避免内存泄漏和不必要的资源占用。")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("防止副作用的重复执行")]),t._v(":在某些情况下,组件的重新渲染可能会导致 "),s("code",[t._v("useEffect")]),t._v(" 多次触发。通过清除函数,你可以在每次 "),s("code",[t._v("useEffect")]),t._v(" 触发前清理之前的副作用,以确保只执行最新的操作,而不重复执行。")])])]),t._v(" "),s("p",[t._v("🔻 シナリオ")]),t._v(" "),s("ul",[s("li",[t._v("清除定时器")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" timerId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setInterval")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 执行一些操作")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 清除定时器")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clearInterval")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timerId"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("上述代码示例创建了一个定时器,并且通过返回的清除函数来清除定时器。这样可以确保在组件卸载或下一次 "),s("code",[t._v("useEffect")]),t._v(" 触发之前,定时器会被正确清除,防止内存泄漏和不必要的执行。")]),t._v(" "),s("ul",[s("li",[t._v("断开数据库连接")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 连接到数据库")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 清理数据库连接")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 断开数据库连接")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("在这个示例中,"),s("code",[t._v("useEffect")]),t._v(" 用于连接数据库,并通过返回的清除函数来断开数据库连接。这确保了在组件卸载或下一次 "),s("code",[t._v("useEffect")]),t._v(" 触发之前,数据库连接会被正确关闭。")]),t._v(" "),s("ul",[s("li",[t._v("取消网络请求")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" controller "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AbortController")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://api.example.com/data"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("signal")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" controller"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("signal "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 处理响应数据")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"AbortError"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 请求被取消")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 处理其他错误")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 清除控制器以取消网络请求")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" controller"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("abort")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("在这个示例中,我们使用 "),s("code",[t._v("AbortController")]),t._v(" 来控制网络请求,并通过返回的清除函数来取消网络请求。这样可以确保在组件卸载或下一次 "),s("code",[t._v("useEffect")]),t._v(" 触发之前,网络请求会被正确取消。")]),t._v(" "),s("p",[t._v("总之,清除函数在处理副作用的清理和资源释放时非常重要。它允许你在组件生命周期中管理资源,确保它们被正确释放,从而避免潜在的问题。")]),t._v(" "),s("h3",{attrs:{id:"▫️-execution-timing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-execution-timing"}},[t._v("#")]),t._v(" ▫️ Execution Timing")]),t._v(" "),s("blockquote",[s("p",[t._v("在 useEffect 的回调函数中,当依赖数组中的某些依赖发生变化或者组件被卸载时,React 会执行回调函数中的返回值函数(清除函数)。这是确保在重新运行 useEffect 之前,清理之前副作用的机制。")])]),t._v(" "),s("ul",[s("li",[s("p",[t._v("組件被銷毀時")])]),t._v(" "),s("li",[s("p",[t._v("第二次執行回調時,會先執行上一次回調中的返回值函數")]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"---回调中---"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~~~回調中返回值函數~~~"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("page"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"***組件中***"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("打印結果:")])])]),t._v(" "),s("ol",[s("li",[s("p",[t._v("第一次打印:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("***組件中***\n---回调中---\n")])])])]),t._v(" "),s("li",[s("p",[t._v("第二次打印:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("***組件中***\n~~~回調中返回值函數~~~ "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n---回调中---\n")])])])])]),t._v(" "),s("p",[t._v("從第二次打印中,可以看出,如果 "),s("code",[t._v("page")]),t._v(" 的值发生了变化,那么 "),s("code",[t._v("useEffect")]),t._v("的回调函数将会再次执行。但在执行新的回调函数之前,React 会先执行上一次回调函数中的返回值函数(清除函数),然后再执行新的回调函数。这确保了在重新运行 useEffect 之前,可以清理之前的副作用。")]),t._v(" "),s("h3",{attrs:{id:"▫️-usage-limitation-cannot-use-async-functions-directly"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-usage-limitation-cannot-use-async-functions-directly"}},[t._v("#")]),t._v(" ▫️ Usage Limitation - Cannot Use "),s("code",[t._v("async")]),t._v(" Functions Directly")]),t._v(" "),s("blockquote",[s("p",[t._v("因为 "),s("code",[t._v("async")]),t._v(" 函数返回的是一个 Promise 对象。这是因为 "),s("code",[t._v("useEffect")]),t._v(" 的回调函数应该是同步的,而不应该返回一个 Promise 对象。")])]),t._v(" "),s("blockquote",[s("p",[t._v("如果你需要在 "),s("code",[t._v("useEffect")]),t._v(" 中执行异步操作,可以在回调函数内部创建一个 async 函数,然后在这个 async 函数内部执行异步操作。以下是一个示例:")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetchData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://api.example.com/data"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 执行其他操作,例如更新 state")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"发生错误:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetchData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("在这个示例中,我们在 "),s("code",[t._v("useEffect")]),t._v(" 的回调函数内部创建了一个名为 "),s("code",[t._v("fetchData")]),t._v(" 的 async 函数,然后在其中执行异步操作。这种方式可以让你在 "),s("code",[t._v("useEffect")]),t._v(" 中处理异步逻辑,但依然保持了回调函数的同步性质。")]),t._v(" "),s("p",[t._v("需要注意的是,虽然 async 函数内部可以使用 "),s("code",[t._v("await")]),t._v(" 关键字等待异步操作完成,但整个回调函数仍然是同步执行的,不会等待异步操作的完成。因此,在使用 async 函数时,要确保正确处理异步操作的结果和错误。")]),t._v(" "),s("h2",{attrs:{id:"🔷-useref"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-useref"}},[t._v("#")]),t._v(" 🔷 useRef")]),t._v(" "),s("h3",{attrs:{id:"▫️-what-is-useref"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-what-is-useref"}},[t._v("#")]),t._v(" ▫️ what is "),s("code",[t._v("useRef")])]),t._v(" "),s("p",[s("code",[t._v("useRef")]),t._v(" 是 React 中的一个 Hook,它可以用于获取或存储组件的引用。它类似于 class 组件中的 "),s("code",[t._v("ref")]),t._v(" 属性,但是它可以用于函数组件。 "),s("code",[t._v("useRef")]),t._v(" 返回一个可变的 ref 对象,其 "),s("code",[t._v(".current")]),t._v(" 属性被初始化为传入的参数("),s("code",[t._v("initialValue")]),t._v(")。返回的 ref 对象在组件的整个生命周期内保持不变。")]),t._v(" "),s("h3",{attrs:{id:"▫️-basic-purpose-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-basic-purpose-2"}},[t._v("#")]),t._v(" ▫️ Basic Purpose")]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useRef "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" inputRef "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useRef")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("handleClick")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("focus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleClick"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("聚焦输入框")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" App"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("在这个示例中,我们使用 "),s("code",[t._v("useRef")]),t._v(" 创建了一个名为 "),s("code",[t._v("inputRef")]),t._v(" 的 ref 对象,并将其传递给 "),s("code",[t._v("")]),t._v(" 元素的 "),s("code",[t._v("ref")]),t._v(" 属性。这样,我们就可以通过 "),s("code",[t._v("inputRef.current")]),t._v(" 来获取 "),s("code",[t._v("")]),t._v(" 元素的引用。")]),t._v(" "),s("p",[t._v("在 "),s("code",[t._v("handleClick")]),t._v(" 函数中,我们使用 "),s("code",[t._v("inputRef.current.focus()")]),t._v(" 来聚焦 "),s("code",[t._v("")]),t._v(' 元素。这样,当用户点击 "Focus the input" 按钮时,'),s("code",[t._v("")]),t._v(" 元素就会被聚焦。")]),t._v(" "),s("h3",{attrs:{id:"▫️-usage-limitation-cannot-use-useref-to-update-state"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-usage-limitation-cannot-use-useref-to-update-state"}},[t._v("#")]),t._v(" ▫️ Usage Limitation - Cannot Use "),s("code",[t._v("useRef")]),t._v(" to Update State")]),t._v(" "),s("blockquote",[s("p",[s("code",[t._v("useRef")]),t._v(" 不能用于更新组件的 state。这是因为 "),s("code",[t._v("useRef")]),t._v(" 返回的 ref 对象在组件的整个生命周期内保持不变,而 "),s("code",[t._v("useState")]),t._v(" 会在每次渲染时返回一个新的 state 值。")])]),t._v(" "),s("blockquote",[s("p",[t._v("如果你需要在 "),s("code",[t._v("useRef")]),t._v(" 中更新 state,可以使用 "),s("code",[t._v("useRef")]),t._v(" 的 "),s("code",[t._v(".current")]),t._v(" 属性来存储 state 的值。以下是一个示例:")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useRef "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" countRef "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useRef")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("handleAlertClick")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setTimeout")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"You clicked on: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" countRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setCount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("count "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Increment-useState")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleAlertClick"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Show alert-useRef")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" App"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("在這個示例中, 我們使用 "),s("code",[t._v("useRef")]),t._v(" 創建了一個名為 "),s("code",[t._v("countRef")]),t._v(" 的 ref 對象,並將其初始化為 0。然後,我們在 "),s("code",[t._v("handleAlertClick")]),t._v(" 函數中使用 "),s("code",[t._v("countRef.current")]),t._v(" 來獲取 "),s("code",[t._v("count")]),t._v(' 的值。這樣,當用戶點擊 "Show alert" 按鈕時,我們就可以獲取 '),s("code",[t._v("count")]),t._v(" 的值。")]),t._v(" "),s("p",[t._v("當點擊 "),s("code",[t._v("Increment")]),t._v(" 後, "),s("code",[t._v("count")]),t._v(" 的值會增加,但是 "),s("code",[t._v("countRef.current")]),t._v(" 的值仍然是 0。這是因為 "),s("code",[t._v("useRef")]),t._v(" 返回的 ref 對象在組件的"),s("strong",[t._v("整個生命周期")]),t._v("內保持不變,而 "),s("code",[t._v("useState")]),t._v(" 會在每次渲染時返回一個新的 state 值。")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th"),t._v(" "),s("th",[s("code",[t._v("useState")])]),t._v(" "),s("th",[s("code",[t._v("useRef")])])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("修改值的時候")]),t._v(" "),s("td",[t._v("觸發重新渲染")]),t._v(" "),s("td",[s("strong",[t._v("不")]),t._v("觸發重新渲染")])]),t._v(" "),s("tr",[s("td",[t._v("組件重新渲染時")]),t._v(" "),s("td",[t._v("獲取之前的值")]),t._v(" "),s("td",[t._v("獲取之前值")])])])]),t._v(" "),s("p",[t._v("🔺 シナリオ:")]),t._v(" "),s("ul",[s("li",[t._v("定時器案例:當我們不需要它渲染後的值,而是需要它渲染前的值時,就可以使用 "),s("code",[t._v("useRef")]),t._v("。")])]),t._v(" "),s("blockquote",[s("p",[t._v("不使用 "),s("code",[t._v("useRef")]),t._v(" 的情況, 以下: 每次點擊,都清除之前的定時器,看上去沒有問題。 但其實如果組件重新渲染,是不會清除之前定時器的, 本次的 timer 與上一次的 timer 不一樣")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" timer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("handleClick")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clearInterval")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n timer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setInterval")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"timer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("使用"),s("code",[t._v("useRef")]),t._v(" 之後")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" timer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useRef")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("handleClick")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clearInterval")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("timer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n timer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setInterval")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"timer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("在這個示例中, 我們使用 "),s("code",[t._v("useRef")]),t._v(" 創建了一個名為 "),s("code",[t._v("countRef")]),t._v(" 的 ref 對象,並將其初始化為 0。然後,我們在 "),s("code",[t._v("handleAlertClick")]),t._v(" 函數中使用 "),s("code",[t._v("countRef.current")]),t._v(" 來獲取 "),s("code",[t._v("count")]),t._v(' 的值。這樣,當用戶點擊 "Show alert" 按鈕時,我們就可以獲取 '),s("code",[t._v("count")]),t._v(" 的值。")]),t._v(" "),s("p",[t._v("當點擊 "),s("code",[t._v("Increment")]),t._v(" 後, "),s("code",[t._v("count")]),t._v(" 的值會增加,但是 "),s("code",[t._v("countRef.current")]),t._v(" 的值仍然是 0。這是因為 "),s("code",[t._v("useRef")]),t._v(" 返回的 ref 對象在組件的"),s("strong",[t._v("整個生命周期")]),t._v("內保持不變,而 "),s("code",[t._v("useState")]),t._v(" 會在每次渲染時返回一個新的 state 值。")]),t._v(" "),s("ul",[s("li",[t._v("修改"),s("code",[t._v("dom")]),t._v("的值")])]),t._v(" "),s("ol",[s("li",[t._v("變量引用的方式 - 在"),s("code",[t._v("

    ")]),t._v("元素上使用 ref 属性,将 h1Ref 引用对象与该 DOM 元素关联。这样,"),s("code",[t._v("h1Ref.current")]),t._v(" 就可以访问到这个 DOM 元素。")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useRef "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" h1Ref "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useRef")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("handleClick")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n h1Ref"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("innerHTML "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello World!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("h1Ref"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Hello React!")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleClick"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Change the h1")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("ul",[s("li",[s("p",[t._v("在这个 React 函数组件中,要注意渲染和拿到值的顺序如下:")]),t._v(" "),s("ol",[s("li",[s("p",[t._v("在组件渲染之初,会创建一个"),s("code",[t._v("h1Ref")]),t._v("引用对象,并初始化为"),s("code",[t._v("null")]),t._v("。在元素上使用 ref 属性,将"),s("code",[t._v("h1Ref")]),t._v("引用对象与该 DOM 元素关联。这样,"),s("code",[t._v("h1Ref.current")]),t._v("就可以访问到这个 DOM 元素。")])]),t._v(" "),s("li",[s("p",[t._v("渲染阶段:React 会首先渲染组件的 UI,包括 元素和按钮。此时,"),s("code",[t._v("h1Ref")]),t._v("仍然是"),s("code",[t._v("null")]),t._v('。当页面首次渲染时, 元素的内容显示为"Hello React!"。')])]),t._v(" "),s("li",[s("p",[t._v("用户点击按钮后,触发"),s("code",[t._v("handleClick")]),t._v("函数。")])]),t._v(" "),s("li",[s("p",[t._v("在"),s("code",[t._v("handleClick")]),t._v("函数内部,通过"),s("code",[t._v("h1Ref.current")]),t._v("来访问引用的 DOM 元素,尝试修改其"),s("code",[t._v("innerHTML")]),t._v("属性为"),s("code",[t._v('"Hello World!"。')])])]),t._v(" "),s("li",[s("p",[t._v("由于 React 的生命周期,上述 DOM 修改是在组件的渲染完成后才执行的。这是因为 React 会在渲染阶段记录下需要进行的 DOM 更新操作,并在渲染完成后才执行这些操作,以确保性能和一致性。")])])]),t._v(" "),s("p",[t._v("所以,虽然在"),s("code",[t._v("handleClick")]),t._v("函数中访问了"),s("code",[t._v("h1Ref.current")]),t._v(',但实际的 DOM 操作是在渲染完成后才进行的。因此,当用户点击按钮时,页面上的 元素会被修改为"Hello World!"。这就是 React 的渲染和 DOM 更新机制的基本工作原理。')])])]),t._v(" "),s("ol",{attrs:{start:"2"}},[s("li",[t._v("回調函數的方式")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useRef "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("App")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" h1Ref "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useRef")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("handleClick")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n h1Ref"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("innerHTML "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello World!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("thisDom")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("thisDom"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n thisDom"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("style"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("background "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"green"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n h1Ref"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" thisDom"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Update the reference of h1Ref")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n Hello React!\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleClick"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Change the h1")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("ul",[s("li",[s("p",[s("code",[t._v("useRef")]),t._v("的回调函数方式来引用 DOM 元素并修改其样式。")]),t._v(" "),s("ol",[s("li",[s("p",[t._v("在"),s("code",[t._v("

    ")]),t._v("元素上使用"),s("code",[t._v("ref")]),t._v("属性,传递一个回调函数。这个回调函数接收一个参数"),s("code",[t._v("thisDom")]),t._v(",它代表了"),s("code",[t._v("

    ")]),t._v("元素的 DOM 对象。")])]),t._v(" "),s("li",[s("p",[t._v("在回调函数中,首先检查"),s("code",[t._v("thisDom")]),t._v("是否存在,以防止在某些情况下为"),s("code",[t._v("null")]),t._v("。如果"),s("code",[t._v("thisDom")]),t._v("存在,就在其中设置样式"),s("code",[t._v("background")]),t._v("为'green'。")])]),t._v(" "),s("li",[s("p",[t._v("然后,通过"),s("code",[t._v("h1Ref.current = thisDom")]),t._v("来更新"),s("code",[t._v("h1Ref")]),t._v("的引用,以确保"),s("code",[t._v("h1Ref")]),t._v("引用的始终是当前的 DOM 元素。")])])]),t._v(" "),s("p",[t._v("现在,当组件渲染时,"),s("code",[t._v("

    ")]),t._v("元素的背景颜色会被设置为绿色,并且你仍然可以使用"),s("code",[t._v("h1Ref.current")]),t._v("来访问它以进行其他操作。")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/48.c45fa987.js b/assets/js/48.c45fa987.js new file mode 100644 index 00000000..129c67c6 --- /dev/null +++ b/assets/js/48.c45fa987.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{338:function(t,e,r){"use strict";r.r(e);var s=r(14),a=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"⚪️-typescript-and-react"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-typescript-and-react"}},[this._v("#")]),this._v(" ⚪️ Typescript and React")]),this._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://www.youtube.com/watch?v=gieEQFIfgYc&t=6311s",target:"_blank",rel:"noopener noreferrer"}},[this._v("React Typescript Tutorial for Beginners\n"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/49.73811052.js b/assets/js/49.73811052.js new file mode 100644 index 00000000..5ae35f90 --- /dev/null +++ b/assets/js/49.73811052.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{340:function(t,a,r){"use strict";r.r(a);var s=r(14),e=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"typescript-深い理解と実践"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#typescript-深い理解と実践"}},[t._v("#")]),t._v(" Typescript 深い理解と実践")]),t._v(" "),a("h2",{attrs:{id:"🔸-chapter-1-start-here"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔸-chapter-1-start-here"}},[t._v("#")]),t._v(" 🔸 Chapter 1: Start Here")]),t._v(" "),a("h2",{attrs:{id:"🔸-chapter-2-basic-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔸-chapter-2-basic-types"}},[t._v("#")]),t._v(" 🔸 Chapter 2: Basic Types")]),t._v(" "),a("h2",{attrs:{id:"🔸-chapter-3-arrays-objects"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔸-chapter-3-arrays-objects"}},[t._v("#")]),t._v(" 🔸 Chapter 3: Arrays & Objects")]),t._v(" "),a("h2",{attrs:{id:"🔸-chapter-4-functions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔸-chapter-4-functions"}},[t._v("#")]),t._v(" 🔸 Chapter 4: Functions")]),t._v(" "),a("h2",{attrs:{id:"🔸-chapter-5-assertions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔸-chapter-5-assertions"}},[t._v("#")]),t._v(" 🔸 Chapter 5: Assertions")]),t._v(" "),a("h2",{attrs:{id:"🔸-chapter-6-classes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔸-chapter-6-classes"}},[t._v("#")]),t._v(" 🔸 Chapter 6: Classes")]),t._v(" "),a("h2",{attrs:{id:"🔸-chapter-7-index-signatures-keyof-assertions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔸-chapter-7-index-signatures-keyof-assertions"}},[t._v("#")]),t._v(" 🔸 Chapter 7: Index Signatures & keyof Assertions")]),t._v(" "),a("h2",{attrs:{id:"🔸-chapter-8-generics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔸-chapter-8-generics"}},[t._v("#")]),t._v(" 🔸 Chapter 8: Generics")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://chodocs.cn/ts/ch4.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("泛型-chocolate blog"),a("OutboundLink")],1),t._v(" "),a("a",{attrs:{href:""}},[t._v("dave gray")])]),t._v(" "),a("h2",{attrs:{id:"🔸-chapter-9-utility-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#🔸-chapter-9-utility-types"}},[t._v("#")]),t._v(" 🔸 Chapter 9: Utility Types")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/5.4ceb5601.js b/assets/js/5.4ceb5601.js new file mode 100644 index 00000000..dc9c9e50 --- /dev/null +++ b/assets/js/5.4ceb5601.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{278:function(t,e,a){},292:function(t,e,a){"use strict";a(278)},309:function(t,e,a){"use strict";a.r(e);var s={name:"CodeBlock",props:{title:{type:String,required:!0},active:{type:Boolean,default:!1}},mounted(){this.$parent&&this.$parent.loadTabs&&this.$parent.loadTabs()}},i=(a(292),a(14)),n=Object(i.a)(s,(function(){return(0,this._self._c)("div",{staticClass:"theme-code-block",class:{"theme-code-block__active":this.active}},[this._t("default")],2)}),[],!1,null,"759a7d02",null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/50.4ea28ae2.js b/assets/js/50.4ea28ae2.js new file mode 100644 index 00000000..a89ee29b --- /dev/null +++ b/assets/js/50.4ea28ae2.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{341:function(e,t,a){"use strict";a.r(t);var s=a(14),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"⚪️-webpack-について理解を深める"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#⚪️-webpack-について理解を深める"}},[e._v("#")]),e._v(" ⚪️ Webpack について理解を深める")]),e._v(" "),t("h2",{attrs:{id:"🔶-webpack-とは"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#🔶-webpack-とは"}},[e._v("#")]),e._v(" 🔶 Webpack とは?")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Webpack は複数の JavaScript ファイルを一つのファイルにまとめて出力するツールです。この「一つのファイルにまとめる」ことをバンドル(bundle)と言い、また「モジュールを一つのファイルにまとめて出力するツール」のことをモジュールバンドラー(module bundler)と呼びます。")])]),e._v(" "),t("li",[t("p",[e._v("公式 Document で Webpack は、👇 のように静的モジュールバンドラーと紹介されています。")])]),e._v(" "),t("li",[t("p",[e._v("webpack is a static module bundler for modern JavaScript applications")])]),e._v(" "),t("li",[t("p",[e._v("公式には 👇 のような図が記載されています。バンドルの雰囲気がわかりやすいですね。\n"),t("a",{attrs:{href:"https://webpack.js.org/concepts/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Concepts | webpack"),t("OutboundLink")],1)])])]),e._v(" "),t("h2",{attrs:{id:"🔶-なぜ-webpack-を使うのか"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#🔶-なぜ-webpack-を使うのか"}},[e._v("#")]),e._v(" 🔶 なぜ Webpack を使うのか?")]),e._v(" "),t("p",[e._v("複数の JavaScript ファイルを一つにまとめることで、ブラウザからのリクエスト数を減らし、ファイル転送の最適化が可能です。これが Webpack などのモジュールバンドラーを使う大きな理由です。")]),e._v(" "),t("p",[e._v("JavaScript ファイルが複数存在することでリクエスト回数が増えて転送効率が落ちるのであれは、最初から一つのファイルに記載することも可能ですが、可読性や保守性などの観点から現実的でありません。また、機能を複数ファイルに分割したままだと、ブラウザからのリクエスト回数が増えてファイル転送効率が落ちます。こういったつらみに対して、Webpack を利用することで機能をファイルごとに分割しながら開発し、実行時は一つのファイルとしてブラウザに提供することが可能となります。")]),e._v(" "),t("p",[e._v("👇 の記事では、dev ツールで実際のファイルサイズを細かく見ながら、Webpack のメリットについて言及されていますので、参考までに。\n"),t("a",{attrs:{href:"https://dev.to/bruno8moura/why-am-i-using-the-webpack-tool-4h14",target:"_blank",rel:"noopener noreferrer"}},[e._v("Why am'I using the webpack tool?"),t("OutboundLink")],1)]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://webpack.js.org/api/cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("Learn more about the CLI!"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://webpack.js.org/api/module-methods",target:"_blank",rel:"noopener noreferrer"}},[e._v("Learn more about modules!"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://webpack.js.org/api/node",target:"_blank",rel:"noopener noreferrer"}},[e._v("Learn more about the Node API!"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://webpack.js.org/api/loaders",target:"_blank",rel:"noopener noreferrer"}},[e._v("Learn more about loaders!"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://webpack.js.org/api/plugins",target:"_blank",rel:"noopener noreferrer"}},[e._v("Learn more about plugins!"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"🔶-webpack-の詳細"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#🔶-webpack-の詳細"}},[e._v("#")]),e._v(" 🔶 Webpack の詳細?")]),e._v(" "),t("h3",{attrs:{id:"▫️-loader-for-different-resource-types"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-loader-for-different-resource-types"}},[e._v("#")]),e._v(" ▫️ Loader for Different Resource Types")]),e._v(" "),t("p",[e._v("Webpack uses loaders for different resource types, such as:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("CSS:")]),e._v(" "),t("code",[e._v("css-loader")]),e._v(", "),t("code",[e._v("style-loader")])]),e._v(" "),t("li",[t("strong",[e._v("Less:")]),e._v(" "),t("code",[e._v("less-loader")])]),e._v(" "),t("li",[t("strong",[e._v("Sass:")]),e._v(" "),t("code",[e._v("sass-loader")])]),e._v(" "),t("li",[t("strong",[e._v("JavaScript:")]),e._v(" "),t("code",[e._v("ts-loader")]),e._v(", "),t("code",[e._v("babel-loader")])]),e._v(" "),t("li",[t("strong",[e._v("Vue:")]),e._v(" "),t("code",[e._v("vue-loader")])]),e._v(" "),t("li",[t("strong",[e._v("Static Resources:")]),e._v(" "),t("code",[e._v("url-loader")]),e._v(" (images, audio, video), "),t("code",[e._v("file-loader")]),e._v(" (files), "),t("code",[e._v("json-loader")]),e._v(" (JSON)")])]),e._v(" "),t("h3",{attrs:{id:"▫️-basic-functions-of-webpack-using-loaders"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-basic-functions-of-webpack-using-loaders"}},[e._v("#")]),e._v(" ▫️ Basic Functions of Webpack (Using Loaders)")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Code Transformation:")]),e._v(" TypeScript to JavaScript, ES6 to ES5, SCSS to CSS, etc.")]),e._v(" "),t("li",[t("strong",[e._v("Code Syntax Checking:")]),e._v(" Automatic code syntax checking using "),t("code",[e._v("eslint-loader")]),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("Code Splitting:")]),e._v(" Splitting code into chunks for on-demand loading, reducing initialization time, and improving first-screen rendering efficiency.")]),e._v(" "),t("li",[t("strong",[e._v("Automatic Compilation and Page Refresh:")]),e._v(" Automatically compile and refresh the page on local source code changes.")]),e._v(" "),t("li",[t("strong",[e._v("Automatic Deployment (Not commonly used):")]),e._v(" Automatically build and deploy code to the production system.")]),e._v(" "),t("li",[t("strong",[e._v("File Compression:")]),e._v(" Compress JavaScript, CSS, and HTML files to reduce file size.")]),e._v(" "),t("li",[t("strong",[e._v("Module Concatenation:")]),e._v(" Merge modules into a single file during compilation.")])]),e._v(" "),t("h3",{attrs:{id:"▫️-two-key-features-of-webpack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-two-key-features-of-webpack"}},[e._v("#")]),e._v(" ▫️ Two Key Features of Webpack")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Code Splitting:")]),e._v(" Breaks down code into chunks for on-demand loading, reducing initialization time.")]),e._v(" "),t("li",[t("strong",[e._v("Loader:")]),e._v(" Handles various types of static files and supports chaining operations.")])]),e._v(" "),t("h3",{attrs:{id:"▫️-webpack-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-webpack-configuration"}},[e._v("#")]),e._v(" ▫️ Webpack Configuration")]),e._v(" "),t("p",[e._v("Webpack runs in the Node.js environment, and its configuration file ("),t("code",[e._v("webpack.config.js")]),e._v(") follows the CommonJS pattern. It exports a JSON object with the following basic configuration options:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("entry")]),e._v(": Specifies the entry point of the modules.")]),e._v(" "),t("li",[t("code",[e._v("output")]),e._v(": Configures output file locations, names, and base paths.")]),e._v(" "),t("li",[t("code",[e._v("module")]),e._v(": Configures rules for different file types.")]),e._v(" "),t("li",[t("code",[e._v("resolve")]),e._v(": Configures aliases or module resolution rules.")]),e._v(" "),t("li",[t("code",[e._v("plugins")]),e._v(": Configures additional plugins to extend Webpack's functionality.")]),e._v(" "),t("li",[t("code",[e._v("devServer")]),e._v(": Implements local HTTP server features.")])]),e._v(" "),t("h3",{attrs:{id:"▫️-webpack-build-process"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-webpack-build-process"}},[e._v("#")]),e._v(" ▫️ Webpack Build Process")]),e._v(" "),t("ol",[t("li",[e._v("Start from the entry point and recursively transform dependent modules.")]),e._v(" "),t("li",[e._v("For each module found, use the corresponding loader to transform it.")]),e._v(" "),t("li",[e._v("Continue transforming the dependencies of the current module until there are no more dependencies.")]),e._v(" "),t("li",[e._v("Group modules by entry point, creating chunks.")]),e._v(" "),t("li",[e._v("Convert all chunks into output files.")])]),e._v(" "),t("h3",{attrs:{id:"▫️-common-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-common-plugins"}},[e._v("#")]),e._v(" ▫️ Common Plugins")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("html-webpack-plugin:")]),e._v(" Generates HTML pages based on a template.")]),e._v(" "),t("li",[t("strong",[e._v("clean-webpack-plugin:")]),e._v(" Cleans specified directories.")]),e._v(" "),t("li",[t("strong",[e._v("copy-webpack-plugin:")]),e._v(" Copies files.")]),e._v(" "),t("li",[t("strong",[e._v("uglifyjs-webpack-plugin:")]),e._v(" Minifies JavaScript code.")]),e._v(" "),t("li",[t("strong",[e._v("mini-css-extract-plugin:")]),e._v(" Extracts CSS into separate files.")])]),e._v(" "),t("h3",{attrs:{id:"▫️-difference-between-loader-and-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-difference-between-loader-and-plugin"}},[e._v("#")]),e._v(" ▫️ Difference Between Loader and Plugin")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Loader:")]),e._v(" Acts as a translator, transforming non-JavaScript resources during the build process.")]),e._v(" "),t("li",[t("strong",[e._v("Plugin:")]),e._v(" Extends Webpack's functionality by listening to events and altering the output.")])]),e._v(" "),t("h3",{attrs:{id:"▫️-webpack-hot-module-replacement-hmr-principle"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-webpack-hot-module-replacement-hmr-principle"}},[e._v("#")]),e._v(" ▫️ Webpack Hot Module Replacement (HMR) Principle")]),e._v(" "),t("p",[e._v("HMR allows modules to be replaced without refreshing the entire page. The key steps include establishing a WebSocket connection, monitoring file changes, and notifying the client about the changes.")]),e._v(" "),t("h3",{attrs:{id:"▫️-webpack-build-speed-optimization"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-webpack-build-speed-optimization"}},[e._v("#")]),e._v(" ▫️ Webpack Build Speed Optimization")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Use the latest Webpack and Node.js versions.")])]),e._v(" "),t("li",[t("p",[e._v("Minify code using plugins like "),t("code",[e._v("uglifyjs-webpack-plugin")]),e._v(".")])]),e._v(" "),t("li",[t("p",[e._v("Utilize multiple threads or processes for building (e.g., "),t("code",[e._v("thread-loader")]),e._v(" or "),t("code",[e._v("HappyPack")]),e._v(").")])]),e._v(" "),t("li",[t("p",[e._v("Narrow down the scope of file resolution.")])]),e._v(" "),t("li",[t("p",[e._v("Leverage caching for faster secondary builds.")])]),e._v(" "),t("li",[t("p",[e._v("Implement Tree Shaking to eliminate unused code.")])]),e._v(" "),t("li",[t("p",[e._v("Optimize module dependencies using Scope Hoisting.")])]),e._v(" "),t("li",[t("p",[e._v("Use CDN for basic packages to reduce bundle size.")])]),e._v(" "),t("li",[t("p",[e._v("Separate CSS from JavaScript using "),t("code",[e._v("mini-css-extract-plugin")]),e._v(".")])]),e._v(" "),t("li",[t("p",[t("a",{attrs:{href:"https://loadable-components.com/docs/getting-started/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Loadable Components"),t("OutboundLink")],1)])])]),e._v(" "),t("h3",{attrs:{id:"▫️-webpack-bundle-analyzer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-webpack-bundle-analyzer"}},[e._v("#")]),e._v(" ▫️ webpack-bundle-analyzer")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://qiita.com/kurosame/items/9e7092cdf08ff2ba7500",target:"_blank",rel:"noopener noreferrer"}},[e._v("webpack を可視化するツールを紹介"),t("OutboundLink")],1)]),e._v(" "),t("h3",{attrs:{id:"basic-steps-for-configuring-and-using-webpack-bundle-analyzer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#basic-steps-for-configuring-and-using-webpack-bundle-analyzer"}},[e._v("#")]),e._v(" Basic Steps for Configuring and Using webpack-bundle-analyzer:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Install the webpack-bundle-analyzer plugin using the following command in your project directory:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" --save-dev webpack-bundle-analyzer\n")])])])]),e._v(" "),t("li",[t("p",[e._v("In your webpack configuration file (e.g., webpack.config.js), import the webpack-bundle-analyzer plugin:")]),e._v(" "),t("div",{staticClass:"language-javascript extra-class"},[t("pre",{pre:!0,attrs:{class:"language-javascript"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("const")]),e._v(" BundleAnalyzerPlugin "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("require")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"webpack-bundle-analyzer"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("BundleAnalyzerPlugin"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Add a new instance of BundleAnalyzerPlugin to the "),t("code",[e._v("plugins")]),e._v(" property in your webpack configuration file:")]),e._v(" "),t("div",{staticClass:"language-javascript extra-class"},[t("pre",{pre:!0,attrs:{class:"language-javascript"}},[t("code",[e._v("module"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("exports "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// ...")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("plugins")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("new")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("BundleAnalyzerPlugin")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// ...")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Save your webpack configuration file and run your webpack build command. After the build is complete, webpack-bundle-analyzer will open a page on a server where you can view detailed analysis results.")])])]),e._v(" "),t("h3",{attrs:{id:"▫️-conditional-usage-in-development-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-conditional-usage-in-development-environment"}},[e._v("#")]),e._v(" ▫️ Conditional Usage in Development Environment:")]),e._v(" "),t("div",{staticClass:"language-javascript extra-class"},[t("pre",{pre:!0,attrs:{class:"language-javascript"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("const")]),e._v(" BundleAnalyzerPlugin "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("require")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"webpack-bundle-analyzer"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("BundleAnalyzerPlugin"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" plugins "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("process"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("env"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token constant"}},[e._v("NODE_ENV")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("===")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"development"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n plugins"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("push")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("new")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("BundleAnalyzerPlugin")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\nmodule"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("exports "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("//...")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("plugins")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" plugins"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("//...")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n")])])]),t("p",[e._v("In this code, the "),t("code",[e._v("BundleAnalyzerPlugin")]),e._v(" is added to the "),t("code",[e._v("plugins")]),e._v(" array only when the "),t("code",[e._v("NODE_ENV")]),e._v(" is set to 'development'. This helps in avoiding the generation of additional data in the production environment.")]),e._v(" "),t("h3",{attrs:{id:"▫️-detailed-configuration-options-for-bundleanalyzerplugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-detailed-configuration-options-for-bundleanalyzerplugin"}},[e._v("#")]),e._v(" ▫️ Detailed Configuration Options for BundleAnalyzerPlugin:")]),e._v(" "),t("div",{staticClass:"language-js extra-class"},[t("pre",{pre:!0,attrs:{class:"language-js"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("new")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("BundleAnalyzerPlugin")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Accepts a string to specify the format and channel of the generated report. It can be 'server', 'static', or 'disabled'.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// 'server' starts an HTTP server to provide an interactive report view, defaulting to localhost:8888.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// 'static' generates a single HTML file to describe the report.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// 'disabled' can be useful in some scenarios to temporarily disable the plugin while keeping the configuration code.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("analyzerMode")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"server"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// In 'server' mode, defines the hostname for the HTTP server.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("analyzerHost")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"127.0.0.1"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// In 'server' mode, defines the port number for the HTTP server.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("analyzerPort")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("8888")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// In 'static' mode, defines the filename for the generated report.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("reportFilename")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"report.html"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Defines the method for calculating module sizes. Can be 'stat', 'parsed', or 'gzip'.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// 'stat' describes the size before any code is parsed (size between modules).")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// 'parsed' describes the size of all parsed code (code that has been processed and parsed by loaders).")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// 'gzip' describes the gzip size of all parsed code (if this value is defined).")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("defaultSizes")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"parsed"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Specifies whether a module should be shown. You can use this option to hide unnecessary modules.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// You can pass a function that takes a module as a parameter and returns a boolean value.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("filterModules")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// If you want the content of the generated report file to be a custom data structure, you can pass a function.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// This function receives stats data as a parameter and should return a serialized JSON object or a Promise.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("generateStatsFile")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// If you want to customize the filename of the generated stats file, you can modify this option.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("statsFilename")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"stats.json"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Defines whether to generate a report when generating stats files.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("statsOptions")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("null")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Defines a logging function.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("logLevel")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"info"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n")])])]),t("ul",[t("li",[t("code",[e._v("analyzerMode")]),e._v(": Specifies the format and channel for report generation ('server', 'static', or 'disabled').")]),e._v(" "),t("li",[t("code",[e._v("analyzerHost")]),e._v(" and "),t("code",[e._v("analyzerPort")]),e._v(": Define the hostname and port for the HTTP server in 'server' mode.")]),e._v(" "),t("li",[t("code",[e._v("reportFilename")]),e._v(": Specifies the filename for the generated report in 'static' mode.")]),e._v(" "),t("li",[t("code",[e._v("defaultSizes")]),e._v(": Defines how module sizes should be calculated ('stat', 'parsed', or 'gzip').")]),e._v(" "),t("li",[t("code",[e._v("filterModules")]),e._v(": A function to determine whether a module should be displayed in the report.")]),e._v(" "),t("li",[t("code",[e._v("generateStatsFile")]),e._v(": Allows customization of the generated stats file content using a function.")]),e._v(" "),t("li",[t("code",[e._v("statsFilename")]),e._v(": Specifies the filename for the generated stats file.")]),e._v(" "),t("li",[t("code",[e._v("statsOptions")]),e._v(": Defines options for generating stats files.")]),e._v(" "),t("li",[t("code",[e._v("logLevel")]),e._v(": Defines the log level for the plugin.")])]),e._v(" "),t("h3",{attrs:{id:"▫️-reference-links"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#▫️-reference-links"}},[e._v("#")]),e._v(" ▫️ Reference Links:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://qiita.com/wataru86/items/7d0804a5651b1777691b",target:"_blank",rel:"noopener noreferrer"}},[e._v("webpack-bundle-analyzer から始めるフロントエンドのパフォーマンス改善入門"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://webpack.js.org/guides/getting-started/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Getting Started"),t("OutboundLink")],1),e._v(" -"),t("a",{attrs:{href:"https://zenn.dev/antez/articles/58307946cf4f3e",target:"_blank",rel:"noopener noreferrer"}},[e._v("やっぱり webpack がわからない(エピソード 1)"),t("OutboundLink")],1),e._v(" -"),t("a",{attrs:{href:"https://qiita.com/tanimoto-hikari/items/c718476294480330f929",target:"_blank",rel:"noopener noreferrer"}},[e._v("webpack はちゃんと理解しておいたほうがいい(導入時の Tips 付き"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/51.4b2c0433.js b/assets/js/51.4b2c0433.js new file mode 100644 index 00000000..72547696 --- /dev/null +++ b/assets/js/51.4b2c0433.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{343:function(t,s,n){"use strict";n.r(s);var r=n(14),a=Object(r.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"プラクティス"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#プラクティス"}},[this._v("#")]),this._v(" プラクティス")])])}),[],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/52.a937d41d.js b/assets/js/52.a937d41d.js new file mode 100644 index 00000000..984c0f0a --- /dev/null +++ b/assets/js/52.a937d41d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{344:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"react-and-typescript-shopping-cart-application"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#react-and-typescript-shopping-cart-application"}},[t._v("#")]),t._v(" React and TypeScript Shopping Cart Application")]),t._v(" "),s("h2",{attrs:{id:"🔷-cartprovider-component"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-cartprovider-component"}},[t._v("#")]),t._v(" 🔷 CartProvider Component")]),t._v(" "),s("blockquote",[s("p",[t._v("path: "),s("code",[t._v("src/Context/CartProvider.tsx")])])]),t._v(" "),s("h3",{attrs:{id:"_1-type-definitions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-type-definitions"}},[t._v("#")]),t._v(" 1. Type Definitions")]),t._v(" "),s("blockquote",[s("p",[t._v("CartItemType")])]),t._v(" "),s("p",[t._v("Defines the structure of a single shopping cart item.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CartItemType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n sku"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n qty"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("CartStateType")])]),t._v(" "),s("p",[t._v("Defines the type for the shopping cart state.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CartStateType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" cart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartItemType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"_2-action-types-definition"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-action-types-definition"}},[t._v("#")]),t._v(" 2. Action Types Definition")]),t._v(" "),s("blockquote",[s("p",[t._v("REDUCER_ACTION_TYPE")])]),t._v(" "),s("p",[t._v("An object defining various action types for updating the state.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ADD")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ADD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REMOVE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"REMOVE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("QUANTITY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"QUANTITY"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SUBMIT")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SUBMIT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("ReducerActionType")])]),t._v(" "),s("p",[t._v("Extracts the type of "),s("code",[t._v("REDUCER_ACTION_TYPE")]),t._v(" object.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ReducerActionType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("ReducerAction")])]),t._v(" "),s("p",[t._v("Defines the structure of the action object expected by the reducer function.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ReducerAction")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n payload"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartItemType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"_3-reducer-function"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-reducer-function"}},[t._v("#")]),t._v(" 3. Reducer Function")]),t._v(" "),s("blockquote",[s("p",[t._v("reducer")])]),t._v(" "),s("p",[t._v("A core function that handles changes in the shopping cart state.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("reducer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartStateType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" action"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReducerAction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...switch case statements")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"_4-custom-hook-usecartcontext"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_4-custom-hook-usecartcontext"}},[t._v("#")]),t._v(" 4. Custom Hook: useCartContext")]),t._v(" "),s("blockquote",[s("p",[t._v("useCartContext")])]),t._v(" "),s("p",[t._v("A custom React Hook providing a context related to the shopping cart.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("useCartContext")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("initialCartState"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartStateType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...hook implementation")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-react-context-and-provider"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-react-context-and-provider"}},[t._v("#")]),t._v(" 5. React Context and Provider")]),t._v(" "),s("blockquote",[s("p",[t._v("CartContext")])]),t._v(" "),s("p",[t._v("Creates a React Context to share the shopping cart state across components.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" CartContext "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createContext")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("UseCartContextType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n initalCartContextState\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("CartProvider")])]),t._v(" "),s("p",[t._v("A React component using "),s("code",[t._v("useCartContext")]),t._v(" Hook and "),s("code",[t._v("CartContext.Provider")]),t._v(" to provide the shopping cart context to the application.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" CartProvider "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" children "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ChildrenType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...provider implementation")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"usage-instructions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#usage-instructions"}},[t._v("#")]),t._v(" Usage Instructions")]),t._v(" "),s("p",[t._v("Use "),s("code",[t._v("useContext(CartContext)")]),t._v(" in components that need to access or modify the shopping cart state.\nExample: To add an item to the cart, use "),s("code",[t._v("dispatch({ type: 'ADD', payload: newItem })")]),t._v(".")]),t._v(" "),s("h3",{attrs:{id:"🔻-cartprovider-code-review"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔻-cartprovider-code-review"}},[t._v("#")]),t._v(" 🔻 CartProvider Code review")]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//path: src/context/CartProvider.tsx")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" ReactElement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" createContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useMemo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useReducer "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//用於描述單個購物車項目的結構。")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CartItemType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\nsku"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nname"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nprice"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nqty"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//1. 定義購物車相關的 TypeScript 類型")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//定義購物車狀態類型")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//它是一個包含單個屬性 cart 的對象,而 cart 是一個 CartItemType[] 類型的數組。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CartStateType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" cart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartItemType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" initialCartState"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartStateType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" cart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//2. 定義用於更新購物車狀態的 Action 類型")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//2.1 這是一個對象,其中定義了用於更新狀態的各種 action 的類型。如 ADD,REMOVE,QUANTITY,SUBMIT。 這些是你將在應用中用來描述發生的事件的常量。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ADD")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ADD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REMOVE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"REMOVE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("QUANTITY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"QUANTITY"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SUBMIT")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SUBMIT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//2.2 通過 typeof 獲取 REDUCER_ACTION_TYPE 的對象的類型,並將這個類型導出為 ReducerActionType。 這樣做的好處是你獲得了一個精確的類型,代表 REDUCER_ACTION_TYPE 的結構,而不僅僅是一個簡單的對象。這在 TypeScript 中有助於提高類型安全性和自動完成。")]),t._v("\n\n\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ReducerActionType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//2.3 定義了傳遞給 reducer 函數的 action 對象的結構。 包含 type(動作類型)和 payload(附加數據,可選)。")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//這是另一個 TypeScript 類型定義,用於描述 reducer 函數期望接收的 action 對象的結構。每個 action 都有一個 type 屬性,它是一個字符串,應對應於 REDUCER_ACTION_TYPE 中定義的一個值。payload 是一個可選屬性,包含了任何附加的數據(在這種情況下是 CartItemType)。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ReducerAction")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\ntype"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\npayload"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartItemType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//3. Reducer 函數")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//3.1 Reducer Function (reducer): 這是核心功能之一,用於處理購物車狀態的變化。它根據不同的動作(添加、移除、修改數量、提交)來更新狀態。這種方式能夠集中管理狀態的變更,是 Redux 架構中的一部分。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("reducer")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartStateType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" action"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReducerAction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("switch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ADD")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"action.payload missing in ADD action"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" sku"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//如果 sku 不等于给定的值,这个元素就会被保留在新数组 filteredCart 中,否则将被排除。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" filteredCart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartItemType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!==")]),t._v(" sku\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemExisted"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartItemType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" sku\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" qty"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" itemExisted "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" itemExisted"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("qty "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("filteredCart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" sku"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" price"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" qty "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REMOVE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"action.payload missing in REMOVE action"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" sku "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" filteredCart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartItemType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!==")]),t._v(" sku\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("filteredCart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//然后,它创建一个名为 updatedItem 的对象,该对象是购物车中现有商品的副本,但具有更新的 qty。最后,它创建一个名为 filteredCart 的新数组,其中包含所有其他商品,但不包括要更新的商品。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("QUANTITY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"action.payload missing in QUANTITY action"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" sku"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" qty "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemExists"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartItemType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" sku\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("itemExists"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"item must exist in order to update quantity"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 创建一个更新后的商品对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" updatedItem"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartItemType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("itemExists"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" qty "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 创建一个新的购物车数组,其中包括更新后的商品")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" filteredCart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartItemType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!==")]),t._v(" sku\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("filteredCart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" updatedItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// map 方法 : 创建一个新的购物车数组,其中包括更新后的商品")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// const filteredCart: CartItemType[] = state.cart.map((item) =>")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// item.sku === sku ? updatedItem : item")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// );")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 返回更新后的购物车状态")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// return { ...state, cart: filteredCart };")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SUBMIT")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Unidentified reducer action type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 4. 自定義 Hook:useCartContext")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("\\"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("\\"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("使用 useReducer 來管理購物車狀態。\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("用 useMemo 來緩存計算結果("),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),t._v(")。\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("計算購物車的總數量和總價格。\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("對購物車中的商品進行排序。\\"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//useCartContext 是一个自定义的 React Hook,它的作用是为你的应用程序提供一个与购物车相关的上下文。这个上下文包含了购物车的状态以及与购物车操作相关的函数,例如添加商品、删除商品、更新商品数量等。")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//自定義 Hook 如 useCartContext 被用來封裝和共享邏輯,相同的邏輯可以在應用中的多個地方使用,而不必重複相同的代碼。 useCartContext 接受一个参数 initialCartState,它是购物车的初始状态,包含一个空的购物车数组。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("useCartContext")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("initialCartState"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartStateType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useReducer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" initialCartState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//useMemo 主要用于缓存计算结果,并在依赖项(dependencies)发生变化时重新计算。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useMemo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" totalItems "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("previousValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" previousValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("qty"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" totalPrice "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Intl")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("NumberFormat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"en-US"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\nstyle"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"currency"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\ncurrency"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"USD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\nstate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("previousValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" previousValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("qty \\"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("price"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 这段代码的作用是对购物车中的商品进行排序,排序的规则是按照商品的 sku 属性的后四位数字进行升序排序。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" cart "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sort")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//分别提取了商品 a 和 b 的 sku 属性的后四位数字部分。这些数字会被转换成数值类型。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemB "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//表示根据提取出的数字进行升序排序,即如果 itemA 小于 itemB,返回负数;如果 itemA 等于 itemB,返回零;如果 itemA 大于 itemB,返回正数。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" itemA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" itemB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" totalPrice"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" totalItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cart "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//这里使用了 TypeScript 的 ReturnType 工具类型,它用于获取一个函数返回值的类型 。typeof useCartContext 表示获取 useCartContext 函数的类型,ReturnType 则是这个函数返回值的类型。这个类型被用作下面 CartContext 的类型参数。")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//返回值是什么 : useCartContext Hook 的返回值是一个对象,包含了与购物车相关的数据和函数。这通常包括购物车的状态(如商品列表、总价等)以及用于更新这些状态的方法(如 dispatch 方法)。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UseCartContextType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ReturnType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" useCartContext"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Context and Provider (CartContext 和 CartProvider): 這個部分創建了一個 React Context 來跨組件共享購物車的狀態和操作。CartProvider 組件則將這個上下文應用於應用程序的根組件。")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//这里定义了初始的上下文状态。initalCartContextState 符合 UseCartContextType 类型,包含了 dispatch 函数、REDUCER_ACTIONS 常量、以及一些购物车相关的状态如 totalItems、totalPrice 和 cart。dispatch 函数是一个空函数,表示在默认情况下不执行任何操作。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" initalCartContextState"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" UseCartContextType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\ntotalItems"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\ntotalPrice"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\ncart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//5. React Context 和 Provider")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 創建一個 React Context,允許跨組件共享購物車狀態。 用於在應用程序中提供購物車的狀態和操作。其他組件可以使用這個 Context 來訪問購物車的狀態。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//const SomeContext = createContext(defaultValue)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" CartContext "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createContext")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("UseCartContextType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\ninitalCartContextState\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ChildrenType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\nchildren"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" ReactElement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//使用 CartContext.Provider 來將 useCartContext 的返回值作為上下文值提供給其子組件。 CartProvider 組件:這是一個 React 組件,它使用 useCartContext Hook 並通過 CartContext.Provider 提供購物車上下文給應用程序。它包裝了應用程序的根組件,使購物車上下文對整個應用程序可用。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" CartProvider "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" children "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ChildrenType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CartContext.Provider")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useCartContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("initialCartState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("children"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//使用 Custom Hook 和 Context:")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//在需要訪問或修改購物車狀態的組件中,使用 useContext(CartContext) 來獲取購物車的狀態和 dispatch 函數。例如,如果需要向購物車中添加一個商品,可以使用 dispatch({ type: 'ADD', payload: newItem })。")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" CartContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("_ 使用說明\n在需要訪問或修改購物車狀態的組件中,使用 "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CartContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" 來獲取購物車的狀態和 dispatch 函數。\n例如,添加商品到購物車可以使用 "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'ADD'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" payload"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" newItem "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("。 _"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"🔷-productsprovider-component"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-productsprovider-component"}},[t._v("#")]),t._v(" 🔷 ProductsProvider Component")]),t._v(" "),s("blockquote",[s("p",[t._v("path: "),s("code",[t._v("src/Context/ProductsProvider.tsx")])])]),t._v(" "),s("h3",{attrs:{id:"_1-type-definitions-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-type-definitions-2"}},[t._v("#")]),t._v(" 1. Type Definitions")]),t._v(" "),s("blockquote",[s("p",[t._v("ProductType")])]),t._v(" "),s("p",[t._v("Defines the structure of a product.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ProductType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n sku"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"_2-initial-state"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-initial-state"}},[t._v("#")]),t._v(" 2. Initial State")]),t._v(" "),s("blockquote",[s("p",[t._v("initialState")])]),t._v(" "),s("p",[t._v("An array that holds the initial state of the product list.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" initialState"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ProductType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"_3-context-type-definition"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-context-type-definition"}},[t._v("#")]),t._v(" 3. Context Type Definition")]),t._v(" "),s("blockquote",[s("p",[t._v("UseProductsContextType")])]),t._v(" "),s("p",[t._v("Defines the shape of the context used for managing product information.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UseProductsContextType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n products"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ProductType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"_4-react-context-and-provider"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_4-react-context-and-provider"}},[t._v("#")]),t._v(" 4. React Context and Provider")]),t._v(" "),s("blockquote",[s("p",[t._v("ProductsContext")])]),t._v(" "),s("p",[t._v("Creates a React Context for sharing and managing product information globally.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ProductsContext "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createContext")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("UseProductsContextType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("initialContextState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("ProductsProvider")])]),t._v(" "),s("p",[t._v("A React component that provides the product context to the application using the "),s("code",[t._v("ProductsContext.Provider")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ProductsProvider "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" children "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ChildrenType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...provider implementation")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"_5-fetching-and-updating-product-data"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-fetching-and-updating-product-data"}},[t._v("#")]),t._v(" 5. Fetching and Updating Product Data")]),t._v(" "),s("blockquote",[s("p",[t._v("useEffect Hook")])]),t._v(" "),s("p",[t._v("Fetches product data from an external source and updates the state.")]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Function to fetch products and error handling")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"usage-instructions-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#usage-instructions-2"}},[t._v("#")]),t._v(" Usage Instructions")]),t._v(" "),s("p",[t._v("Use "),s("code",[t._v("useContext(ProductsContext)")]),t._v(" in components that need to access or modify the product information.\nExample: To access the list of products, use "),s("code",[t._v("const { products } = useContext(ProductsContext)")]),t._v(".")]),t._v(" "),s("p",[t._v("This Markdown note provides a structured overview of your React and TypeScript product management application, outlining type definitions, initial state, context and provider, along with instructions for fetching and updating product data.")]),t._v(" "),s("h3",{attrs:{id:"🔻-productsprovider-code-review"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔻-productsprovider-code-review"}},[t._v("#")]),t._v(" 🔻 ProductsProvider Code review")]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("////这里定义了一个名为 ProductType 的 TypeScript")]),t._v("\n类型,该类型描述了产品的结构,包括sku(库存单位)、name(名称)和price(价格)等属性。\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("\n\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" ReactElement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" createContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useEffect "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ProductType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n sku"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n price"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//const initState: ProductType[] = []")]),t._v("\n\n\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" initialState"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ProductType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//这里定义了一个名为 initState的常量,它是一个数组,包含了一些产品对象。这个数组通常用于初始化应用程序的状态,可以在React的上下文中使用。")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// export const initialState: ProductType[] = [")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// {")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// sku: "item0001",')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// name: "Widget",')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// price: 9.99,")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// },")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// {")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// sku: "item0002",')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// name: "Premium Widget",')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// price: 19.99,")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// },")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// {")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// sku: "item0003",')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// name: "Deluxe Widget",')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// price: 29.99,")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// },")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ];")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//它描述了一个用于管理产品信息的上下文的形状。具体来说,它包含一个属性(object) products,其值是一个 ProductType 类型的数组,用于存储产品信息。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UseProductsContextType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n products"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ProductType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" initialContextState"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" UseProductsContextType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n products"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//最后,它创建了一个名为 ProductsContext 的上下文对象,使用了之前定义的 UseProductsContextType 类型作为泛型参数,并将初始状態initialContextState传递给createContext函数。这个上下文对象可以在应用程序中使用,用于共享和管理产品信息的全局状态。")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ChildrenType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" children"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" ReactElement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ProductsContext "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createContext")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("UseProductsContextType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("initialContextState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ProductsProvider "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" children "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ChildrenType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("products"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setProducts"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ProductType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("initialState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" fetchProducts "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Promise")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ProductType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" res "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:3500/products"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ok"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Network response was not ok"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ProductType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 返回产品数据")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" Error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 使用类型断言将 error 标记为 Error 类型")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 抛出错误,使外部可以捕获")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetchProducts")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("products"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setProducts")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("products"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// eslint-disable-next-line @typescript-eslint/no-unused-vars")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在此处可以进一步处理错误,例如显示错误消息")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ProductsContext.Provider")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" products "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("children"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" ProductsContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("code",[t._v("ProductType[]")]),t._v("是一个表示产品数组的类型定义。而 "),s("code",[t._v("UseProductContextType")]),t._v("是另一个类型定义,它定义了一个对象,这个对象包含了一个名为"),s("code",[t._v("products")]),t._v("的字段,其类型为 "),s("code",[t._v("ProductType[]")]),t._v("。")]),t._v(" "),s("h2",{attrs:{id:"🔷-hooks-useproducts-hook"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-hooks-useproducts-hook"}},[t._v("#")]),t._v(" 🔷 Hooks/useProducts Hook")]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useContext "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" ProductsContext "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../context/ProductsProvider"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" UseProductsContextType "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../context/ProductsProvider"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" useProducts "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" UseProductsContextType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ProductsContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" useProducts"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"🔷-hooks-usecart-hook"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-hooks-usecart-hook"}},[t._v("#")]),t._v(" 🔷 Hooks/useCart Hook")]),t._v(" "),s("blockquote",[s("p",[t._v("它的作用是简化了在组件中使用购物车上下文(CartContext)的过程。这个 Hook 返回了 CartContext 的值,使得在组件中访问购物车数据和操作更加直观和便捷。这种模式非常适用于将上下文的逻辑封装起来,以便在多个组件中重用。")])]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useContext "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" CartContext "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../context/CartProvider"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" UseCartContextType "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../context/CartProvider"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//通过指定返回类型为 UseCartContextType,这个 Hook 的使用者可以得到关于返回值的类型提示和校验。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" useCart "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" UseCartContextType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useContext")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CartContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" useCart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("hr"),t._v(" "),s("h2",{attrs:{id:"🔷-components-productlist"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-components-productlist"}},[t._v("#")]),t._v(" 🔷 components/ProductList")]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" useCart "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../hooks/useCart"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" useProdudcts "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../hooks/useProducts"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Product "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./Product"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("ProductList")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cart "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useCart")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" products "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useProdudcts")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//使用 some 方法檢查:具體地,inCart 的值是通過檢查購物車(cart)中是否存在具有相同 sku 值的產品來確定的。這通過使用 Array.prototype.some 方法實現,這個方法會測試陣列中是否至少有一個元素滿足提供的函數。如果滿足條件(即購物車中已有相同 sku 的產品),則 inCart 為 true;否則,為 false。")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" pageContent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" ReactElement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("p")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Loading...")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("products"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?.")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n pageContent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" products"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" inCart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Product")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("key")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("product")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("REDUCER_ACTIONS")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("inCart")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("inCart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" content "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("main")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("main main--products"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("pageContent"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" content"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" ProductList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"🔷-components-product"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#🔷-components-product"}},[t._v("#")]),t._v(" 🔷 components/Product")]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 引入所需的依賴和類型")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" ProductType "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../context/ProductsProvider"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" ReducerActionType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ReducerAction "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../context/CartProvider"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" ReactElement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" memo "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 定義 PropsType,用於描述 Product 組件的屬性")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PropsType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n product"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ProductType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 產品信息")]),t._v("\n dispatch"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Dispatch"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ReducerAction"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 購物車操作的 dispatch 函數")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReducerActionType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 購物車操作的行為類型")]),t._v("\n inCart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 產品是否已在購物車中的標記")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Product 組件定義")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Product "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n inCart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" PropsType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 產品圖片的路徑")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" img"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("URL")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("../images/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(".jpg")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("meta"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("href"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("img"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 添加產品到購物車的事件處理函數")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("onAddToCart")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ADD")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" payload"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" qty"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 如果產品已在購物車中,顯示標記")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemInCart "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" inCart "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('" → Item in Cart: ✔️"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 產品的展示內容")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" content "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("article")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("h3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("img")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("img"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("alt")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("product__img"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("p")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Intl")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("NumberFormat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"en-US"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n style"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"currency"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n currency"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"USD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("price"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("itemInCart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("onAddToCart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Add to Cart")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" content"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 比較函數,用於優化性能,避免不必要的重新渲染")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("areProductsEqual")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" product"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" prevProduct"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" inCart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" prevInCart "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" PropsType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" product"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" nextProduct"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" inCart"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" nextInCart "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" PropsType\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n Object"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("keys")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("prevProduct"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("every")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n prevProduct"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" ProductType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v("\n nextProduct"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("keyof")]),t._v(" ProductType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" prevInCart "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" nextInCart\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 使用 memo 包裝 Product 組件,優化渲染性能")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" MemoizedProduct "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("memo")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" Product"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Product"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" areProductsEqual"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" MemoizedProduct"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"トラブルシューティング"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#トラブルシューティング"}},[t._v("#")]),t._v(" トラブルシューティング")]),t._v(" "),s("h3",{attrs:{id:"▫️-usecartcontext-hooks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-usecartcontext-hooks"}},[t._v("#")]),t._v(" ▫️ useCartContext hooks")]),t._v(" "),s("blockquote",[s("p",[t._v("這段代碼定义了一个名为 "),s("code",[t._v("useCartContext")]),t._v(" 的自定义 React Hook。这个 Hook 使用了 React 的几个内置功能,如 "),s("code",[t._v("useReducer")]),t._v(" 和 "),s("code",[t._v("useMemo")]),t._v(",来管理和优化购物车应用的状态。下面是对每个部分的详细解释:")])]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("useCartContext")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("initialCartState"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" CartStateType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useReducer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" initialCartState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//useMemo 主要用于缓存计算结果,并在依赖项(dependencies)发生变化时重新计算。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useMemo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" totalItems "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("previousValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" previousValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("qty"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" totalPrice "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Intl")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("NumberFormat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"en-US"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n style"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"currency"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n currency"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"USD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("previousValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" previousValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("qty "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("price"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 这段代码的作用是对购物车中的商品进行排序,排序的规则是按照商品的 sku 属性的后四位数字进行升序排序。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" cart "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sort")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//分别提取了商品 a 和 b 的 sku 属性的后四位数字部分。这些数字会被转换成数值类型。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemB "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//表示根据提取出的数字进行升序排序,即如果 itemA 小于 itemB,返回负数;如果 itemA 等于 itemB,返回零;如果 itemA 大于 itemB,返回正数。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" itemA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" itemB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" totalPrice"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" totalItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cart "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("useReducer")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useReducer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" initialCartState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ul",[s("li",[t._v("这里使用了 "),s("code",[t._v("useReducer")]),t._v(" Hook 来管理购物车的状态。"),s("code",[t._v("useReducer")]),t._v(" 是一个替代 "),s("code",[t._v("useState")]),t._v(" 的 Hook,适用于复杂的状态逻辑,可以让你根据 action 更新状态。")]),t._v(" "),s("li",[s("code",[t._v("reducer")]),t._v(" 是一个函数,定义了状态如何响应不同的 action 类型。")]),t._v(" "),s("li",[s("code",[t._v("initialCartState")]),t._v(" 是购物车的初始状态。")]),t._v(" "),s("li",[s("code",[t._v("state")]),t._v(" 代表当前的状态,"),s("code",[t._v("dispatch")]),t._v(" 是一个函数,用来发送 action 到 reducer。")])]),t._v(" "),s("blockquote",[s("p",[t._v("useMemo")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useMemo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ul",[s("li",[s("code",[t._v("useMemo")]),t._v(" 用于缓存计算的结果。这里它被用来缓存 "),s("code",[t._v("REDUCER_ACTION_TYPE")]),t._v(" 对象。")]),t._v(" "),s("li",[t._v("依赖项数组("),s("code",[t._v("[]")]),t._v(")为空,这意味着 "),s("code",[t._v("REDUCER_ACTIONS")]),t._v(" 只会在组件首次渲染时计算一次。")])]),t._v(" "),s("blockquote",[s("p",[t._v("计算总数和总价")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" totalItems "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("previousValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" previousValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("qty"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" totalPrice "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Intl")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("NumberFormat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"en-US"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n style"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"currency"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n currency"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"USD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("format")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("previousValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" previousValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("qty "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" cartItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("price"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ul",[s("li",[t._v("这两个变量使用 "),s("code",[t._v("reduce")]),t._v(" 方法来计算购物车中商品的总数量 ("),s("code",[t._v("totalItems")]),t._v(") 和总价 ("),s("code",[t._v("totalPrice")]),t._v(")。")])]),t._v(" "),s("blockquote",[s("p",[t._v("对购物车商品进行排序")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" cart "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("cart"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sort")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" itemB "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sku"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" itemA "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" itemB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ul",[s("li",[t._v("这段代码对购物车中的商品根据 "),s("code",[t._v("sku")]),t._v(" 的后四位数字进行升序排序。")])]),t._v(" "),s("blockquote",[s("p",[t._v("返回值")])]),t._v(" "),s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REDUCER_ACTIONS")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" totalPrice"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" totalItems"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cart "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ul",[s("li",[s("code",[t._v("useCartContext")]),t._v(" 返回一个包含 "),s("code",[t._v("dispatch")]),t._v(" 函数、动作类型 ("),s("code",[t._v("REDUCER_ACTIONS")]),t._v(")、购物车总价 ("),s("code",[t._v("totalPrice")]),t._v(")、总数量 ("),s("code",[t._v("totalItems")]),t._v(") 和排序后的购物车商品列表 ("),s("code",[t._v("cart")]),t._v(") 的对象。")]),t._v(" "),s("li",[t._v("这个 Hook 可以被用于组件中,以便于访问和操作购物车的状态。")])]),t._v(" "),s("p",[t._v("总的来说,"),s("code",[t._v("useCartContext")]),t._v(" Hook 为购物车应用提供了一个集中的状态管理方案,使得状态的读取和更新更加方便和高效。")]),t._v(" "),s("h3",{attrs:{id:"▫️-usecartcontexttype"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#▫️-usecartcontexttype"}},[t._v("#")]),t._v(" ▫️ UseCartContextType")]),t._v(" "),s("blockquote",[s("p",[t._v("在 TypeScript 中定义 "),s("code",[t._v("UseCartContextType")]),t._v(" 类型作为 "),s("code",[t._v("ReturnType")]),t._v(" 的原因是为了确保类型安全和代码的清晰性。这里解释一下具体原因和用途:")])]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UseCartContextType")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ReturnType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" useCartContext"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("为什么要确定返回值的类型")])]),t._v(" "),s("ol",[s("li",[s("strong",[t._v("类型安全")]),t._v(":")])]),t._v(" "),s("ul",[s("li",[t._v("TypeScript 强类型系统的一个主要优点是它提供了类型安全。通过明确指定函数返回值的类型,你可以在编译时捕捉潜在的错误,而不是在运行时。")]),t._v(" "),s("li",[t._v("在这个案例中,"),s("code",[t._v("useCartContext")]),t._v(" 是一个自定义 Hook,它可能返回一个复杂的对象,包含多个属性和方法。使用 "),s("code",[t._v("ReturnType")]),t._v(" 可以确保你完全理解并正确处理这个 Hook 返回的数据结构。")])]),t._v(" "),s("ol",{attrs:{start:"2"}},[s("li",[s("strong",[t._v("自动推断")]),t._v(":")])]),t._v(" "),s("ul",[s("li",[s("code",[t._v("ReturnType")]),t._v(" 自动推断 "),s("code",[t._v("useCartContext")]),t._v(" Hook 的返回值类型。这意味着如果 "),s("code",[t._v("useCartContext")]),t._v(" 的实现更改了返回值的结构,"),s("code",[t._v("UseCartContextType")]),t._v(" 也会相应地更新,无需手动更改。")])]),t._v(" "),s("blockquote",[s("p",[t._v("返回值是什么")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("返回值")]),t._v(":")]),t._v(" "),s("li",[s("code",[t._v("useCartContext")]),t._v(" Hook 的返回值是一个对象,包含了与购物车相关的数据和函数。这通常包括购物车的状态(如商品列表、总价等)以及用于更新这些状态的方法(如 dispatch 方法)。")])]),t._v(" "),s("blockquote",[s("p",[t._v("在什么地方用")])]),t._v(" "),s("ol",[s("li",[s("strong",[t._v("在 Context 提供者中")]),t._v(":")])]),t._v(" "),s("ul",[s("li",[t._v("当你创建一个 Context 并且想要在整个应用中共享 "),s("code",[t._v("useCartContext")]),t._v(" 提供的数据和函数时,可以使用这个类型。例如,在 "),s("code",[t._v("CartProvider")]),t._v(" 组件中,你可能会将 "),s("code",[t._v("useCartContext")]),t._v(" 的返回值作为 Context 的值。")])]),t._v(" "),s("ol",{attrs:{start:"2"}},[s("li",[s("strong",[t._v("在消费者组件中")]),t._v(":")])]),t._v(" "),s("ul",[s("li",[t._v("组件可以通过 "),s("code",[t._v("useContext(CartContext)")]),t._v(" 使用这个类型来访问购物车的数据和操作函数。这样可以确保组件正确地使用了 Context 提供的数据,同时也享受到了 TypeScript 的类型检查和自动完成的好处。")])]),t._v(" "),s("p",[t._v("总之,"),s("code",[t._v("UseCartContextType")]),t._v(" 的定义和使用使得你的 React 组件可以高效且安全地与购物车相关的状态和操作进行交互,同时保持代码的清晰和可维护性。")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/53.7b06419b.js b/assets/js/53.7b06419b.js new file mode 100644 index 00000000..38e5a1d2 --- /dev/null +++ b/assets/js/53.7b06419b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{345:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"todolist-app"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#todolist-app"}},[t._v("#")]),t._v(" TodoList App")]),t._v(" "),s("h2",{attrs:{id:"プロジェクトの構成"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#プロジェクトの構成"}},[t._v("#")]),t._v(" プロジェクトの構成")]),t._v(" "),s("ul",[s("li",[s("p",[s("code",[t._v("TodoList")])]),t._v(" "),s("ul",[s("li",[t._v("Manages the overall state of the todo list.")]),t._v(" "),s("li",[t._v("Provides the "),s("code",[t._v("addTodo")]),t._v(" function to add new todos.")]),t._v(" "),s("li",[t._v("Logs the current state of the todo list.")]),t._v(" "),s("li",[s("code",[t._v("index")]),t._v(":"),s("code",[t._v("TdList")]),t._v(" & "),s("code",[t._v("TdInput")])])])]),t._v(" "),s("li",[s("p",[s("code",[t._v("Input(TdInput)")]),t._v(": Responsible for the input field")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("index:")]),t._v(" Main view with the input field")]),t._v(" "),s("li",[t._v("Handles user input for adding new todos.")]),t._v(" "),s("li",[t._v("Validates input and prevents the addition of duplicate todos.")]),t._v(" "),s("li",[t._v("Calls the parent's "),s("code",[t._v("TodoList")]),t._v(" addTodo function to update the todo list.")])])]),t._v(" "),s("li",[s("p",[s("code",[t._v("List(TdList)")]),t._v(": Responsible for displaying the list of todos")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("index(TdList)")]),t._v(":Manages and displays all items in the list (including all TdItems)")]),t._v(" "),s("li",[s("code",[t._v("Item(TdItem)")]),t._v(": Responsible for displaying a single item")])])])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" TdInput "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./Input"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" TdList "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./List"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("TodoList")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("todo-list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TdInput")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TdList")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" TodoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"tdinput-component"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tdinput-component"}},[t._v("#")]),t._v(" TdInput Component")]),t._v(" "),s("ol",[s("li",[t._v("Input Handling:")])]),t._v(" "),s("ul",[s("li",[t._v("Utilizes the "),s("code",[t._v("useRef")]),t._v(" hook to create a reference ("),s("code",[t._v("inputRef")]),t._v(") to the input element. This reference is used to access the input element's value imperatively.")]),t._v(" "),s("li",[t._v("Defines a function ("),s("code",[t._v("handleAddTodoItem")]),t._v(") to handle the addition of new todo items based on user input.")])]),t._v(" "),s("ol",{attrs:{start:"2"}},[s("li",[t._v("Validation and Interaction:")])]),t._v(" "),s("ul",[s("li",[t._v("Ensures that the input value is trimmed and not empty. Displays an alert if a todo with the same content already exists.")]),t._v(" "),s("li",[t._v("Calls the "),s("code",[t._v("addTodo")]),t._v(" function passed as a prop from the parent component (TodoList) to add a new todo item.")])]),t._v(" "),s("ol",{attrs:{start:"3"}},[s("li",[t._v("User Interface:")])]),t._v(" "),s("ul",[s("li",[t._v('Renders an input field and a button within a div with the class "todo-input."')]),t._v(" "),s("li",[t._v("The button triggers the "),s("code",[t._v("handleAddTodoItem")]),t._v(" function when clicked.")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("TdInput")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("todo-input"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("form")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Enter your todo here"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("submit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Add")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" TdInput"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"tdlist-component"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tdlist-component"}},[t._v("#")]),t._v(" TdList Component")]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" TdItem "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./Item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("TdList")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("td-list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TdItem")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" TdList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"tditem-component"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tditem-component"}},[t._v("#")]),t._v(" TdItem Component")]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Each item")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("TdItem")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("todo-item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ul")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("li")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("checkbox"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("span")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("Placeholder text here")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" TdItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ul",[s("li",[s("p",[s("strong",[t._v("Props:")]),t._v(" Every functional component ("),s("code",[t._v("FC")]),t._v(") has a collection of external properties ("),s("code",[t._v("props")]),t._v(") that it can receive. However, in the provided "),s("code",[t._v("TdItem")]),t._v(" component, no props are explicitly defined or used.")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("Return Value:")]),t._v(" Every functional component returns a "),s("code",[t._v("ReactElement")]),t._v(", which is an object containing properties such as "),s("code",[t._v("type")]),t._v(", "),s("code",[t._v("props")]),t._v(", "),s("code",[t._v("ref")]),t._v(", "),s("code",[t._v("key")]),t._v(", etc.")])])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FC")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ReactElement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useRef "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// IProps is a generic parameter, indicating the expected type of properties (props) this component should receive.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IProps")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The component (TdInput) is declared with the FC (FunctionComponent) type, as it uses ref, and for that, generics are needed.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("TdInput")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FC")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IProps")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v(" = (")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("): ReactElement => ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v(";\n")])])])]),s("blockquote",[s("p",[t._v("Takeaways:")])]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Prop")]),t._v(": In functional components, external properties are received through the props collection. 每一個函數組件都有一個外部傳入的 props 屬性集合。")]),t._v(" "),s("li",[t._v("Every functional component has a return value, which is a ReactElement object, representing JSX. 每一個函數組件是有一個返回值的,返回的是 ReactElement 對象,即 jsx")]),t._v(" "),s("li",[s("strong",[t._v("ReactElement Object")]),t._v(": A comprehensive object containing properties like type, props, ref, key, etc.")])]),t._v(" "),s("blockquote",[s("p",[t._v("Explanation:")])]),t._v(" "),s("ul",[s("li",[t._v("Props, short for properties, are external attributes passed to functional components.")]),t._v(" "),s("li",[t._v("Functional components, unlike class components, inherently produce ReactElement objects as their output.")]),t._v(" "),s("li",[t._v("A ReactElement is an object encapsulating information such as the component type, its properties (props),\nreferences (ref), keys, and more, making it a fundamental unit in React's rendering process.")])]),t._v(" "),s("p",[t._v("In summary, functional components receive external attributes through props and, in turn, generate ReactElement objects, forming the basis of JSX rendering in React applications.")]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FC")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ReactElement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useRef "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// IProps is a generic parameter, indicating the expected type of properties (props) this component should receive.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IProps")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The component (TdInput) is declared with the FC (FunctionComponent) type, as it uses ref, and for that, generics are needed.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("TdInput")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FC")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IProps")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v(" = (")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("): ReactElement => ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v(";\n")])])])]),s("blockquote",[s("p",[s("strong",[t._v("Explanation")]),t._v(": The TdInput component is a functional component that is expected to receive props conforming to the IProps interface. It uses the FC (FunctionComponent) type, a generic type provided by React for defining functional components. The function returns a React element (ReactElement), indicating that this component will render JSX. The empty object ({}) in the parameter list represents the expected props, and it can be adjusted based on the actual props needed by the component. This component is defined to handle input functionality within the TodoList app.")])]),t._v(" "),s("h3",{attrs:{id:"定義-inputref"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#定義-inputref"}},[t._v("#")]),t._v(" 定義 inputRef")]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" inputRef "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" useRef "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" HTMLInputElement "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"定義-itodo-接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#定義-itodo-接口"}},[t._v("#")]),t._v(" 定義 Itodo 接口")]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Itodo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" number"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("description")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" string"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("status")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" boolean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"定義-iprops-src-components-todolist-input-index-tsx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#定義-iprops-src-components-todolist-input-index-tsx"}},[t._v("#")]),t._v(" 定義 Iprops "),s("code",[t._v("src/components/TodoList/Input/index.tsx")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IProps")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//為什麼沒有返回值? 因為這裡是一個函數組件,不是一個函數。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("addTodo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 这里 addTodo 是一个属性,其类型为一个函数,这个函数接受一个 ITodo 类型的参数 todo,并且没有返回值(void)。在使用这个组件时,你需要从父组件传递一个满足这个函数签名的函数给 addTodo 属性。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("blockquote",[s("p",[t._v("思考")]),t._v(" "),s("ul",[s("li",[t._v("onClick 中應該放什麼?")]),t._v(" "),s("li",[t._v("useRef 的使用方式: 使用了 useRef"),s("HTMLInputElement",[t._v("(null),但您在代碼中沒有使用這個 inputRef。如果您希望在按鈕點擊時獲取輸入的值,您需要使用 inputRef.current.value。")])],1)])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FC")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" ITodo "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../../types"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IProps")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("addTodo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("TdInput")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FC")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IProps")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v(" = (")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" addTodo "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("): ReactElement => ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//inputRef 是一個對象,裡面有一個current屬性,current屬性指向input元素,用於獲取input元素的值。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" inputRef "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" useRef"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HTMLInputElement")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("(null);\n\n return (\n ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 这里,inputRef是一个useRef具有current属性的对象。该current属性最初设置为,但在安装组件时null将更新为指向DOM 元素。input之后,您可以使用inputRef.current来引用实际的inputDOM 元素。 */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("todo-input"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("please input to do list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("??")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("??")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("add")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n );\n};\n\nexport default TdInput;\n\n")])])])]),s("blockquote",[s("p",[t._v("接下來,應該是對 input 取值, 那麼就需要一個 "),s("code",[t._v("handleAddTodoItem")]),t._v("的方法, 並且在 "),s("code",[t._v("onClick")]),t._v(" 中調用它。")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// IProps interface representing the properties (props) expected by the component.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IProps")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// addTodo is a function that takes a todo (of type ITodo) and returns void.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("addTodo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// todoList is an array of ITodo objects, representing the list of to-do items.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todoList")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" handleAddTodoItem "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//inputRef.current用于获取输入元素(用户输入的文本)的当前值。这允许您直接访问输入字段的值,而无需使用 React 状态。当您需要在通常的 React 状态和事件处理机制之外强制访问输入字段的当前值时,这种模式很常见。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("val")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" string "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("trim")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Check if the trimmed value is not empty")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("val"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Check if a todo with the same content already exists in the todoList")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" isExist "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("todo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" todo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("content "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" val"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// If a todo with the same content exists, show an alert and return from the function")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("isExist"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"To-do list item already exists"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//執行父類的addTodo方法, 把子類的val 傳給父類。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Date")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getTime")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Generate a unique id (using timestamp)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("content")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" val"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("completed")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Clear the input field by setting its value to an empty string")]),t._v("\n inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("todo-input"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 这里,inputRef是一个useRef具有current属性的对象。该current属性最初设置为,但在安装组件时null将更新为指向DOM 元素。input之后,您可以使用inputRef.current来引用实际的inputDOM 元素。 */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("please input to do list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleAddTodoItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("add")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\n")])])]),s("h2",{attrs:{id:"todolist-父組件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#todolist-父組件"}},[t._v("#")]),t._v(" TodoList 父組件")]),t._v(" "),s("ol",[s("li",[t._v("State Management:")])]),t._v(" "),s("ul",[s("li",[t._v("Manages the state of the todo list using the "),s("code",[t._v("useState")]),t._v(" hook. The state is initialized as an empty array.")]),t._v(" "),s("li",[t._v("Logs the current state of todoList using the "),s("code",[t._v("useEffect")]),t._v(" hook whenever "),s("code",[t._v("todoList")]),t._v(" changes.")])]),t._v(" "),s("ol",{attrs:{start:"2"}},[s("li",[t._v("addTodo Function:")])]),t._v(" "),s("ul",[s("li",[t._v("Defines an addTodo function using "),s("code",[t._v("useCallback")]),t._v(". This function takes a todo item as a parameter and updates the todoList state by appending the new todo.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("useCallback")]),t._v(" hook ensures that the addTodo function maintains a stable reference across renders, optimizing performance by preventing unnecessary re-renders.")])]),t._v(" "),s("ol",{attrs:{start:"3"}},[s("li",[t._v("Rendering Child Components:")])]),t._v(" "),s("ul",[s("li",[t._v("Renders two child components, "),s("code",[t._v("TdInput")]),t._v(" and "),s("code",[t._v("TdList")]),t._v(", within a "),s("code",[t._v("div")]),t._v(' with the class "todo-list."')]),t._v(" "),s("li",[t._v("Passes the "),s("code",[t._v("addTodo")]),t._v(" function and the current "),s("code",[t._v("todoList")]),t._v(" state as props to "),s("code",[t._v("TdInput")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 定義一個狀態,用 useState,為了讓子組件能夠獲取到父組件的狀態,所以要用 useState")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setTodoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" useState"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ITodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//當 useEffect 被觸發時,它內部的回調函數就會執行。即當新的代辦事項被添加到 todoList 時,useEffect 的回調函數就會執行。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//addTodo 函數的目的: addTodo 函數的目的是將代表待辦事項的物件添加到 todoList 狀態中。這是透過使用 setTodoList 更新 todoList 狀態實現的。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" addTodo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useCallback")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("todo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 在實際應用中,你應該使用 setTodoList 更新 todoList 狀態")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// setTodoList((prevTodoList) => [...prevTodoList, todo]);")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("setTodoList")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("todoList")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" todo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//將 addTodo 作為 prop 傳遞給 TdInput 子組件: 在 return 語句中,addTodo 函數作為 prop 傳遞給了 TdInput 子組件,這樣子組件就能夠使用父組件中的這個函數。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("todo-list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* 將 addTodo 函數作為 prop 傳遞給子組件 TdInput */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TdInput")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("addTodo")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("addTodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("todoList")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TdList")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[s("code",[t._v("useCallback")]),t._v(" 是 React 中的一個 Hook,用於優化函數引用,特別是在子組件的 props 中使用。在這個特定的代碼中,"),s("code",[t._v("useCallback")]),t._v(" 用於優化 "),s("code",[t._v("addTodo")]),t._v(" 函數的引用,以防止不必要的重新渲染。")])]),t._v(" "),s("ol",[s("li",[s("code",[t._v("useCallback")]),t._v(" 用途:")])]),t._v(" "),s("p",[t._v("在 React 中,每次父組件渲染時,內聯函數都會被重新創建。為了避免不必要的函數重新創建,特別是在子組件的 props 中使用函數時,可以使用 "),s("code",[t._v("useCallback")]),t._v(" 進行優化。在這裡,"),s("code",[t._v("useCallback")]),t._v(" 用於優化 "),s("code",[t._v("addTodo")]),t._v(" 函數的引用,以防止不必要的重新渲染。")]),t._v(" "),s("ol",{attrs:{start:"2"}},[s("li",[s("code",[t._v("useCallback")]),t._v(" 的作用:")])]),t._v(" "),s("ul",[s("li",[s("p",[s("strong",[t._v("避免不必要的函數重新創建:")]),t._v(" 使用 "),s("code",[t._v("useCallback")]),t._v(" 可以緩存函數的實例,只有當 "),s("code",[t._v("useCallback")]),t._v(" 的依賴項發生變化時才會創建一個新的函數實例。這減少了子組件的不必要重新渲染,提高了應用程序性能。")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("子組件性能優化:")]),t._v(" 如果子組件使用了 "),s("code",[t._v("React.memo")]),t._v(" 進行性能優化(防止不必要的重新渲染),"),s("code",[t._v("useCallback")]),t._v(" 的使用能夠確保即使父組件重新渲染,子組件不會因 "),s("code",[t._v("addTodo")]),t._v(" 函數的實際邏輯未改變而重新渲染。")])])]),t._v(" "),s("blockquote",[s("p",[s("code",[t._v("useEffect")]),t._v(": 簡單來說,當使用者在 "),s("code",[t._v("TdInput")]),t._v(' 組件中點擊 "add" 按鈕時,'),s("code",[t._v("handleAddTodoItem")]),t._v(" 函數被觸發,並且它內部調用了由父組件 "),s("code",[t._v("TodoList")]),t._v(" 提供的 "),s("code",[t._v("addTodo")]),t._v(" 函數。這樣做的目的是將新的待辦事項添加到父組件的 "),s("code",[t._v("todoList")]),t._v(" 狀態中,從而觸發 "),s("code",[t._v("useEffect")]),t._v(" 並在控制台中輸出新的 "),s("code",[t._v("todoList")]),t._v("。")])]),t._v(" "),s("h3",{attrs:{id:"使用-usereducer-替代-usestate"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#使用-usereducer-替代-usestate"}},[t._v("#")]),t._v(" 使用 useReducer 替代 useState")]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//path: todo-list-app/src/components/TodoList/reducer.ts")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" IAction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" IState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ITodo "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./types"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//todoReducer 是一個純函數,用於處理有關待辦事項應用程序狀態的變化。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("todoReducer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("state")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("action")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IAction")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IState "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" type"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//返回一個IState,todoList: []的集合")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//action包含兩個值:一個是payload, 另一個是type。 payload 其實就是我們要傳遞的參數,也就是todo的內容,就是const addTodo = useCallback((todo: ITodo) => 裡面的todo,另一個是type則是我們要做的事情")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("switch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ADD_TODO")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todoList")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" ITodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" todoReducer "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//path: src/components/TodoList/index.tsx")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FC")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ReactElement"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n useCallback"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n useEffect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n useReducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" TdInput "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./Input"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" TdList "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./List"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" ITodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" IState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ACTION_TYPE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./types"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" todoReducer "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./reducer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("initialState")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IState "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todoList")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("TodoList")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FC")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ReactElement")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dispatch"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useReducer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("todoReducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" initialState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//當 useEffect 被觸發時,它內部的回調函數就會執行。,即當新的代辦事項被添加到 todoList 時,useEffect 的回調函數就會執行。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useEffect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//可理解為redux裡的action creator, 用來創建action,是純粹的函數, 它們返回一個action對象,而這個對象然後被傳遞給 dispatch()方法。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" addTodo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useCallback")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// setTodoList((todoList) => [...todoList, todo]);")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ADD_TODO")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("payload")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" todo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("todo-list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TdInput")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("addTodo")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("addTodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("todoList")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TdList")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" TodoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"分析-1-親コンポーネントが子コンポーネントに提供する-addtodo-関数を理解するには"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#分析-1-親コンポーネントが子コンポーネントに提供する-addtodo-関数を理解するには"}},[t._v("#")]),t._v(" 分析 1:親コンポーネントが子コンポーネントに提供する addTodo 関数を理解するには?")]),t._v(" "),s("p",[t._v("在提供給 "),s("code",[t._v("TdInput")]),t._v(" 子組件的 "),s("code",[t._v("addTodo")]),t._v(" 函數和 "),s("code",[t._v("handleAddTodoItem")]),t._v(" 函數之間有一個簡單的對應關係:")]),t._v(" "),s("ol",[s("li",[s("strong",[s("code",[t._v("addTodo")]),t._v(" 函數:")]),t._v(" "),s("ul",[s("li",[t._v("定義在父組件 "),s("code",[t._v("TodoList")]),t._v(" 中。")]),t._v(" "),s("li",[t._v("使用 "),s("code",[t._v("useCallback")]),t._v(" 優化函數引用。")]),t._v(" "),s("li",[t._v("負責將新的待辦事項("),s("code",[t._v("todo")]),t._v(" 物件)添加到 "),s("code",[t._v("todoList")]),t._v(" 狀態中。")])])])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" addTodo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useCallback")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("dispatch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ADD_TODO")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("payload")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" todo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[s("strong",[s("code",[t._v("handleAddTodoItem")]),t._v(" 函數:")]),t._v(" "),s("ul",[s("li",[t._v("定義在子組件 "),s("code",[t._v("TdInput")]),t._v(" 中。")]),t._v(" "),s("li",[t._v("負責處理使用者輸入的待辦事項,並通過呼叫父組件提供的 "),s("code",[t._v("addTodo")]),t._v(" 函數將新的待辦事項添加到 "),s("code",[t._v("todoList")]),t._v(" 中。")])])])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" handleAddTodoItem "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...(省略其他處理邏輯)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addTodo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Date")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getTime")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("content")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" val"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("completed")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...(省略其他處理邏輯)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("img",{attrs:{src:"/docs/guide/images/react/todolist.png",alt:"todolist"}})]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[s("code",[t._v("TodoList")]),t._v(" 組件:")])]),t._v(" "),s("ul",[s("li",[s("code",[t._v("TodoList")]),t._v(" 組件是一個 React 函數組件,負責渲染待辦事項應用的主要 UI。")]),t._v(" "),s("li",[t._v("使用 "),s("code",[t._v("useReducer")]),t._v(" Hook 管理狀態,並將狀態和派發函數 "),s("code",[t._v("dispatch")]),t._v(" 作為 "),s("code",[t._v("todoReducer")]),t._v(" 的參數。")])])]),t._v(" "),s("li",[s("p",[s("strong",[s("code",[t._v("TdInput")]),t._v(" 組件:")])]),t._v(" "),s("ul",[s("li",[s("code",[t._v("TdInput")]),t._v(" 組件是 "),s("code",[t._v("TodoList")]),t._v(" 組件的子組件,負責處理待辦事項的輸入部分。")]),t._v(" "),s("li",[t._v("接收 "),s("code",[t._v("addTodo")]),t._v(" 函數作為 prop,用來添加新的待辦事項。")]),t._v(" "),s("li",[t._v("使用 "),s("code",[t._v("inputRef")]),t._v(' 來獲取用戶輸入的值,並在點擊 "add" 按鈕時調用 '),s("code",[t._v("handleAddTodoItem")]),t._v(" 函數。")])])]),t._v(" "),s("li",[s("p",[s("strong",[s("code",[t._v("todoReducer")]),t._v(" 函數:")])]),t._v(" "),s("ul",[s("li",[s("code",[t._v("todoReducer")]),t._v(" 是一個純函數,用於處理與待辦事項應用的狀態相關的操作。")]),t._v(" "),s("li",[t._v("接收當前應用程序的狀態 ("),s("code",[t._v("state")]),t._v(") 和一個描述操作的對象 ("),s("code",[t._v("action")]),t._v(")。")]),t._v(" "),s("li",[t._v("在這個特定的應用中,只處理一種操作類型 "),s("code",[t._v("ACTION_TYPE.ADD_TODO")]),t._v(",用來將新的待辦事項添加到 "),s("code",[t._v("todoList")]),t._v(" 中。")])])])]),t._v(" "),s("p",[t._v("這三個組件/函數之間的關係是通過 React 的層級組件結構和 props 傳遞建立的。主要的工作流程是:")]),t._v(" "),s("ul",[s("li",[t._v("在 "),s("code",[t._v("TodoList")]),t._v(" 組件中使用 "),s("code",[t._v("useReducer")]),t._v(" 來初始化應用的狀態並獲取 "),s("code",[t._v("dispatch")]),t._v(" 函數。")]),t._v(" "),s("li",[s("code",[t._v("TodoList")]),t._v(" 將狀態和 "),s("code",[t._v("addTodo")]),t._v(" 函數作為 prop 傳遞給 "),s("code",[t._v("TdInput")]),t._v(" 子組件。")]),t._v(" "),s("li",[t._v("在 "),s("code",[t._v("TdInput")]),t._v(" 中,使用 "),s("code",[t._v("inputRef")]),t._v(' 獲取用戶輸入的值,並在點擊 "add" 按鈕時調用 '),s("code",[t._v("addTodo")]),t._v(" 函數。")]),t._v(" "),s("li",[s("code",[t._v("addTodo")]),t._v(" 函數內部調用 "),s("code",[t._v("dispatch")]),t._v(" 並傳遞一個描述添加待辦事項操作的 action 對象。")]),t._v(" "),s("li",[s("code",[t._v("dispatch")]),t._v(" 調用 "),s("code",[t._v("todoReducer")]),t._v(" 函數來修改應用的狀態。")]),t._v(" "),s("li",[s("code",[t._v("useEffect")]),t._v(" Hook 監聽 "),s("code",[t._v("state.todoList")]),t._v(" 的變化,並在變化時輸出日誌。")])]),t._v(" "),s("div",{staticClass:"language-jsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-jsx"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//path: todo-list-app/src/components/TodoList/reducer.ts")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * Redux 中 reducer 函數內的 switch case,用於處理不同的 action types。\n\n * 在 todoReducer 中,這些 case 實際上是 action types 的不同分支,用於決定根據不同的 action type 如何更新應用的狀態。\n\n * Reducer 是一個純函數,它接收先前的狀態和一個 action 物件,然後根據 action 的類型執行相應的操作,返回新的狀態。\n */")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" IAction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" IState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ITodo "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./types"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("todoReducer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("state")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IState"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("action")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IAction")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" IState "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" type"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" action"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("switch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ADD_TODO")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todoList")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" ITodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 這裡的目的是從 todoList 中移除指定 id 的待辦事項。具體步驟如下:\n\n 1. 使用 filter 方法遍歷 state.todoList 中的每個待辦事項 (todo)。\n 2. 對於每個待辦事項,檢查其 id 是否等於 payload(payload 是從 action 中傳入的待辦事項的 id)。\n 3. 如果待辦事項的 id 與 payload 不相等,則保留該待辦事項;如果相等,則過濾掉該待辦事項。\n 4. 將過濾後的待辦事項列表更新到新的 state 中。\n */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("REMOVE_TODO")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todoList")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("todo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" todo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!==")]),t._v(" payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 這裡的目的是切換指定 `id` 的待辦事項的完成狀態(`completed`)。具體步驟如下:\n\n 1. 使用 `map` 方法遍歷 `state.todoList` 中的每個待辦事項 (`todo`)。\n 2. 對於每個待辦事項,檢查其 `id` 是否等於 `payload`(`payload` 是從 `action` 中傳入的待辦事項的 `id`)。\n 3. 如果待辦事項的 `id` 與 `payload` 相等,則將該待辦事項的 `completed` 狀態取反(切換完成狀態)。\n 4. 將修改後的待辦事項列表更新到新的 `state` 中。\n */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ACTION_TYPE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("TOGGLE_TODO")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("todoList")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("todo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" todo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" payload\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("todo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("completed")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("todo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("completed "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),t._v("todo "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" todoReducer "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"分析-3-什麼是-action-creator-返回純函數的意思是"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#分析-3-什麼是-action-creator-返回純函數的意思是"}},[t._v("#")]),t._v(" 分析 3 什麼是 action creator? 返回純函數的意思是?")]),t._v(" "),s("p",[t._v("在 Redux 中,一個 action creator 是一個返回 action 物件的函數。這個 action 物件包含了描述 action 類型(type)和相關數據(payload)的信息。一個典型的 action creator 純函數如下:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// action creator")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("addTodo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("text")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ADD_TODO"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("payload")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n text"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("completed")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 使用 action creator 來創建一個 action 物件")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" newTodoAction "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addTodo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Buy groceries"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("在這個例子中,"),s("code",[t._v("addTodo")]),t._v(" 是一個 action creator 函數。當你調用它時,它返回一個包含 action 信息的物件。這個 action 物件至少包含 "),s("code",[t._v("type")]),t._v(" 屬性,用來指定 action 的類型,以及 "),s("code",[t._v("payload")]),t._v(" 屬性,用來包含相關的數據。")]),t._v(" "),s("p",[t._v("Redux 的 reducer 函數則根據這些 action 物件的 "),s("code",[t._v("type")]),t._v(" 屬性,來決定如何更新應用的狀態。在 reducer 內部,通常使用一個 switch case 來處理不同的 action types。這就是為什麼在 Redux 中的 action creators 是純函數的原因,因為它們返回一個描述 action 的純函數,而不執行對應的非純操作。")]),t._v(" "),s("p",[t._v("簡而言之,Redux 中的 action creators 是純函數,因為它們只返回描述 action 的物件,而不執行其他可能引起副作用的操作。這有助於保持 Redux 應用的可預測性和可測試性。")]),t._v(" "),s("h3",{attrs:{id:"分析-4-iprops"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#分析-4-iprops"}},[t._v("#")]),t._v(" 分析 4: Iprops")]),t._v(" "),s("p",[t._v("//IProps 具有属性 todoList、toggleTodo 和 的接口 removeTodo 用于 TdItem(item) 和 TdList(list) 组件,以定义这些组件应接收的预期 props。")]),t._v(" "),s("h3",{attrs:{id:"iprops-interface-for-tdinput-component"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#iprops-interface-for-tdinput-component"}},[t._v("#")]),t._v(" "),s("code",[t._v("IProps")]),t._v(" Interface for "),s("code",[t._v("TdInput")]),t._v(" Component:")]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IProps")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("addTodo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("todo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n todoList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("ul",[s("li",[s("p",[s("code",[t._v("addTodo")]),t._v(": This property is a function that takes an "),s("code",[t._v("ITodo")]),t._v(" parameter and returns "),s("code",[t._v("void")]),t._v(". It suggests that the "),s("code",[t._v("TdInput")]),t._v(" component expects a function to be passed down that will handle the addition of a new todo item to the list.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("todoList")]),t._v(": This property is an array of "),s("code",[t._v("ITodo")]),t._v(" items. It represents the list of todos that the "),s("code",[t._v("TdInput")]),t._v(" component needs access to, possibly for checking if a todo already exists before adding a new one.")])])]),t._v(" "),s("h3",{attrs:{id:"iprops-interface-for-tdlist-component"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#iprops-interface-for-tdlist-component"}},[t._v("#")]),t._v(" "),s("code",[t._v("IProps")]),t._v(" Interface for "),s("code",[t._v("TdList")]),t._v(" Component:")]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IProps")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n todoList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("toggleTodo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("removeTodo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("ul",[s("li",[s("p",[s("code",[t._v("todoList")]),t._v(": This property is an array of "),s("code",[t._v("ITodo")]),t._v(" items. It represents the list of todos that the "),s("code",[t._v("TdList")]),t._v(" component will render.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("toggleTodo")]),t._v(": This property is a function that takes a "),s("code",[t._v("number")]),t._v(" (presumably the id of a todo item) and returns "),s("code",[t._v("void")]),t._v(". It suggests that the "),s("code",[t._v("TdList")]),t._v(" component expects a function to be passed down that will handle toggling the completion status of a todo item.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("removeTodo")]),t._v(": This property is a function that takes a "),s("code",[t._v("number")]),t._v(" (presumably the id of a todo item) and returns "),s("code",[t._v("void")]),t._v(". It suggests that the "),s("code",[t._v("TdList")]),t._v(" component expects a function to be passed down that will handle removing a todo item from the list.")])])]),t._v(" "),s("h3",{attrs:{id:"common-aspects"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#common-aspects"}},[t._v("#")]),t._v(" Common Aspects:")]),t._v(" "),s("ul",[s("li",[t._v("Both interfaces include a "),s("code",[t._v("todoList")]),t._v(" property, indicating that both components need access to the list of todos.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("ITodo")]),t._v(" type is referenced in both interfaces, suggesting that it defines the structure of a todo item.")])]),t._v(" "),s("p",[t._v("Understanding these interfaces helps clarify what kind of props each component expects and how they interact with the rest of the application.")]),t._v(" "),s("h3",{attrs:{id:"iprops-in-the-todolist-input-index-tsx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#iprops-in-the-todolist-input-index-tsx"}},[t._v("#")]),t._v(" "),s("code",[t._v("IProps")]),t._v(" in the "),s("code",[t._v("TodoList>input>index.tsx")])]),t._v(" "),s("div",{staticClass:"language-tsx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-tsx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//path: src/components/TodoList/Input/index.tsx")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" useRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FC")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"react"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" ITodo "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"../types"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//addTodo接口中属性的存在IProps表明TdInput组件期望将函数作为 prop 传递,并且该函数应该具有签名(todo: ITodo) => void。这表明该函数的目的可能是处理添加新的待办事项。")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IProps")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//addTodo:它是一个以ITodo对象作为参数并返回的函数void。该函数预计可以处理添加新的待办事项。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("addTodo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("todo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//todoList:它是一个对象数组ITodo。该数组表示组件将与之交互的待办事项列表TdInput,专门用于检查列表中是否已存在新的待办事项。")]),t._v("\n todoList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ITodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * addTodoProp: 是一个向下传递给TdInput组件的函数。在函数内部handleAddTodoItem,当即将添加新的待办事项时,将调用此函数。该addTodo函数负责将新的待办事项添加到整个待办事项列表中。\n\n * todoListProp: 是待办事项的数组。它在handleAddTodoItem函数中用于检查列表中是否已存在具有相同内容的新待办事项。如果是,则会显示警报,并且不会添加新的待办事项。\n */")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" TdInput"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("FC")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("IProps"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" addTodo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" todoList "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactElement "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" inputRef "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useRef")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("HTMLInputElement"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" handleAddTodoItem "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" val"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("trim")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("val"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" isExist "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" todoList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("todo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" todo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("content "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" val"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("isExist"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("alert")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"to do list has existed"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//在该函数中,addTodo使用新的 todo 对象作为参数来调用该函数。addTodo这与界面中的属性设置的期望一致IProps。")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addTodo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Date")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getTime")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n content"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" val"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n completed"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("current"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("className")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("todo-input"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("input")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("please input to do list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ref")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("inputRef"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("button")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onClick")]),s("span",{pre:!0,attrs:{class:"token script language-javascript"}},[s("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("handleAddTodoItem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("add")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),s("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" TdInput"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/6.cb88f024.js b/assets/js/6.cb88f024.js new file mode 100644 index 00000000..112c0ef5 --- /dev/null +++ b/assets/js/6.cb88f024.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{279:function(e,t,a){},293:function(e,t,a){"use strict";a(279)},310:function(e,t,a){"use strict";a.r(t);var o={name:"CodeGroup",data:()=>({codeTabs:[],activeCodeTabIndex:-1}),watch:{activeCodeTabIndex(e){this.activateCodeTab(e)}},mounted(){this.loadTabs()},methods:{changeCodeTab(e){this.activeCodeTabIndex=e},loadTabs(){this.codeTabs=(this.$slots.default||[]).filter(e=>Boolean(e.componentOptions)).map((e,t)=>(""===e.componentOptions.propsData.active&&(this.activeCodeTabIndex=t),{title:e.componentOptions.propsData.title,elm:e.elm})),-1===this.activeCodeTabIndex&&this.codeTabs.length>0&&(this.activeCodeTabIndex=0),this.activateCodeTab(0)},activateCodeTab(e){this.codeTabs.forEach(e=>{e.elm&&e.elm.classList.remove("theme-code-block__active")}),this.codeTabs[e].elm&&this.codeTabs[e].elm.classList.add("theme-code-block__active")}}},s=(a(293),a(14)),c=Object(s.a)(o,(function(){var e=this,t=e._self._c;return t("ClientOnly",[t("div",{staticClass:"theme-code-group"},[t("div",{staticClass:"theme-code-group__nav"},[t("ul",{staticClass:"theme-code-group__ul"},e._l(e.codeTabs,(function(a,o){return t("li",{key:a.title,staticClass:"theme-code-group__li"},[t("button",{staticClass:"theme-code-group__nav-tab",class:{"theme-code-group__nav-tab-active":o===e.activeCodeTabIndex},on:{click:function(t){return e.changeCodeTab(o)}}},[e._v("\n "+e._s(a.title)+"\n ")])])})),0)]),e._v(" "),e._t("default"),e._v(" "),e.codeTabs.length<1?t("pre",{staticClass:"pre-blank"},[e._v("// Make sure to add code blocks to your code group")]):e._e()],2)])}),[],!1,null,"deefee04",null);t.default=c.exports}}]); \ No newline at end of file diff --git a/assets/js/7.0f51d652.js b/assets/js/7.0f51d652.js new file mode 100644 index 00000000..7ac1c130 --- /dev/null +++ b/assets/js/7.0f51d652.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{311:function(t,e,s){"use strict";s.r(e);const o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var n={methods:{getMsg:()=>o[Math.floor(Math.random()*o.length)]}},h=s(14),i=Object(h.a)(n,(function(){var t=this._self._c;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"theme-default-content"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/app.91071ce0.js b/assets/js/app.91071ce0.js new file mode 100644 index 00000000..80a2ba28 --- /dev/null +++ b/assets/js/app.91071ce0.js @@ -0,0 +1,16 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],c=e[1],u=e[2],f=0,p=[];f

    A(0zE{DA#~uQAesD`230z>Ei-cvUAajec8S&X!X8Rtnzj&GFHJQk zgf5t1cmd5>ojc!p#ZnYZ%4{4a6sdCJ)YjQ8Sc9b!0QKLcX`0pu4O!E7*gk5~DD0JW ziHx_)mu7w06Dm<8F<5^g)^9I{d#7||l_3zD@84?S^n)c=HQLB#FzP+D)088nuC>Sk zHvXx=bTvce@)KWoM@iC%(_kM=e_ef1C{N|UXJW431x0e7HV-i%hXM0E=D8x0wbGry zSS9I=ByEYMIp)ZEhP=v6BlAvF77ngnB3B*}eh8b7kU3G=adoiH(^8MgA{NzZ$W;8J zJKR#m7S|ld@{*N$MWa|INRh!}wsNDtje?`&8cMYUF8Zb$FcOIK^oVrWC(rLYi@lsi zHf4k%uJ;hY2&>LR3}|l%E6LU^bsE0Man%?UO_12~&|6`{?D)<<^q^~tR8q!sNgaND z`B7dmW3f0W%;_&r8-e-LdEF_&*>!V}z(qU9nFCoY?WhSQy}{>H9Jpw^j2LfeV%3FG zhN?ZTQqB3g>LE}0+=D!0$Dc{hFtc-~nQJt`MGk!GO=Fo-*+rQTLb-^7v`qwFuu@NH z6;AP|RBC_pAzTIVnFF)bl3FF5r6wmfUex}7y~t=UON?tQi|Kd^RhOJuYO?PXinIyO z%)XOvF9x*@5+H(Ge}2^q3C>usJE{D|VjMpvFlVSIlPPj8P6Dsuk(!1Z{|h0EK&(7 zE0W$a8B=b-sN9PAj9G4U8>3!;SakDI%sZBy83ykz+)pvl8qh(EU83T>#XyMkXs^~E zO7&~^dMsVRocj|Tvl1%fHpQ+o4U>(3_j5nSYEZ|oaC=YDv|IHTTA73`3KC!b-Rk$ECZ&6Bam!bCJ&-Q0)=t{)sOiDQ>q+)}i}R5RynHwBjaRJFIQL zxi0alsHL(VoH0$49bc+J$>?_IxfBuuJAT|>y8$1W2qi31bap3XWV$uT!*@W~DQ?^Q znNY;`6EH++tCOtbi_lXP<%YF6JR_1>$RhzRl~F$5mb~?Dx7gGjb>c)i3_?UI@ZlQv*0xtN!iVmP8p&|lz|og9g_rbTeIiwD@b=-p5f zyQpPDl6FgDY`mFMgVLe+A7fq_(n~iAB2Xxk@Gzdx_4fL#NUcE(mn27ZDAD2o*Yd+k(9LYVC{&l2^WzH9424X2sXs z1tDP;224CpM82vZt9s7XNlBMr24a-u=J0RKAB(=8xrAyPWl!U6M2sm?=#GR6cR66T zi@9@s<=+;qzl~&UDRe9_OQS&cQWv_Q)s&Ki{Q=W`PjAzOf%*Cn*AnngJ1r;@I{SPD27GYQc`f_k_`+hK=Al;$Ff=S zQGQOJ1sVy9<9O*?_7j72qB18P(k@)A^Yjj0ke2lcL1!TMj@OZQQ$3TqT%=i*6TntW zZiwq69|&c9#3iB4*GTlc!b~6ykE@sXrZ+=I4RmXnSIrSV6I~I3bWQJ~W8a9wPV1CYJN+uC(EfGH4vXjI<%#S@J7bUC&+=?0%J&WBHoh!hew#Y)(> z5o(`}Ro3~c$UFRt2tWL77xI@}h9_^2IJ`+j#Szh2@4aO*n&=m8e2Eb_t?%-;`MZHC zd8!pt9T+;G=Yy_4Uat3;$2L2cKb{||yru-mQe|oW7_z9z@DAF#fTGiR>yRNCBu|kdgDaCCWNGr7&qbYQp z9<5l2mY1Y_mw-!zj9XATIR)T;Q+J3{H*Chkh4GFBJAWiMo(+A*UH9c7`V%?@d@f1^x*tQ5U zVeQ3K{4p4@2WRB)5b6gz;{#>~t>8MEgHTcbCL#fMC=~Z~J$+)Pk~!^kCl>%mhZ&z# zx+gKjPqRLe7*T35k`{T#qriJS1~*=f+K9@Na>pRa$9vwYlEL-TBQpq$Po}tIhD4O* zOfxc-LsL_b?GpG+hcfQ3E@AH>G&`n2nOgcNHROW7~ zuO~GsIMQWM^Q}7EIDB=5wvAHm!pH%y{3*pNp`XHV=RAO^_KplSv0)-HO30)ukT28v zL5leDzH`~|vvYx1;)o^n5Dp5N^%+Z@|6`m3ijw5l9 z$O4+>+Z-yboi8nsg~&QQufv#0MEkEgF**}F0;~Cd!W9$+u=O&$vS(M|w+cJ>Cb9Gf zXucOihQ%vtwvoQH)13)_q+_94@G0CGURFjEU!KUjqRlmv1m2;8xIc722=ThE=7-^JkNx8^a*I?AmJPeMq zKYBOSlh8w*Ker}7d30D(E3X`Mt#nnwTyGpMBko6ZAJAAl@USigOLP%&MJnok?WmQr z>kU7qv8nXg1-&DwI>@Yp?m6)iLhq9?QG|7LHrY)S@dD#jeh4H|HsL{L@^I}t?P1(mC1H@*6eC=t6C@Tu zCitdBa21B-oUlI>R%weYQ*PpqsAp37o!*=MwdJMJOK)7WtLZCB#Jmxs7BTarB`l&}KV;iVexc059buY~Ke35p)a8;5hmuDRx3)H-y-DKz7*Mu*Sp-Wq5M9dERd?qW3}x z{0>P*F>Dv=YL{D8h*cp|9<(QsjMjmjtB_2d&e<&)QPFpp-;quZ4Mcq?T4cFC3FPf* zc>JVrh*!=d=NzCUo?S{%d{U}}wX=AKG20t6i}Uhnj>ZcSpJ?zx)&25Uf5R2qNuDb< zN;YBCuSYtbtN7_cE*NqCK+8vM*F??|aa0~)5te3at}cwLgnw~j>-QSbP?VQUi%YU^ z0h~7JYSerRio~1SC#_~?bbH3mJmm6_mw;UNpFq4z_0MJXh*elkqo3Y7@>PNq7UOsw zQ0Y^!J7BYeo3`Vp&jl_SpT?`(%Dlrp6@Yx$-(N|)pn1pmk0gYaixqb0_GD)wi{_4B zWsq}bN#HU0KtW+V>fmM!lt;{0rg%Ade{Jlmtp|g66Ln@>)9xO6;S^;82bDr?y@YSL z>l?c;u+r5Z|HMo9$6PU6W20nrx21@rz`$YMJpt$)4;miiyi-b`C=sRsS318y(BZ(G z;jidj32g=}c-UQve_(Ut;NlUUun`=Wlddu-sA#}1u674|@)yi3mPw_hLj$A#R0pW-R;Ac{ zQx%6?2I+XcK%TMa<>$)KspfK@B3egQ#Bcrho_qCoOUe`cYI5`(E}-Qteqtegrwyog^zGl-_Ym?jxDe`V)<(LiMa%6t4hXEVHxvwo+}$mc zx*kY{=ZtJBEWifr`AUdw^W{s22ii0gA&|;eZ!KKXJYP0e-{3nQ8-Ft-Lk!mL&x=hk zTmS2|CQZaKy}5v$jLyIn&WEWB7F?$0H#GsQu$5ppI;1iYy1xy_LVj`~B3gQh2oyLc zT8Cx%UgevCNs;Ff&kv$UrGpV3mGDO32yw4S;fjo|f2lHZF?#@_SBE^}u__jD9_vYXB%uKYlBfG`}4=Dx6_Hq^Ip)`+x7cs8GvKQ`&((pNX z8ompAk)Pcy5BunH&_1XvXd9PpZ~S2zyU{V;CMc|VP7Q8AQWwOp-@fnbAm`mI82pKK z0;bv}*S}Okyh3ZU@F4>Vp9K#+nn@(_^JYolv=cPhqhgx0Dm7Np0--vpdJ78+00%8_ zHsDCM3RN%>?^VQ=e+ktEe5^u;5eO5tk>1Sv^`QyNOpK<8PKxn%m~ZVW9EF$?POnl- zP4J+q_yC?7@?CIOHETNWO9o%mvx8QIm@)DeqdLCzgQO3RY*bL5HgQ1fHob>>95dAm zBs)q$nWaDe5TfeyNE3Rc2#7Q!(Kyo0Rf_m9(@ji*HW%=93YR6Ghq#FO3ZKg4+g|Vk zZ4v9^R2?CiHB!qyxuF67iUb1xC9D~>|=^H4}i_?kStzP#mfb0&A*J(WSEE^k`U6$S8anvyRL-*(J}iTY+c& zsrF@sib~<`2}IR&7>i#9hr~2}TSt78h9NVL z$y90_`(@H2%>y3{%pPCHqH*evh~3{uz|0At?La(TDIINvWBD1ux&xyMOHxmy+n$dz z-Cs&6ac9x*f?KHzaa}&<1>zf;kkoiRiBqw(b2VHjYshRX0YgfBVw;h&FH1OmlN&o9aJY*Qd--1JOCm zp&bdB!R5{*uV4k!dk~}8r)6D?J5&8BPc&&}A&lr8vJA}V>gcZ8FPRdK;r>bMwAU&d zHP@vqlsi){*>*kIb>Y&!bdS3;xdc+iy9>J-#EddzL@-sC-YWZM5oX?gj@V~O-08v@ zv1Y)P#pW^_k|Bo^v#PG~q3jWK^EzJV_JBgGh+0_#5}8qV%tFtJ znm87*^Mu9TD5SXJ!rFK~xff@QNye%EvJ)ljqZvEzg3id|SThVdz^c11mFYp$MNvSU zx%w4n$hZa3(1Y)nzgd0$K$d|xNm(Olm(TCXMZD&Cr!7~jAgw3X?h0hylix@U?o)TU z=jCTu4BZl(hGX;Vc_CAZNZgH8{=9@~U$`Uu^JScWRM2e_!eU7i&J^YISaP|Rlyvlc zygO?&E^3~Xf7IP=G2ZhVY~(V=q>9~}4Pt?#L)G_;f~P9#^$2?HCy|0;PaMXXTK0%F zrwq8&|EXpCu5?$lI9flQlBJi$zc}nz;VrR-tv4KhImj*5qv-Cq0bq|{w9MY@n+hQn z+nc&n>7EI^Z#-IJdle%(RvUYD>~v|=jm0@Ju2@c zcnk4Ruxf&`cP;_ExAC|4^@Y8fT!(cDS=THPLbQS-`p^xPI09^=?FmRbfs}fCinMI% z-(MBz0OoI$ZcwC@9VFt!-$|#`p3<{J=N6O;mm;y{P2x`up0M{kJ_R$d`eHf=yXc*e z=BR3cbCT_rsCa$vGCL}gALHlScs)g2+m4~9dR_Cbj&g68dO+&aJSu9V8Y4uKM{s_I za7a=$tY{tyyZjRYYCM+F4dVF}6J?9^9oSxs-%XLOLpks2y6F9T>_!y|+UaAp9qf2S z!AExTIP_t79Z`7D7pQ@jYIZ9erVEHMufSAI8a`?!D`|DmFJ1?f^v+aJKmnh>nl{7u zKy%5?cNAWR*q^rTEb}~ny`f5q3j&@?q zq`1J1yxAV{LEhL7GdgO6wxpu<_HA)iA0#y*V+PCe0pC9o!+$nAzv;k}b8bWnB!oE}WJ~R~w>It8 zpT@2H=Js~1ezG}UvFhU6|29?SlQyc>qWm*yNh`Br0KIgAT9A8Fu^sGJJN--_%!xSx z9~CQfHXj`;-8csSQcs%GD%2HGbB717QlA1aV>D@{q@6p42p>DxN7?aWG96TM6=fUb6Mf~ot#{y!WLjH!O510`j3@5tW=^U`BAxMYIzK((0TG8z6H-k=B zYqF4vtWNB2RoZS6<{JNcdxLi7bUKE_n&r|*^6OM|vgPryi0%3_e3~Ij>W^>YMuN(} zARJ96_hZ|9whwim@_tV?+wEKnR4zE#mh@*_!)7`$u=Yd}`Ny;D>z4rWj+|?#Z$9h` zz9$~aG!GAa3gW5j%D2kZ?Rk}H(!C5j-CQp;%X06|>fEP2-X?pb1clW<;t6!3vJ+phSNPocuJjhAg&Zal3PBR4;V|RnzAUP z(3L8g7JzkniR;|<2s(H`tC&fjsyTZ8ohv7=Txr^h*;KKkh@UFp6J3u_M1{qkZ$s{@ zz>O<~e(5A;_ATG8yD-Xzay&dvKZBj2D`_jij^8xf*U<0IML4K!@hv7)vfMU#c0^U& zY!DjuzOh6N-gv;uy^Q8O$*|9%{@ig*K~o+pXwW9KS9WWV);BK-Jb8(%r%WI|Bsg8w znSjbax*AQgF+53bS~M-o7iB9?w|4#fDE@U<#Ej6&y((X}mnl<2+iZ+z#+svSd4HVC zw90PT{EPmwEidQnA|^HJlENw0ao_Vr4ny(*-v%v%TgBPl%Na*m_Oi`i@&(%ky%q?8 z)yE2S(hJ#VaO4|Ry6q)yLP?iY8XcvxBS>jD2iq_qvy*m%jwZ&6eiXQ}*7v7sZPzSxBr_o6#RkEtfiBL=iZx$EdG zBc>EUv%qI}UkRmAeSH5Wr1vQg33p=Zvko9sGdEP!J1xOaD}oP`|K!^qQ>hnQbM?+7Z<)7V@(+e=4yMR}R}H-k~(G?2FE0`MVLHm0?tY9xhLI zIpSYaS25PI3(b0IM+~0k>*q8yKbs_EPjN+?31+Pw+CTD=U)+&yVjKnD#MzzN89Z{7 zHCb_`nJnVm{;n$&2Q;;vLg*^%-?lztt@BhCEJLBta$~KwvE#Er`9N7K%lZ&NgBtJT zK|{=Wvxf*-He|z`a6Ea@{cWi33(L#&q|_tA;#*ltk|7lGaVmwbmU zNBhDTuEgg@DNW+O6o&;LEG6&bTC>V>wnkQmp#hz?t!1m0UGGxay@bfET;DJK@~gTI zhI_3BvsVe`1!QI~=ljpPGT1*P-76K#mhIa{ z=8`UR3zVkPFyLeDVe3;KUtcEtRT}E7QwF~Oe-i%BqP-zmj;U|3u-7kRse+67oK8!F zMW~g=b2N(%^sE*@*D>QUt}3Dxo~E+BHS-s4zNPiHeG8Zd7BRY=DJJJ zg2s-e|0Us|=NQMo-fG@NgYR%{A(ckFK+@czNBg^{1z>`IEBp@OQ}nkafc^>hi2IQS*c|_adjIGJF6oDX(lf4O?HBz;dL1=S{UDZP&GCPB z@c$dHrjPGYwtRHX3C@A+90y+405_8Tq3`RIRHgRq)uDeV)vl%g)ueF(e+Z7^sYx2L zfR(VF^3QmQ_zv0lee-`{ssFFqe=FMOlA!@l<5ycgdlz8qOTlH$tr_Qx;QZ@hu2}fp zr1b;z7ebeR$@ouo>HLC6md@q3WN+e{19Ix0a{Qot2u_Xpt@^LWeF@Nq={o!focN2l z|1|~wCE))m^c z>`rGhP1mxUavdyWs#oyBt>2zu)1K5$XU(&7VSQxs=YJOe?*ceOgw#B{m{+ObRXsey zv#$m-yU=HUcM!NZcTpx*8{&`@rHg#jqTn#@ZTerA=)W51 z{sp}l=vfNk8d{ESD7pD_*J%d6=N|AXAgcnF$^ia&do+uzVhI@!B}V`rT(uhe%;PzNPBfgjYD$@ITwEf>g0Ta}vW(J7Zqanz&$N6&S8csyT|fSp zLHoy~8b|n`dE_H!knuANw5Fs{TiOaNE7rXn(XWGEvZ)TXgVmyU5)41W6vN_IG1sK2RY zLpRw#O%limPk*;MHfml(N}#VDwmhZU`c0(L-H#SNTsCoP6E^768Sk7KZ?@kU@#9Hi zqs!Q5yak4L7bI%v_ZrUu0N3Zxjqk~EJXd>Tg$`_fc4JM=DnQe? z5?Vk9_@%P3Cs#{w&MPkU-6_Ll>N2ilYVac^g=9WD0RbDP)JZ|$O<9}JSn;*o! z(sfK|4hEH4;n6qJwJ1VS@~g{<%Nt32wzL~}8eZ?728mqvDi*Y#uPhp&t%?SGv z2<@DSr#zIEx#<3eh}L4Mu#bEfr}XwA-8;Dtd=bnze1DI!xOMt`vf0^pcQyK@yfc5U zzW3qkSWUYD-YTimU4mP$ut;M_y&Iy=4TqT9Jjgnt-W*a@jcGa+K55(sN%3`*w{YX< z#|gI#0(L_5N2nC#9k}SRMn#yfH{Xj-6G(~Z1J3NjkNiy-Jz0__MCIG(QB}433^HZ$ zX+UdzvP}A;N1RIUIdc&OEL;MkH}$l|$(TtBhF<9y!S1x%Bn#KtKT?~~goQoh2G&Ge zU(BocLu>s;dyHMNR*tLMXK^O7jg>>5dz2zBftW*`u)e|V+vPCsw2bO=AQ={PZEs5C z8ySzd7qFSB#v}fOey#M4(&7w1cHy#{tEirN7M-HJvSe*(LFR*uD`LFtzl`sHveo}I zp55sZf3>i|7eY>hd_0V%K9l=Ga9EeSuEpE%3c9sBX?RFBpeJp=Y zSBjF_MMJ47`ITb9F~|`qxDKm{9o7k(OCGS6P%HZ;X0xd7fx5U^W6aU~TzqRQ_~X+8 zam~}2XL_#%0SwKdRRe)~gqM1LAs!~`wpBd>=PL>&hoQ)hy1UA+hocw!)U92;I2ZNx zHT;+D0NF>Cmn#)_kSfb}h}0;1d{lG7pRk3%wosF7nh-A00?M?JM<0fg(Fnn5R*XOOd|$4PJvbxBC@3Uirn5eX4Xn>&fI<`I^!UV-hnB%Z@!lx3F9F>KZ3{`pG68CXohl0Vp|D9A^oD2M40c{@hEw&=N| zpRrUQugM>VZqbwFM*q;*K3rjSM@y)DE}qz|tp0MTc$c#A-)ZRofwgtQzgFyZ|Dp_@ z$kM1}S!XMh<@_RxU(Ks}-S;Irv|?`;*@`gBvWmaHhoH>M<_wHf(P7g%H{WWB!XqU{ zKadGBeo`)Jq{EsFZe#!*BYpvL1NOa5IU?8w7=zOfk?qx-8x9Ssb|^{}+0NXzxV=u# z7nbVo?dpwTlq*h&=H^?R0f?Q#hSAg7W-+L_I?k$05rZ@MM`!)vzP9e@f8ff-V^3z9 zbo%(gso}7lyG5wWrr>Htx5{E>JTQH;f z;cpB5{TS7e;i_UR-xpbqcwAdLvn5=TG^Sz$y44Hi6}ADKRp%D^=1ba>>aU%-YhLA^ zLqA{782`MtJd;Zy%!D~B(0OFs-fPa(IEr2ERXvg`Rg-UK{VJfm2&w{i+bu;JskA55 zeFv>m$KEW%pxQQ8@ptr`J=|ovmirBRev;G79{?vSp;0p=F~&r{0dXQXTp5 z>Ci%?yI`l?L|h}bpl_+HE>kDRKwD0nZ=%Yj;?{So5P`j8DrS>w-zP#dfe1$s!4BZZ zHe*LLE-3-;5^wAB%_5^V`vD?DKMv?7&3&#;c6X1MLvFlSx11~I+s6^ZiiUYnz{X$z zMbtcL(#4X`PYo$j=xraRVA7V;=_)q%rO>E2{0`Q)g~!H!jA>Gs2U602IW5gVe^VY9 z?wILa+sEeeAZKA|(Ry6agmLk=A6`kyejFwR5W}#0cdHYACf5Rzgs5jSo%({yKd(e| z!R>DkwWy)#GL+c$Cc8&^DU5FzUsXZvh zgriF(^9P^bV7&C>p2K3`D6!E6JzS{Hj`03<7;KgCB5VDduj)Yz1S20G_d?1qg2KTz z3-74B?Ih$K zbC&HU{aFkK9agRHq3*<9e8Iu|gKZa>ATh$q7P#SFm9a!aBl0)#TKvP(<9JiEawl*c zBuMHN4--MUPPI?g_FpjRe_GNR^#8yijbYI{`anj25ZE20gyKSkL-SH-A0@^v5$epo z)YI{Na?u&cvC3@{Jri2d0!OKVs34_Gpsc>SeTK+F72A;=;e~8u8Z};8N7kjYf<|ah9D_U`b zuqBtR%~W9;@;pQE5{V+~i;PUOmLJ`Vls#p;t$SxLAux+(rgQ-<#yRM@CL3ThEt{@9 zzuCDZOdX~hKoW${`I|W~&vJ_MQ4!`dgjhCvB8f?g0?c_;w2J9ni!|3X9UhSJ zqJ|jKM4caFzX&p<>OUgZiq(kHp z!T3ITCy_5(+**N$4fBmLs)G&f>bb~Om4APS5k$0Y<-R{rD50H3WG%i??Bj?}Na zrB1GAsH`B#jQ1qC6)+udtP>K6#3Ck+X#UxC5GAYN9hP5fw<4l~U`7TL4cCB^Y(sN7 zsjjFffvJ9lb8pjZ+;)A0r0xz%L)BJ!JC))f z^!Svp%O4V))hxj6bm=Zr1wuwz!U%)0bTgX4d|bnp9w%ikA@>x~b*xfd@+hzDjz z#3+Es4#G5g1Q|n{iJ=OFJo3~Q%K!xldu=iVyJMTaM%@ncQyEfWxr2~?|068`E*e18 z{;Z)+BWuFQ^#?)=GAS{s84ZC*JH5Y(4;JUTH@WZ#t&*%%?GVQEYz`cm2dQKhK4DKw zqB0&)YLU3q&53p2nA=%*Z!cB^k{B`(e<-*GBZ9KmBc`IH4FN&VZM`*p6QqR+9YjEN zx{kyX^!ZqXnk~|TChlWQ?z-j$v&;i!cHW0g9!#!bN(EOSKVp#g%Y-u9AHUm10o+)x z^_L7^@A!;mI@HF-v3AAvOrMaAD`x{aLV}OJ0X1zH(2gAOE(fuO-KUl|fl-=A zzUM%dZ2~$R8`{}%=`nokftB1XlV5~8mR)GRb~T6LX8RHE%t-&52)>AM^LrOPo6{g5 z)l4Vh zD)vQZ5d(VMdodeY1Mb3f+o;7}(_xjeZEWsxrlG!oTn{k`DEB`uIe0%L#^z;}wP}@a zFNV)(Xdv$Vo}{?)Flfmb=$1{NY6By6=#a|-Y=1S6QQC+HEB;nva^B|qOw1eWB+bot z)9GgDWQ;!M5_FZ3Erc^B22k%g>HpCA43UyyVA$e6_rl72>6mY;4cN6^=5k?&mqYX0 zKg2uTx;>%5aik=c(c1Nt%m?SA)1OMMdPQSaM13aP%$ zfG$ZFLepsr_9Mav%YchMeP4XcA{+#C>EeymfULGg^0~R7bi3AQd%gaoubF*g6J|`E zf4J^^&pdYb$qpA=@za}bayoLcXNI^t1M|83oH20a7{4wH(QL#E8Rx+q5gUx+*eY>V zY4;k+1+*9G>imdl;L;b}KOvO!J%_LU)g8QpIV^)6uRmUE02i&T&E3gm>-k`Nb7m`K zrJGQ*iXi?d7XVld>%K6RTEDOzRA)>{YEcTYYMT%J=}H;fd-YB4Wxc8Te3C{^CZ+ml z|5Huy_3ENRY|!;hSB!7v?4LAmk5@XT@kghVdlT5~$9&v45nNhnY>GY?(JLLdc!mtV z>TZ+-I12MN4sAyr`H0ktuVl>QJ^AM=!DFjvmNros(_XJVx2=C3S-G590#jlM2aQP{ znKEC=&loXd2(tzb@h&Rtvbza6T?bRB{tsba85C!`Y?~0=HMnbVNN`IaNO1ST-QC?? zLU5Ph!{9E1%i!+r?jE>&_nxzV?JxJ&RLxYqHPvrFtGidP?&o5@|Fny5HA}d;9i^mp zy!yGhPEdHj7=p*o8N%XgFLaA4m-|}pnjel-R3b}qk;c&JIf}q#Tw8BC#J(d+dP zV(Z3>Lg>pKyu-$~!lHR{cZ}otn_taXyYzb{Fg7d9fBjfhe;>GNTRx$ZMD~Re962Sz zAr@Bj0UxQrK&AKA$7aMxPtjBUVi6 z<{CMAV+KU}l`*^fKn*n^e=0UTtAec(;895vsetU`PAcnt#+|i%i|w;@=aZ>Z3-e{% zvtF2tezlYgwHLFShjm++ig{mJLieW}!-*;hDNg&hi%Jz$IFxEXq#g9%p{^wZm6(@| zCijTM`&{mJcr`^u7j<&JFf$s$9mpa-zT-Ir%wQrrVj6@cF0}2j)w{xnwm;K1udRl* zti5tBKgOhwPpgJXe%e}e-E=_4@W||UBtlyvS#y2=wiL$Q>*C5cnp>cL>iQPQtN;pV zHSKo0IW9{vecB0zhCN*hS~`16Gxp5qFcqhp+SOwx4KSv}i!L&SUOwuqOh@5n`H+Nr zL02h8q5qP14iRAab>8s0VH=lc`mih~5Ry)U_fBo`<8Yg!;?4 zwkXoS4Q^u$x)<`rdfS#X1Q9|n;_6GpplVv zc|4r^7cWj|$JU?5vV=|5@O|HQ9WjWcjq~x1u7z>pT~lu9%KjRPru+4=b{&w7n3=zp zi-aW-zkC+2Z;u%C08;@$Mq3}QM80!3qg~Qlpc6?6YO)!7yU(b*Nb3G%?GMGrE1(yt zX&9lt%S%AFIWmbZxCCp8F3912kqd1-sYUamB>Ux^hoVZ{V3}#r#G?DeuonA&_xt~Q z7#e+GkUexeTySTMDv^Y1FkOT^Xd_&e=qRBit_xQ6#0L~JHoBJzOiC;4- zWBu5q!R_3fp$oa@(vwoW(y_~fhErk7q~al!JXtZkjdc5`o1{oyQ-nN>Z$I(No)CWT zFSNc^l+E>Yq+K$6Mua-s8Y33=WVO6I4!-Kx04#LgjX5Thx%vnpqD~2q#1ZIfxX*O*F3ttk_z9=f(e) zwmPR`L!t8HcPvS(->20vW?6kV`bd+PI^k*nA&<}TaWpt{N%8v2oY#I+*G+R4yN8x> z6NM0UlKsUJ$6m&eeEd;TIvs7y=*G2sh^_fz5TA>!NHcQ`4T&OQ!m8%Hwj@%GhV<}9 zI~Rj+xJ6Yv4?9FAB8KjmmbLs4)4_j3^Ea>7+rnnuZzI>lOvQ-s2j2m*pV7OjYL~TA z`{l@EI-X9(3@*>1`gU>QQxEEnADv#BPfs28>(VIk)EKexS?-Yym{g|kI5tN~ebKD} zH}kDPBubXnfa59{WYXu4^if-_UsS;R=Trj9lxF59Vsj{3{?=^QE1sbZ@#wC{smb>1 z4BgzUE@{Pr0ki%($3AC(#;15f424SLZ@SLX1RAO-2p&D`^9UD|Y-DIu<;>t!Lc{gf+`t zHzuW*z1`pknu$&WjL4bV*_>f4zlOUSIQqh!`figf#);bG`h_C}suR&ScYhu`6NuS9 z6%#&T|EWL{vCkhgNMP<7Y^O-(botC^Vu0i}#?qQjPXAbCs3s)r=*WGw{KL!g`V1p0 zH}v^gtmRK_UEE<0M$E^9^kdN4YX!Yxi=Q7xHQ zqXbFESG#1)@hRgMJVRJy^Ku+wgP#!*>=mw6(GEi0Be zKeOidXOHWifcv_6T+eF^e~rHGRTtL}-3sq3LJz1?ee zG!{m7&2X#niInTgJ$08=$Iv`*PEUAPKhA6r+r-1z1MFujIMMH8w@mYslcBVNf2h`` zkfA0-Nx(efXu9K18FdS6-NR-dI!8JX+ftp(y$J|@MOQO!p;GF0afPc>yy^-^@=>x?Dmx^y6J1`SFra%;#k)kK5Ehw`W7H{GTyZOhU54pIVmcgWAYbIz=ngQ;un9HyOlkX=Nml)DJ4PW5< zCY{Z{r@7r5Xmz<8;xa(4X{f(PVPjbScCCKL=NX1x{V@rN4jaDG963J#s|#Ujk|sdn z5yIO-6lWL%&f`xHw$F685~)-~vyhv^iNyDzlJjY1tpa~wOocS-d;G#3WiiM)u3{G- zU^pMNxD2QmW~5+;$bY*28p}WhFH&H1MP0C+*dnXQctO$K`3r%SkMA&UUz#HA7gJE5 z)tB%4sfRYgd)6z(^_MyFP?s^QVg=io6(}%VVxWrJQH2I}v~uK&xWQ?f5RUgJ3^hd7 z<(QYDdC0~T(RiBF(qv;-BKQf-!rvwFK3N}ZkZh3Wl6P63!sxksg-9n~l=5U@a^cW3 z7r=G{Sfj+uzUgygKWCVXAGQ7}V_e$Mo!Rz%hp zVI|Dx6s= z#&LASH)`sv9q#bLBQ)ktPZ4Zy6|Vly%~_{VVbpkhuZFjLJZMy=p2Bj42F*=_(2YX7 z#&yP&`Y-guKWJwa_J($AwNZKc{4ufHl58NHWX*BuPAPs)O8G)pmO!J*cOYn!fT0(r zTsA2XTpJYLUIpX$!d&!r5_g;XmQm?-q4Bb{`IQDZ2Y>4 zrSzE!W$}(wS>Fu}a2*G8Sd1Tgm;bY_svQ!T<3u$p2|K%XsPKa)j5od260Kkm!cGdOiozLZH=Kc0qn_AOyB^h2( zauX`h3DL~E#YH0$|NRT6m`e}+4_wc;AN^h6g>tk`{SJ1?`-uceMh51BG!%=+&?!;mZ&O2 z9r|b9HrOf^bqN(7;;0t(vmcRtIEY{KKvZY6rJdn=es;r`7hch22amQ@VxEZpvZ){* znB3_8)s1-arj(&>DH(}Z!(vBPhj>4)7`m*9srNjrDXU0>%{NucS4ho73#Aso^ z68|4xtntv}EQSMsUPs?Q{Zz*_11ZJBDU0Ea?hM@NbavU3s5ahFCBZ)PcVOBcRAC=wFkRQm%=wdDA63HrmK8|PR zq>m}U#ke2VUEVW}m&JlXLmqTv-1A6&wK$t6#8C z`f&P$!6~FkC6jvo&L-nx9tEG1-27KpH|WrMjE;A1e!|_6d@Q}=&dmvof(m`yOPgwZ zo>vyzS5)JYK%L%mZwvTo6?`!o&g%@NKjH{5RQ0t9q5=}+w>n5Y8bplW%D0CN4>0b= zj2fP|>}52#6>!AxZ@H;yZm$4@mC>`=T464wq!#&eOgWCk7NSDSDtJtHG;0qXxlWfx z;GcfooQe>3WfbWd(dRVL!_T|*pf2PV|vN1vP2?>6!&m<>Eyz?gdw!n5|@5=hx5e*uy;}B z5O75Tgt3PE6R`(O+pfxM7lm(YXf#kRYu9r@=(t_;Atqj0%narHR0$VwZ3LKtHz$WU zR$gv1@g-XZ`#18JoRI}9+l)BI`Ch2NSR}PTEP|cigK9V4(!ux7x~YWzDsZEa0p?-y zX7#=|)|}_dsPjcm54XqNbt97{2s6CL*( z!s}03L7s_QuZ3S-2DkVm$v{oFtF!c=Ma>c)XjGE2cL~`HKzA-iK}WAgGd8vZ8K!F2 zlLY|t!z4()ZQO>lAU3u!TMu<>q{Z#-I9q2^QpLkgjXvrFsX?n($UDWo!?kaAA>I0{ z-n857B5TW+W`sT`Yd%mdTv!2DiKPCL3?*ZWeNn5dT7EjA1tHok0bAcR)H?r8$o>Q6 zYXyF`+AD#4YBnP$9QMq!j^HKt>eBd`Sh%$yb1(6qMJ)xJLh9>%Tq9!d;9YmZBA zhFlgx(hQltZ7}>^*ZZy}E$SW3fOCfey9>}%HEgDv$x_n;)>!-wYEaN=g1)2=sRK#&Y$;qk}ZHeM7Q4AKb-#5Hi>^ofvfYqE@zz49SY!4r8^61hPTpSbNRhy z*=Fz9#!j1I?ypJGdeAzL!=9g3u!!8DFr~o;3>--$5O1Gl2IYEL2Nu@(f`9&!V)n3+VX%Z5O{;r zNZ-DLzJhazgl{qA)b_lkkb9XJQ0A-oK;u*f0*Pm2K`fP`sb?*KvnU?+#t(6_{o{)| zW4ri6{;YCYpx?ciXuA+HOv-h~s{RMbP%}(;wF3kuTeCge(LjFU6C-KsY}Ka{<8mEU z@U_M4qbs)a@8e!{&p(%HL&ku)7%<}&_f#MJR@?Uo`xpgsMgz0u>0pz95hud{`#c`z z;A*|$a|**)mQi*qBnXfMv3W6;bVpROqFuYGrL=cL(lYB0d4`wMh@_l59m6`W(6STV z#8f-B3~K?he_KF-<4W=B%v~4#T>NyqAhTE4wSL5BBWZy;X>2psstA4==ZWeaAXC6_ zELj^NOn*N9c{)!iaREmXXxR1q^aiwwSRqpnL_dr8pu78=WNws81>F8LdV4d6u*_P# zjj5gjcYB)M^UU780Pg{E8Y3i$!KWRxHJ5cr2t3L`?|yc|Np0-|2kIa6opeLnV>2>? zffxurEhsoM7mb;7i6Oea=(n?fVa3)3Cn{X}Fl|sAZab}fq7;d4&S0r;gl=Q6 z(4Aewj-6y~&gfctQRij!w#sTRiswLwibuq?8y@DR4nsl`4=k!l*tWU1`&!eip>~I( z`Vvrw5m*jC3vh-9f=GJ6Co5k?hTW?k#cpJ@)cZFS7w4Lr2(33v(jH(;lJE;DVn8pQ z$>^&@z2dJs;^PA25xXH&>BeILOTFxUp`#neO$x2GXYYJAm4pJF90l@zXwa@7#20uV zD(V5VaPr-OMdc36vIOK;^BFmHPnCX}x)8A)`_`Y!L_mJvauD%?6AF*~Cmc%TZVXos zF*XM$_-Ovx^I1<9HfEj+^JtufMF>DE2zSSro7C=xDJUgPt8NG z&~r9}+Y&%C2fI;zcr}sinvX=!Q>VN&sZ77k%Jtd*^&(Y>ro7E>YRmn3*Y|~GesM04 zSgQp;f?CX)->R+l6z!1bm{Wby%%;3QDdeNqpRo?{Xjr#xLwvL~N6Mf47%HLVj{}E3 z))p@r9zXMw@WMjeFH>$iNQ37!09ZPsIps=@GAm?j#uu+HY%jlse|fUd-_?P<3Bz5j zMdX%HmMec4_%KJ7K@-l8?Q^#XCQ%0yp6Zt(4nZ=ZFripIlBFN+u<8gnWWRN;&J=2FqyTTJF+*N zU!eHFSv#<~%bV9o@rSAOp`8e^1s%%`RJk?Y&`#qlZ+^5RwY!>!3R2%AE)jq1r7+HkHSs_+dlpZ3&VbZ{h-NIe$nrZn<4A5#r*U)n0i5R)6I=|90yvl7 z{?2(4c4U#_;_@lT`Ye=1W>&rGsU*8H`}q6cMYJNauD|!x&Y`s30)M6svnPGTwKuUt zSBhd0loEg5>c)-Rgzc`E=RzY&RD0QZnJV>c`=oAIdUjGW62jjq;$Bflx2cT;NXMLC znF~4iqm&{D0834;#}(UU-(FFBlR^{WC` zIdI$^YB`pej#M@D&gmyfc|=q$)K|b>I|WVf5$v5gd}QI50gmqFP-_j_2^LA=jnrQ3 z5q6KYv8tP9p%kp<+}g661KIih+R565r!BMv%_6-yV#L@HsmofjUoRQNbx)% z$OWroWM9e@?$g(?Hds}d9}&%h_D3qAyw2!fbqs!=?Aj2+m^BvP!O-)MSMc)&n!c=o z^nBvhfy+_+BHlgQpR_;r#PEWpUcw(fY`N{$T?Ki&-x75ymIvKEx5VZ?g}muX&d>Sb z+F)eE&n3=-F1BwNj%m&`NUu^*!hL3c2CjBlaL8%Ey)Ijx{W*>&(=zyDW=VNi&za*a zPC$tz0@g-IO-0UH6$+ul&oE$27Diy4#T~yJM{!&4KNV^2^fVPeL@eunFxv!=bRGIVe2FZVx z<{3(1X*Ltu=^sK_uXlz%@3q!GFx7BWybUUbzP`X@c)DOB;U;OH>63)faq9p%8&RUE zaQp9T#4|*@bp?<6_|??9X2o4Ma{JFjh`AVq-^Qz7>`orp+{kzL5VTEA?5+pMhq0gH zKNVbDw$F{vOi2jXkZI!RCBl~8>?WvgHxC+1$pv^<)H#U|Kf)P_5Z`tQ&29e096a`weu6;jtG ziMytPwa#a#aX0-~Io*sF=+}_O5!D&C!}A-0{NuR3KM2ghiGFb=ppdWLsFbQb{~zr8FwL1n=j{rJ7?~5#Pe5RfZ21IEtzL-P<$XRD-X8_ zpL%TYioS19B}QL0Gn+}B2YMu0Q_g^>RkJA^uT2LGSKF5C@zbfLdWv@6fryBDVUZOZ z!`TdLT0<@Qgi@>)Njuu0O-SQ>75>OcP#3c0Mu>8ELco2moj*EHAm$R9JrPmc6}0NJ zarC!Wqm&n*OjoLMYPAHs@R?nzefbsLcw{|xxDr}3zmg|ho64NZp8CA%V4`t$Mkq!9 zk8GzoF_qOjekZo1h^;-JEnWTRbE*(s-srvTmT=%6y*!}@ zsyXV8fUFYGS7t7nU8hrI?@w89eJ+(q`}!kM?m-=QqC|X&-3#%e zR9NOv7aq%vMOdUy_e&FaWjO;M=(F8UJyXU87y#?(x5aFW=+C1hK6fW>>i~QH=Xqkc z-39UtKCb>Fa>iZC0c;h)p@&(t&?|`gDqD!ahF)D7D8tBuHHRU&n(J>FzM4EZ=ME>R zY4(_Y>+U0A!hT~B>7Y+Q6Cx!p!!LM3#r>$dL2@2AUYN1{Dao_RBpHlpuJJWxJN`at zUS(SkJ3lXAj2>%H1t2QAH8of6e&~aCJ)NAnM^X|&-oBTUAGzS+gyh-fZ96xC7R=~@ zsiY#486Fkd#)6zS8LAnP-tcB0|Kd;Mo~MHm88lnCErfgCO&lj1khnLNh%FTYYZ-K< zan~|po1HnSu!i3{m%Ab2%qgp;B9jCorUKuXO9-sF9D5X^h{N?bq_HhXl6OoVBPue~Ov%SHUzfC*H_S zv>%m;cyz_(%vX*g@0X`O$vi3MRE?jP4qF+nKZ=}x)+1ee?;Om&=z)bS-i6Mk-)U<@ z!fGV_p}VIxNlD^-d`ypInQVC*IxZ=*;s;7Ng-5YC@g8@%yHjr~W*Id{GFzX8oS~i` z7kw4A)#+G%*{7I~eU&j6@(K+ln+zcHKXA@vbzR*;3trrk3{5%)7tkIJLyZx~eW~9X-hfN{p_0#CB3mMb|HmH5{%72tCi9Tdba3-ZI6*C&QE=M5zs7E)T7j3X7Ig zk!}lTEldhZ>Qh`+6xv)SC2>`>?yS6zv5;$)*MiG!!obL7qO)}LE3I5Zgs5)YAM@`> z)h2~Boz6G#pIfd%+CA&@Q4oDHXxZB~e+OTeO}41{DP`S_iezi@pxO4hyPj0OkJh+4 zNKh(s>A1}cH^KM8mRebv5=>U_9r^94m$fSr?(O&#z&V(%?wGeQExx6jim&FB-w`k| z4j+>_p2pcM$m5Dgj5T>*CwQ%8Cxp^*p&5DQ(V^Cj+m9Dzu{bF>UeB3R-~~#)U(X);V639}X@u!ts*18MWjKFky<%PgM=a>t zubOC&Z9LK58nFj|+79V|*x!L}pXPL}i(~2bq;#H}=j84uYfoR9nVF2n{svV?{|H$D z8Wk*#ICVUQ;yE}}@4upT1Q5k;K|6R)YW-Gup`I^_{Yj=h(b+J=uj_(i^tgJ{dK+EV zW)XJ9>JnQkPCWziYYFv1KKjPJ|E{`5El2aB&bUap4jvWq(VutL9_675VbXm`Kz>^4 zeRt&>;Z&~n;cCcHB~|OHbLTT#p=GzmHiWOm4bq&2T&lYk>0mr{n1F6K-f((j!nCat zOHkxs94X1LEMc7xAXlw+<^@?$`E2IzBncw*IzUHz3GO!5bF+J*mWwKzX;*4boPQIbxxj3fnwbY;!*eGF z4#c>_$VZJwH@t^!X>1{gqujZCr|t~Bc1;9k>n+e>DtaV|cwlb_cq1XewiOfCGM1S22d|&5k2PdYs;lS8Y#wDW;#P3CuW#7v>57I^xqsw@y2?z87jbJ z$H6u8-fk&)duLEv6>;jQsU||9S9q3wRVav*gv=v8{q!NRqAv(Leb8}f@|<Kki+#kTd4+0Nk|kcKcL3r{lzW&wZ6Kgi~6f|5;aIGExxP^5D;3Lc4JMt8^s% zy4;k6rx9_#l=uvvbRU$V!WUTmLJ(#Co5dJ3A#@(`@#h_| z47@mLq2*W;Av~id&r5fJXcjcOr735*HeKE*fv(%_4Vurlum~jJlbMF~+!9@Q8C=4g zR)y5f1~RIhSGUeI5W4I=>hKkUmzJZyF)-Z2?>@zrqZ~FxM=TZ_{erm8n$tX+KpwZ$ znGPbZ$_lZ$&;kgC<6{`k3ertvd8#d)bsoS@2Z#oMS+vHjI@2K~W?(#9(b0U{k~yl&SiTTr^MaU?M+D7y3y*0P_+=PP+78M^1Vq?|MBnoaA|)Cj{4EA+k+N_ z?Jq#~A9eW)!l$>ERQ9-0YRTV1)&Kkk0{MMAo15DUJwFlpP8Txs6;~(-$`%|qHyUps z{bcIR;8FhqOr9MBfC_f3GoXA_XKlxP;Es+An*ROatvoP{g?H&wXW9BEbAe8;mEAy9 zmj2q@aj{-zI!=Koae0v z8DLS-&cCZR&c|f@E%Rkwm&I(i*kE1;8OUrmREFC;?&N&*IN$xnpzoE|o8Kgw-hgTi zYNd731gMbaSGJLm1%tmh$@%PCXnz9Eta)(#|6juV*MF+$oRryLe`y{5Z+lp)?ClLS zsQMnQ{A*eMpXmX;4>)hqQvbIz`tR2NkEqWU_)i~8^AFJVueSKVg9-j9%5Oy$Y=pVY zzuWsi13ayDZwJQ5@}^-`=0E@JU&k9b<=@5|2k6zc|#&KVSJ{PyD{7_OEBlxYkv31N@ zYIp`g@?c1i8S-K2@{IXp!C3e9w-3vy0;h^dHA1bN`3&csneJaL2;4gbL3{zQa-{l-;?gaiirgsL1Bo*VdXf@<>@&)5FIOR*bxLZb8!x7 zLQ017>aJG1poQdb9;T0dH?JZKKjG%zlg%!|=Sov^uW2&0mIYBv3(5v*8>lAQ!X&7S z(gKm^B!R6C4BA#WI}S3Ur6dkzC+raAl%kJaR%FUd`NP!~Gc#pk52H6j{W)-V79(mY zx93cR2nY^p$`!C1BF}5`bzo;@2k-qhLU_;0zY&#h`p&X9?*OS(G5o^KYQdfW_WGXs zSid)cj_u^2I|IF+FZY*(i`Dq4ho6Y;uAkaKO)k0W>AM7xQIb;gaCJXm*nxI|aVgEv z<8LYsyg(gRgQsUu2%>;q3(DJ|V=DV-o(Y$4xrDl?m2P^c2J*X#xpkXYbGWJ$Q+a{nn)H)|ITs! zJOGgk^D4hLn4`Wik`}1?h zgZp=buitaV_;JNc<`54y~EyS)`IJxA9MtFKuNxh2$5&CS>od;+!K zKn^ccX?7?;j+vWo7MmdDrcVx+`>e7VDSc;uUXtSw=JL@i)*D{#vc=^*q50r=)s@n} z^e)Z-tLuOZZGT0m^N@c|x=8rT1|t03;HxUhG;=u45JNJVpwx3bipdwa(tXp$UEU<66O8W+5>W))JX9zVVpQ-lTUDo9y}s! zTComW>tG_Rn&q7&h-EMtjfIk(4-X$&Dn8kjEkVS_=%bv^qh$)gXbyU5H#oL7mo2dn zuCdDqenV@~4W^N%mU%gf&ZGer4>rrX87)mLW2jkyOahPopS52q^_-j;~je(B1xPAhZ+ zf7m5Fc@?S1ppfMYqZl(BMS`az~CfXLKdm5C~F7$=!HxO;@pGXc zNWcHdZYlZ1d&&p?jeA$ELt1td$QOOM>G2Xhc4gc4?%NMrQ~5Pr@9-O~=Em(C!9kKv z3m~eyhNDiS*kuz%miMg+5n*cgz%vEO!+;?-CwEM0f+4a)p8K5^Zbj?il-ph+Abe~4 z<+IztgM!xyAMJRRDc9-BRCvQ$3sM^sMvsP4uAFRUM&CmfjiZdyc^yvEX1nwYEH%U}8;^dhsd`QWy6MYPfh63JK^?X2GDi zsyLHil4^&EXfiRDRrn1mdIS=&fe)1Ur4$8^(36M#A_oLaR7AI~7Fv~#)})MOcTfvo zinOmrZ`iWDn@TBj>*_6V)#mGHdPb$)&v^4>mgw2O?-vpx(7KbFHb$mIipX;5CtWpi zyh}a&Mo-5W$_ZDHq&6(#RD_Qv`KtqT8MvLx(b@drJfML+id0x}@8lG9SlP;arxfm! z#GmO9h%(CVMPdjp_hHC~5L=*vP~ zpqSXoogKaY?1q}aZ&jT!oa-tDjWuOVRqEd3{EohklF;=?G>Q9){!4SlR}=cEct`4t z>`!`oS==7=y>?ejH}exZp?F-XdF7-`qd82({c4aYbplYgLwy({7dN7D$YQvCodr`f z`J*#c@#!NY+p*-Qko={T}}vohp2MKkOPSkDm}vwPN+0Ce6S${af*FZ!KhJjEax<%!7(VaQ(Pj z@&x%m%+$#@C($=5r2@(vV3Ht}s2o)2z{W~EB9=~bj_=xsu(aV0&j$F58}Iqc1{hM; zb&Ydf09pZMQA#ps`WG|r)EU&|;(Ti?mDc%sCLVxrDnJR!7svda6iDr-!@hlb&;zEI z>DFU07M%G5o@5ouCmL_6^j-De_h3SwSMbkAd(IMu#ezU8aajPksS5k$5Tx5feAYyY z)^TUD%sCzrUWMPD$U)+E#O!xv5sDRk=z!zv;?Xg7G4FVCd+Y?Aotq8{?}*dEg+AK9ij@k%b@XIIMsH$J zGI*C9S-&_Z4|9i)2_jhP87z9o%S4jbc1*i4@{|%^rYYM>5SC7x-w!&$SX(1&2)i-7 zBcUJ?yuW6PIu;6*Adg{3i$pdKqsL$E>9i2;|bO13!EzAj4Ltm`#A@EKRd??Xb0qGzPuLF8lZrPz|+i;`M0QaGRHlW{M?P;hNM57mEJcz0PTR35t#eK z;zuKZrYAZW!%`-{qUOEl>GDDAFG9`31z5OGS}amSlxaIp$CprIvY)XB%KBMlXm>Ij zR)Yb2t~o9F!RuOA4BMv=$MfX6T6_FO^Z`ebMu>dW#_u!I{&QtS6aZk}dx>UwVJ&*U zizqpyYaJV5{~$qjaYXY=q~QiP$Mmyel3{80xH87XE$Z^*O!#OF`eBK}FOp4+27F=b z6*1&Fwfd;R3k@Up9OICqtNV5AdQQ%9Ncwns&eBb{;Btn&xyha*w~HP!OQv?$ySml( zA|$TW`GDMHu|{)BGzTGFA3kA^1KGy|9ku_TBmI+rEM7Mom_IxmlCC5pXlqzi2Q5&3 zP9cG8oFf$}qycDZcl`Z!=m{EZg!_S7 zm&Z;mXt4ejsuqIKLkZOj9jqR# zp%>+`+h9LYN1T#Yd*Z6eU zE0xyUhqH;uR^l3?wiZD%|9Lk(JybLx->=onJnp0YqwjEYFZBa;wne6#-Z7o=K^ ztf|Y}Isas+9jGU$D@pwZjGAGTfGPucAi#Q_Jx(|+ZFT}8G{pKTtp$Fry!8obf%Wn? zYe;{Ddd_E`L^uUmIa4+P@o5kzPj)R5Gozo>^o$76I+Jn`U0_?S;* z(3kMFGd-IxSYDFla$MCI6rF#-p#nT32EKs- z%ov*DU179&bWB)uybSlmcHepr?S94Y+{B(MICr(a-L2Wfg9E$6@{-*FUcZye<(87b zx6SEyiqhGNz^E9dS5HY1F*Cr}3fhFr;tjA+!;5`A6tA>)h2w2GT7d6XgI7kfgGEnt zAH`FI&~LP&{}zr_riZ==nh7XW2za}yt1&WYC<+D>(Q@G;U!ENK29p*Xvx8H_|4o9l zNEK?_N`zbln>54w=WGq?3AGan&Q{O{^b&OlOG)3L<^s}^$~N}-AFkK?s{!Q1%GYqi z=>Qju{XRTZ8c8`PVodtAO^vRn!7UNDgQGRkEn@Hc2jACEwXP}{v2b10K<7#5y%V|D z4xz4lWmLyp=I04rF9d4ar35osHH0LjH-`DEhGS6&to%I2tGydZ&F4tG)Nq5JgcL1Ly!KB30d2Hp zqYdq5Au>H7o_0dg%q~-*D=OKn;SH)f0Q2k=5@`zFrr3bXP{r;8OQ{`aZKUs*pJ?Cl z%k!%jLFgEhek!?_&u$T^h@2L_Guvp>lHPh>kQQ6(Uj=!rFq{(q&^lxVk#c~-BL;!+ zJ-Hae7q^ckJ7OM^u4FSBu`ewWFeSBH{`!-h{Ae%vxF_QSbOwNt2r6qp3h zv*j3x06FMRoXH*uHfh^^Q}pn;iO7t8M6t~Qjy?N+@w1#K&Tnqhq8l`CJ5u`hb}OI_ zP!K%yk)r5b8uXmt2kU9Rpj_)g3QyoMD*F@6gSzeE@^I8z8@a;|rSXcgNDKEk+UgHv z1U=l4iC1KbUB+1&+we18ZTkTj0VC{a+`~-dLyg0s*}T21AEQQwQoc4NF>N$slB&eMiVz_w{&y(E2|dDCKWbuWc1 znnSsOb-6U&aJ};8Bz7%Jak}J;{@zG~{&ACc4EfoDfL~0E>KAsSXtK(H<$=7M(cjkA zJvDa`F=SjdQK|MGL)q$L&9+EsX-SnOv>}f{P7Ig%6Za^v`uh+ic=w84ezXE?q*x3W z+NLCfjG9VRnw{Jd+)-Wdu@xT6+ir!=h6;>iF>q_X45K7jy-f$y!zeQ39U0rL3br=t zK|?TeXZ+nyZ>)v=e$SV@X;U>h==4VB!#u?PO@Hsi)d%X3HHBvFhs6wCo7$bf)ypYR zpnqu2xx_sJ9rk($XSUd>G1A`2AAM03)A=QySVNgO{EszfV${77Q})$o+-*OT9iWFG zQQgm&>|UedN$~CInWi;F4X!I4gnVa9-J{{9JHjnQ#_F*kijO6RJY8F?-D0&n7w1JJ z#$Hw-uM(A*Xo*hSaVWpwBl8tJgdv3K=o;_-4`J^Z9eMk0i+0E8*d10n9iwC0wr$() z*mlRZZ5x%Y*tYHD<~`%?J(dL-9zzXXJ8{kV zxs@nUG?9XtdTtnfGTXAjoa|A3rCd{l9FuwzTpjUQZ2@#yefKM@`6GfTXlt2^>+3;h zw%voR_bMs-^4#5l3D7czKBa-g`d+|u873>)ttH;g~QI7%w~3TYkGxPWuey}SSycaN_-qI7!U z)9t7h0teALv$o~KhP)qN@5>3WSu+i3_Hce=&~setP6AeEC)RhxWn^D8Ryx$lf?{pV z`m9~M5r7xG!HW(ku4|x}b!i%|$J*$7%#LPuPa?+k%iY8{t#h=(VIN2=5y{8%`eFJ{ z*U`f>YZEgxo2FmU&BP!WH_HS*Lif>jH%1#TKYM*626qDTQR(lr^-L7*-jViePjnSE zKe!-nZ?Duda3Fc!OzD0(xqYLd!SK55cikLh_(1&)utKD_@iyrSauh6?5|6g?k*mz0kJ!K@6zg!`64xR}ZY*%&a7KrLj!C+^3Icy&(Gswn{vZ0K z%@DqSu!m_>KX~d(XUI60Q~YTXU(Dac(Q`_9ol$U%#Xxxp7&G@8y|zFIq)4yJ9i(} z&uAnzJYZC)B`_8Y=u|o6$@|PdPv(vVq5O#AksbomudK>5Mx*Jf*VGVN+5YmYjw!%_ z#Xl{1p2e*=x zy!wrNMu*>}EqX>LI^~iDubL=LVkf`*QGR)JNnSPZw~`>x!Gpy^&C21yxF=!p)ddcQy4Ro6K$J) zc33cIB&68w?eyVFirA6~xBFS@0-^4vI`{%@?0!ayc+Qjd1IKw>6LDD$yB;Jfi2TX0 zk6@d}Jr#$QdQAKk0lr`@25E@c&$ff7_c_VdS32bKwjIqCUut@4a#-q>7kaIyo7B+{ z3$;ejV-I?xl?OYEL|eybqOOR>M!Ec0d!53r8jq5sNyEAHP5f2)4`5bE)LpF0y}wEY z0px9uCB7+9keD5DxJo6muM0eYa0dLNSzho$47E8a$L2F8-?c9*_iy7wJ5FM}l^#(* z81hJe71^aOo`fRT=Xb9l3FdL~S+CeVehzEGwjWL4ON7V|gA=0J522WfVKSFAWq5bA z_yizoSB=?GQ!0QDQRYjB)!eA1*FFV{ zIQ?=Gv9O@>(ggT`+-iGFq^sx~GvDL<)F%qcoa%Iwkm%z)G|K_hH;y$BH;1Kfhx zaaILYLcGDQI!Q7vr#qCyFjjFO{oLC?t8pHBOI~08^yAPV$DmBj8qsr!^Nr#IK6F{r z9GZpYwMIjGgLt;AzdFpxJ^sOFHJfd>y2rHW=vcACH_rVZX+=V)e-yS^>KRE)8hR2| zMimxzXM2i%a4ND`{OWC4L@%gL&!(J{VA@r;2N@>Yyk=@71Suv(A9r`EDb^j_2+QY~ z;aE%QcJzTN@8)-IP2v&^Ij5TT3DaPfzXzvX38@AZdtqC!8Js+Qc2t2IGdKq*r+T!V zq5Tm9D-iw0eZzPsCWnLTn|zdSL+)}WyP%|9XAXhi)kRU_DR1W3dkuJx>^_hU%&&`IlRs`*DbD)_8!7q|- zK(!qVkHQnLN!IzaPSoqM1YWW2`u8J_VM3-`DAj`wAVT=l60uBHRzJL`N$uS{xzDlb zI*{#5TFgFxL}T(V=EY=n<(Iccetul=PeX@B;MZWVOlKgqwL;?IU^Z~5mJMr|^?m;( zH6x?13mp2Y3yJ6VJ1)rWH6JO5U0t}Z*Vo@^e$w#(kZ8b$9t@J_yrmd^)e64qj@eqg zB!P=k_Ik`m%ByBQ=IU7Em?df0kypc3CnK~As=i7`wwU>!HYY!aS|^Fg=E8v$6Zr>J!-RCgcyawZxVG z`d+X!*qjXr@?QVya}M0+e?$l&3woXRE3wqGoWAo=opX{){Z%g^rk$lZ1TWhWSgSaL z&0!avlddyGk|*rpDH^UU^f@$UQb-J2m1CBAhn^~gtQHBPA6;h73!v79u+i}$I-;~E zJ5we{Tq@7Oamt47ciY+NzNd@D9ouZB;|Z~kZf@vV+~SJ7>MK8x<4_tZHI11TWDm38 z@Yf{hg#UX_e(rrMLvnIx{~Am%M9}EztqSd%gjuc9Qr50fj;LU%^Siax{nXPO+4r86 zZgU^{VlawzVXKML?XuLs1#Oe6%{>+Ovjc?VUUC*I%V`qm4#dF>VVsn;ZvSmrT9u24 zu;gJn>6+z%K-b{}HeTk|I>hplpn@tTvm%+k=jC#ivLV!X#@}ef2?NtVro;MKkB!Hxw|tl{(|Ui$4XB=+*|%V2(M1Spbo@dg2N*wp>Qfi&r$wxN(({^ zW>95P5~hrel+UGOyP*fgQAkUO8Ld$P`5V3Ye$ch-@P$j#K}^3g#H z&H-nIAit`DUdqL|>B}!XIAYWeZHlg3Rv)cvpZgz}HTy*nhPJ>-upL8VtL6EL1$!gL zNZ^!gVjp|9<%dym_dxO1IC@LP2*(kYjLTEd$20~ zFv~tRPhlbbRDewW;aYr;Ox2D8{cz1s$#2m8QDDI&qs9&+cKJqOS0LP#V-(qwUrNC} zTSH@b+^3>Lep4&BE%#_@siS&+g45&;dGW{XT78FV=x8&mYNZVZ=3V~ww3S0cTrF6B z5QcNj%%5}0<2w5Kj2r)R=+<<7ipL8Jd&`cNml#(N3YipK&yu`|MzGG~ zC%#R68WMK+yOl;?()qQ5E3$dMf=xw5Z|!tnp*Y!|kh;*K=#+UrAGeicaj zw+2mW(zhH0n_O)Z`r!A|Me4i!p-+d6$PaI?_(g=MU8nq3JjA|FX&B{sdHULGdH*X> zgvQ5B4_>l;x4*JwY${@PkVH33^ZZPC!ju&PW9G|J8vJPPdny*OlWGm(AaLH2LTL}` z3wUBn2MoVY8GYo#d%A2}zi>H3mm!%5z0)pr5wxk@VQIe@I*vnr#=wznrqG=o%+e{? z`qd*rgKINek?xJH={SJ{CvtUlI134S$XZn3g)wDkqVbPv+OEb^mG`mT$AgoPD&_(E zY<5RXtfBo{q4?LgVwvry3-qgE-xe&4L1Whta|ePF(?61Q%F%lCAnC=`XxWd4Zo%4) zi5{}?l4@$hhbnTOH|XxL=O&I|$}qst>DxKint|>d>pm+=b z-FPK3p{qgcH&6TT(jdswb8At@as#gvdIqLY#{N6CiP^1mUGF3o<;&sj2d+AK-;v_? zc%s36#Th4F*<=H3I#vMM*?{fG6e~;{V}mCmxaaZT=GMTE7gyh;9rgW=anrT``3TwF zeM-w+9+g#UbrNmrfLG^06`?<$_#b1!KAlXNH}n7_maUpY|RD_d)-ezmU)EW z>A{TkPIn-qy1h92WOPibI#_8T#KlXhe-c2sU-H8}XgYAEUsZ3?U)M!9-Ku0UC9hGqdH zhvt0jA*WWMXDLnY)!F zbV4>V#3LBK!&D94UC;7S5AO<{6}j)Hf=W?qtuVT1N-9l0L`RZleLwd!ro}}rBd%Vg z&7>qVKfXqv+45R6e)>tRan*0@c20U1H%!lLHi3s-Cc$ncdap<7bE8i~h#;4`s&pCC zP{ufJSV~Dn3R(=O-}&`{JM!C{KAex0?4C2?#1P^;ll9(%?L|!)(Nf7ee_{FG**v3L z?UvTRlVueYT!&+TPWyra>m)fm6ZK~VGqxDMvK?eHD@LvmR2EFHpa{1CMg!)DkBx~EeNARbuSwm zOm=^H4t2l`ilKc$!vo*~czs?bLMo0~gpaK~stY}#_W47l()Xp^{{n6aIYP_HA7cv1 z{JD+*Q7j}TC2@R1 zeesOPi$_IdkS$^#L!9Z)xcJy4wWB`G;2uXJ+H|1S?Ebfc=EkN&KWvnGFLI^faE*}f z5>zNa3hJ1dMeK5IAqZxQ?H2v_^pgU=hHjRK6^!dSfRV6|DIjN!lNnez(=x-x0a**T zR8hoE_`L?z{@i6fo`!7R7!|OyM_a_dR@RNty;j+>-BbMy+CgS(yu+U}!CdPvx^=J* zhl|m?#4`F9LUo#Ks+O)?jFCXEA+XQ&Bny1(?_9=;5<>4k;p2r3A?au(g&-o#flVqE zjgA>S9N|e#HGP#~2l71EmlV^c=329}xZH`|K{Md1IPtPe2 z4M~;B`I3B#K>-3)(ope9ftnfH5sAO^-w~U~W7k7sl1`bR(^cw!;vPz>W4#|b-WmqT zk^4_-n%dbr0YOY9NJBJ@c38FEd?b>=mlh2EWm{En#u;^L! z$Du5{8>4Z17MtE+DeZVMQ3F7EMlEt&JFFu*M=s$$sAZz31*`Vd7+tw0x+>w~a6Lcy zd-ckZ;7;tDx#bbEC!BdWJi?Ju3M31Oy@XNaHbA15}? zdeA4GhuauB+heKgZg`^)gzt~{F-ttnjuF?9+etiRtjp!@0YdDk0S+NeYCtl)x2@RL z>Wp}!bez+Q;6kclXA`8=*3O{Cw&0Da4TE{)%t19H*ddZS0O9J65mi=+b3{XAmuEI! z{NApz-;>U=#8zGip98%Q{aja~H0Sw2g3B)^;AgvKf-Ilz0{ya_&Rj7B@)#hc784V@pzA*Km(_*)#p3SUlDFlLckvY-HtUNH>&APzk)V%zrzN-} zme7L+?^CpkdOB{8X`La+DZ;mdkh7`g%39BhMJsUbYuGA58Tk9V>etRpwxt^0x4xTX ze7uHFdcvT2ebw}=RsFJh$&>e%znxCILH2DqfSi=OfL_;U&Kt%fY}3;BDxAB~aP@s9 zrQ7!7+Lg!nM5XZb*-~Q~E^{PyxNeQrAYS0=`+vfm|M$$P5rf6u>JZCejV1SG3n5Z% z=eLZOIJ#{z4&%;;Lt2xPNt(r#F52~fUy#kHt9?UD9&cP~fZ1EGSi79EtY}XUpkoiD zk6kZAsGAcvu>n}BS}*CTPxPKV_2V(9H=R25>pZStonFGzBwq}b;lwM8Okp5??YQx4 zr+<%i^^H@^uiZ)rb74!KR&6?7X z_03K~)VH82x7!`l(8%u50YQm*sizvg!yjeV-!0YG)M!Dw^h9zkWfT*!L04&8_Cwcfud~AkSF&{3j%0ld)i)iC z`ZG%?ve-YSCb2^_6xI)FXmBnv@ueu(dHTo8UM7mN3S!WnpGFr{j5u zjEah0mMR?1@;&<9c~&HUqPb-Fwgx$(pA;`c`QRZ)EI8rP0{rwxpX9Vqsa=*~A=*Fr z8!R3GPI9AWcTg_)cuZgn)CZNhKjS-S>}i^XzcyPo7~5;-vDmg2Ei~cdHRcO~yKJ`R ztMIT}ld*qk=nQHCcZK`dFHWfHp+Ts?YI=pH_1!2v)t>$2*HSHf$rX4cUTgQ&-v#?>RVZNxVB0KSnX>EMEcIV5w;YYg2nrZh zre_5y(JntX;-1}pUIv^=DVQfn_5-&Jms?0j&~U6WOiZsfzBTbqyB@U6!C^Hl*-p(1 zp2V$QKg{z$?r!f4=1AApfe6c`n93j7UXh&E8{BS{ z-!8jSDj2ec#ZKm@;EO}J+c}RAwvljFV*%;V71?cWbh7gWAgM8`@;-gO#!?r;qO7sM zz3a*a9;Q3AH_Bu^#oxDJ7ruTdqyDgrxMFwaLDjV1;{X^B7gAT_M2WUDl9HBPaRhQ1 z?-=f=h&wOd0J{yy2wE0I$W)i$)P>=(e!(r5ObkNZJ^RNa z!hA@@f>zfOQ7Rw=yskDSvS!uo9$R-_fU?ZBg7OONd<`mI;uD|LFR=%2tTJU4SM@C5 zWh*58nnmtoAOeQwBWx7Pw1Rz`6I&|SW<*eck^LEm_7|_jShUAlDko|GHVC9x) zBN~lYuWY%XmfNkju-Y|f;|rWr!*^ZD|Jb8qafr{y9%g$*zE;H?-(DB~((HVb_|dHt^Q{yb*gv@tmnqy6x! z*fu(Z=a;G8oh%=KKuejX%00reAn%9xO91bC1%hnxS#I`A&YIhr$qHM|ShyN_Ld0wC z#-BA}{^}oYJ97Ns{9k*RRN_6*nX!!IEAe&?C4$}b8YMc+k)m1^0JlP;qQ4Zk0H3&Yj-jGRz~>~uYRIG zZty+W#9+1p5KIv%Xbmm{|FJ}ujObAo^oX#K6i5(}BA}a8o}fxzZe0h1e&vr|pS2Bg zuAEO5*IZ#PuW1+*hsv(%!brBI+Pr9+Q&@{_X4guVn~&-chRe#uL-I(r(h5}LMBnBc z;;=bym{nUZds90TpoXr)jYq4}XVI*kI`7!ivBp>bJ0PSO;3Ug8ZTG&R6BVFdWJELjic4|V$N@hzxABgoFc3` zTF_aV7WMRd9MbIs9jvKT&c`SuulU^OuhmQ)AN6ymqiyOwMD!~{q@f7}-W_%F?z&BT zG>SDU3>#M3RPX=pSKQfXnB!2_DW=smu6^N;DNBn>vLdReNdiCPM@k72s{uYV+lv`5 zJ=@^aY!A_v8(^%9`;IuMMN2%-BWcv;>z#SyZ!*KWOJ>{i84k&ge1nk6iJ{1IInJ|v zr)qFoT%KGxeJAwn)`s?BwIXOxZqe>-WKSOR+rMK8641Hc?uyS!;DO=&VYVDDr-R3Y zijJ$WY_@U7`mhW%YFd&GFvmR|T9YPb!Lj_Fx;(JSuAE)RG=D(_eeA*=BGq(N)H8&j zc5XPS+ao=Ze1>y!YNn>k8KS){B042`TxVg6di@=#Y-7|(mF5t|W)6`%|98d9!u@ii zTGmIPw&{r~dSx^IYheJ0yJQmfUR;ZjLg$|zjtcqfvHV%V7`oDxzKV0m-=ijJ)x_?j|t_R)C5{0w=VHS}4br};0+x%EtS=(lc#(Le}+;?q#XKgG|#b_#+L$Y#P zlukBefWJRTv=>9cdrLmZS<^L)n12sRMb7f=vi zrnDdBQ_d+xC68h|$p&5Z$2jEAJ|)}foeckUcVS|8-WN8QHnxer%r1#gTk$*kO~W9U zgnbegm8YmgPpyYO)O54oYrIcp<(e**cmTg^fghWNafyeiv6tcLDZf%8eUvlWQ%b3R zP&sM+DF}M=3U*{+6cPDswpEG1y57wYr1zgePP2ef{i%}+%{muq$_TN-KxYqm4X?<5 z@5w`Z*pWjESaYa%QNU?D5esOMe}Yzgt51fXPQJ*2L8bPI@4K=MpY zieTc)txgVkpG%+)*Y>FPJo&p~Sr!hhJ{u(E+%f|+yJR?mI)7Vo`H4aO_&D4UYf1@h z2HrGMsvQET2f)JxJ1W~k5|TEHL_`G{^cVllmJ%akngVgwpg@D9Mtjs^w~fHdKf+Ry zKCv_gs?RM0Li8AN;3ZVG8d<8}sj>91cgwykDF@PR@X2LUk6<};^lq#_SSZcpx73If zlPY1!nPj=aWxD&FItl;>$S8i&;F^a*kEUvY@M!+rzx{pTzhQ6v7-*8f5jPkvIGyrN!K|1+Mabt0dxpa zSYaNx-BCB5!ridKUkNDV=}Uh&_Bc^ot=B>14Xg@)QOoMtrN;Dz_7t@<9GrZYaU9|O_0LO^8xaTY+Zy6jpC5mN9IHD$>?Wun&OGl7wVZfnJkT##V`Q|1)ANIcJeTZwAjl0ISI$*6*@doK*#yc^gm18mSi! zcf(J|G3K_~5KJy9jO#&x*K~LZ;q6L*G^BC$VyvmKpobKR;)tXh4|)#OZse3n^-j6X zU&ik#K>@aJvS8^3qn|E=&h#igwKSo7|9%KJEB*fY2IVJ0bS-;ojTUqtA-pwczKUCG}hX~R(Mie&R z%BK|u7j(AiOf|uHH~!%N@Oq}P3Q+_cjIT<;pTR&|=?uBBQ6*^l^Ni)W9OgICRpYN? zMIb>4k6DHo$D6E27v6_hU=)p8iz-CdNglZv#{h`!01!-tUNq{*sk-Nj()-p7W}SWT z=5tahGUMvL@!i~#=pVtxlE2g>f*M+LyV?6BEhX5h)Q4A!9xW>ZLM&fv*Ou1w37^xu z>$k%(sDEu~}8%G-&%U9aw35-wsN$*Iz_UYBa&eu-!3G2|KtnTazZQ^!D zubd|9;6fAf?AnI)f$Q#Jej7GX;#J*}q5`ZP=6?r;DguZqi%+mlxDnLgEplvOAHDMA zoV>7m+oTov&9eI(=&9~m+$XMikb8Cut^K{2iu)t~DYK$E~9I`)B3^|u=Urt|suQQRVT_scI)@od^vUiSj zgwa12)Z;LmJFRY$wzuD%%274_lw0)D(0K`EHzsb|sLijLyUbUazFr`)UQ`xOwv!j? zq=r=q>v#uAamD%XUx*k?fGB?bb-?BLOFZWp1glHkuMI`@P8RNu9gTtJk9C{q^q>b* zRL2`*+Bal0b+4mBor-}Pq?~)&Y-h36AuX%5+EsVt)cWf#Fw$bY+|yanNlhuIg53!BVVvr!_^{8(*G_u&{FfcLtjp&96ND zc0R_@NBITGQav?nabLegu3>eU$ASX?Ptb>)R2m@tBzVhpWWqShQ{{-Lw|bliS&@NC zS0r|?HH0eWscElaFWf5Rx3$I%bnHgOMkI=92(1)b5GKp;1;fx;I!0QF>*r_NwW6r4 zKj#-x7Iyc)O3&OohKEvzNTg(WO*sI$Z8I}k0UPW3nl|pfbabwg`LF*?KKvg**HVYl z(k5OMxvi^%d;L|zv6S3tx;7u32MdLW#!SsLdzSyux*A~2!N0O#UuGG!dRz7 zE#b6Fp`xI(P#ib@BxpJ3mZ}0jY%B~uefMe7b8bJBM-t(9)HrgbFg)t%A6P0!_A9h$ zVP2rv@Up2=ZJS6uUA%brWqAXY$F3*nn_nYr8)b%D&MC8%7$p4ozx9C7p3ldm6ua0h zzGnZs1?`#-uw?KlSzsrRAY8Zx!0lMy3A7hRKz8s_*DzYfw>xIZV%kNh!r^#Nx#$Fs zKuULi18um)Rkw40OCMxFeI|>{A#Lnno59_fRWn5U+DxkrwMCcRKYrZh7#UXh`{Kn; za`X{%eCF~_nd;t4Ei_1BN-7iR+PHRg{lxRTCWpP@xPFm^DpIsnT@E9HCB{CL-( z=WZzfi%O2oXVKd)3gX>?AZ9@KVh>oXNwMf@KL`b{nv2!aPLoOO`+ zd%t>jRXPc#PrI=<>BpLcM)YuWGm}iM{ePDPZu!Wukgkt(mz%RIyS*Fa2nO8${oemU zmR*vHZXT0%ZtP}a&BgpzA=;yf;V0(Qt?bFtMD=fgpydNmW%EFqLby?05j^NgKJEy9 zl?*N!IjLT~MK^S)(5#Up@@XA`JHrM{b4ZukgQ5| zLaEK&yS_#V#CYh@G-NT}8Zcbm!_H8kS9I*?5}Ko}FfOo`LgsPQR(cH;f)?yzf7Jx- z{klcHu?M0wBW+OHp4hZ*ahn68-;?^n9R|`962Za%^OL_Y6Xw5*4duilhS1H3wwY$a zcV!`7~u=41;!#Hdq|8_kW{Aa zA+%+PyODW>VT;2wJI1Nn#yVgrM~TUzc)|kGis+-QL2Mw@3ScOi_G^bLLlqiRA zqoj`NXueA)D^U}fNmfdJ_DyoFv_lW_F@M&Uy)rKArY*eW8!)RJBeNaX%_$e6t`%!z zdIs7x_!ZlA08;0sG}<3k1d59mb#5r(vWKF(AG)_5t9w^Fw86(0V!cr%|5CndG4hK2 zg_S5Nl~?7*hxNBIzF`vfP$)}Ocez?*s4;nJI#1f5b-xWlfE_1EvV2~%dY_i2{Q#A8 z-Gv)+Q>*870_KNuSiG-^oUwFddQj)N&{SGl^&c`qhnzn>Iprd8A|*q$pu4{siJN#1 zO5Bd}6~N zGPn598=cO%$)dY7(Ze=T<02-c5tYu0=YMb^KgC5fIUMOLEHh z*tNI_DtCt%Y7+f7$)6Savs3Q!e-ZZzG=oy#d4kRZWCnMj`t9%HT$M5e{$ZdciCRw; zfqdB`MI*ijURSB+>j(@}Qij_BxL+TJ$esT-h7SCNW>Bz_(-uOe1rQ zxsYK3k^Lo0R@AwDc2m-kCzi5~3nKy2wpsH+DIf$0_Xm2g*@G~wy_ zLwp*Zq~5vyOjk8x_~H_Rp)3r{BiuD3d~5nm zqaoR{NfWrKvHOeTONmOQ8iD%uf+7aYk_7w>qvf2|97x@4{q(iz_i;6AAZ|L}oH$8C zKD4pJ1QtXKZl>^Q?)|4%w5~veE@yu*&%%>4(-AhWKB;O?t3sBa48{{y zJbrnOJbQdKJ)2eS`dp{``%Lg^e&RE%-Q;n?QZ5yxemvsix%Kg`IsxrLykbrDzVX#^ zt?BQwYQ^=P)U$}CZ7#ClzZX|prT=8Q@RKw?%%8LIFr0&U>|Tq<#p6vEg@X5|jv*Bq z6D!rP)!B7Q0MphAD{(9+`IHDT4FfLV$(A0`v{HhmonYIeU(_!%Xjg)otGF`mhf|wz z*M=n{!&#quEZ^^WaSNYPV?7lDSGGZUK>P8Uwn4C zW!Pl9pzpcuS*-?Swmd!Xxx=bdKsJX8yHKe8Et{%Nh;>6FZ++uOrYe%+ZoNMPv?n8W zqMaDejL_JR8nQyT=J_G1uh#9?i;+yYWE4V0H%(_nTnY^^SnH|FyCy`P;o~(6-|Lk^S1^^5AKVrl7wlH7pL9{k(iEn;LCdD{Y)z{{_XFfxCly`U zov}KWA)D}Ps^CCiLhFKYD4Aj6K-nX9c|aCv^0t6Q6b?t60>Qfa$0!j_xMj3^O6WJN z!VK{a8)X2XBIrgO;KIY>uCpkJa5jJ_ozNr(`#@ZF8ZXc zSfvqSV)fE^a{A|}{q!k>(9lunXqh^}nx}v*ox`1~c7e~`#e-oY`#!oV_S{;mfs8Wv zKh<$sexIk?)4n+4PSZy}P%Iz_7y&Pc9ZL;n&%@V>LY75DQMyZF!?Pii zzW|gyW3vfDStUQMRy!xh)21_jCCh6<)Cb5`5d#Fpy(0$1EWTZh?s!SVGAEnG6_D%+ zbYyAKvO1^1J)?nY-72LQtPOxLRm5W|9KS4+{POlxo%7*U`tpK_JQS}15z%tKRkk_0 zLJK5D2umYB`qUpGE0kgcZvMn7i#IgWq^3(LGWrwLEs)?*zrrn%wNb z4L%sSg9VzE6i1T(O(czZoXQpCLh*A|ym}BoLDtC(haS&XB}666H1Cx|2s2&dgV2$y zQIIh}<=>R$X3{O4_2>4TI#NH4OV|@IUFUV3ieTDXyiby5R2s9lFUXKHEjTv-jTcnh zfC|7`COC#`Yr8=}1vFrlmBWUy|M&F=;Dl@^+ z%Mj);erqG!3ZYj^m*7-XDio7y_9he0#Ud3P90-_XR>Ug?X}R>}pYv;N)5p^B7sh0! z<;IqL_b$>%>f=W9(TLI-nCtWiY1oK;iA~2lCblzyt^cgyhN*(Kb6S2) z{lx+6X0x9SCqrDCKzSAMAa-tnF(Scuc0%8`6Y~^7yN9?aVp40_}V|_1AX2N!TKzbw8_6K+z_YH@{>a zgRH607h%pZ&_QH`z|=_rX44CjuJ zl}mw4NA9nFFL-2#+wFdwf1Fgje|B%`PiVp15K;U5Yq|Fi(RPqpGkT3_OM^(R_V^ug7 z^fNG4vOvP}w8CEd-G1NIB1!<564?sj0X1l+j7K4$LtXbA9ED1U$HB_54ix8Q=nQuQwbO;F4+$IIp97{8a z!(_m@XZ$HB;$sZr688k-r}bA3siPp7E|pcfp6GD|k!8srRSA=05&RtdfHx0=aO!&# zf<-kW)(vRL3MB4(M%SHihbjD)oN%Pj%Wx|QMR>v(6t4`3g;W1@ zB;n%*svo~|Igu;{$kR$XJr)t3s!=Us`Mv-rhw4?bCN+b2Dj!C=SqHGsXwBrxc+E}m zxA;*>3ZH{w-0Hr+p&VP!=UXJIo?7R{E}wrCWM9)D>X_N@LS`w8WII9*LQj;%zAv|> z2JOmV!Obrnv>^j*rDgV9(b@G&I;$gEdA(zk$Ww6GPH&ABkn|*@Qpy) zB5|gLkS>@61w<4Qh;Rn=s2W0aAJ^^A6B1ezCDm0YeGA+ zBJN!`N%h5vs%$+j{M*5E|iTNod#9HH1iJLWXU;u?W zTIs@q+K_hb5Y$)vif(8X!zkohS?@0U;Z$ZSjm93fzefdn8FZMH_3bOpQ@d{Uxt;0k zQ(Wc^3gEQ%C0!HG%0kgjs%Ml(ZH}ES$QqmBx*5OKDF2NG`-j)94*Lu#U9>-iWNgE| z7p@OUHz)bVH+X({6~cO-2?DsFAa!0F#gm{&xC0b2$!G} zIcXB9X^bILu13Hhau9{wwsE5G69Dq8!P2l{@J8qAz2awn**c1cyvoavsE^V77QVjp zt3gpGL7iTK#bCtBaQ@@D4K-R9KCsyY?jxT>mi|t=ybL45fCl2-IH9|ZWDo^ z6;OS^c|pV*h!6YB%I&lq&3oU${V;c6b^KV7G<~wJ>(Rrq&ZL)lvND2oj4YmL4pjfV zqh=)~hzX7MtF$;OY*BD9W^0~T*r6ilAOqxCp~+!8$J3n0LWq(+7Q^J8)If`uxQeF| zN9;+Tk~6%oxPom&Dh5xPA_|c%tw5@?T_}FjkvsV^6bbg(?AJ14(ZPf;C$v&3_OgCh zyWLQ+Bn6+p&4z>)@ZOs=mppPGq(W}fBF0!yqrPu|$R;6~p>XTY)i)&^-E7qszFp^%+}So7S1&>Ao6@;_ z17L~aEvzYFkh0k)RFe?S+0n~=5CaPtN<)HjSGV9Tw~m37ggH0##NLUlBXe8|ye-A& zq>CV=aT}Q3$VmYw)zsoBJ~vC+t6mq4xgU^t_ZxDx`%MwGL<*sB`u&jcaIAYyhl`xGDqm&GYW+HkfW8l0k$o7 zT?N|5j+Mv);tw2X`m_ltuzS$VX>8KSIgS=ym)=P;K*(tLve2I^E&Y7 z+k*k$yhHwI?+SZCvSZ2r!VLQ_Zu$SShtT8x54Y>SrS6l5rd0E#jsd+j9~owNkoVl3 zG@!c=$r{-#GFEjEJ;Co$N|3y`41p?U>T>lvHk7)Ypi4{PFQFi`&z-3ZWLTvz)s9Wc zMriNEtV2*onN|X}J*Jcgdu1J8a$WeRS#+DS&nwYRKR5%`E}DGio(?VisGu3G?nz{u3Gt;i~#2qc;`~qFp}eZ_*uCb3+^|A_D9<~wVEqcb8-E7ldEja$wm#6 zoc?QE&q`NEXpgZ!GmS$~>EP7$b^gJ8PGAzw5b@)8Nd&JcX8ZQfsGNd(tJq>MW`9|rC32aKl+svff+~9^M^7BE^J0E`KNd00@rus z`|ru&iuit;$}uGy-0_n5x@VDsAjefKax{~)h6Od{>F;?w@=27%Ie(b5bZo_TgGeEs z7TxPvCK?Q+J3IpRnyl)hEt~c4qa;5?#&U~SUn(Z-ac357xJ_~@lg_x6Oo{EchnO4J@M%;$yb9u6STa(xy zX8_e->1)IPLxuU@rv7@80zXpul6PMhHRD52b;O<7P(O zv}Dldim;K#p~uc6A5ap*a^|-86W_|(w360Sut;L?(Gh=8y`~_85>ZzYQ5oT4y!M#L|h{i@C|93J{@|Ci{Y=LmTpJTX;qNxY3^?NH>Dg4N6K4B_JIN2uOFw%+TFk z(%m5qLo-8zgrqbKF?4q~0?X&@*>iT!`F;0)c*pZR_rC7!Qa+YiRM2CX_Qn^L7}Eas z30GsPj>UHSjGW-xK**kxSW{t9{2n=4l4j795Y3OHcjUXb64EAux}hl5;e~;`?DRkq z{Sw+n%O(;%%d0Zyk`EaI*Ox&w(>xNlxB@Ipm$Kpg*0r->mphD-<==UC?G;BpA0Csa zDSj9v=+@9xD#cS~ZJLJEbp^gpz|3v?=xS;v$m-$ZoSca}lN2~VN$YYxoY39hp!H{g z_fbv4k0ps%z}AnQZ>q+GudbEcAvC>RP13)TvaM}__QXvS^jPph=3m#%$Ruus{cD=aPWSYnb>=pcVWtB z$~E(Y5@J^_BRV>=l1AzHn-n&t9re#Ab}VbiswVDSvDa~(<GuU99r6;meOAao8~I5{QB~&GB4_NU=1Suzmg#gf>vlznhQj!C z&XG5LrIF}ZVzK_L)=E;q)pCP3Bb+RRf;m;6xGojYs^Yp44B}ZoH}m8|8gwgOh`te> zUy9$ZeqK&}mYzlR!*V9^U&vQf16#<6y_v~c9A=DK$Yfd?e(;vW14w5_SS%^Oq^qLU zy~}+#hXJw-~#HT-}% zHiIaA+TqaRG1!VP@=iz*Sp69@{C#|1949`B^5e(~B8U1o)V()|mqDo*MTLjeL~EKD zJ{s41m2ds<*Uk^uw;05(b&xzX5GKbVX(n=8i>H%cV8p8FVnQlH?oK(7u<#c$GenHI zIHw{PR(ZjRcwF~4Kgu}{=#i=PRs-8v?ev30Tt{Fd@a6dWu9@~}3~k8=CS2;q9^qI7 z&x#k4V3T%NiGu}85L-9}E|~4hAa5aqu2;-1VtM9+K-SpeLsXo>s5QBHfE3O2QKDzpqiQnX-)&@^PpuV zHi!Da8gZuP{I)JC7@?@^uWwdZN=cwTt`G<7zdmkMlMMsiUqUDmPOq5}_CAhprVMIQ zVtzrZLG_s@9Rwn3@OgSaSe)q)3JF~mgCavB-KBE867R1PJ>MUzVHP|_3M(_2DWzTD zH-$-kl8Kd$bi+k*gh+Jf)A^>ZX0s~7zPp9lqFk7yVMW4aN4Jt=E*78-J|OtwdPL)} zx0^6fr=c#&0~=qQLNpT)5e-w?6|H^Y4NGC@FyFv@1p2JQ{H$qoG#PYk=bZwh9 zDH#@gm=n7#bRi~#MRGA6Y*^3|xAlsL3-4p|g9*(lfy3-@Ek0wsf0-`uiPk=y2hF;$ zZVLZ!ezqIC+ZjI#Xhi794@cN*etxhBwiE!^K)@)%sCe-QFU}k^t1CQ$s;Rwl^+<8A z-PkkMZuLkBhR-i!#Sdu-;)(3m#l3s&^kaj_X?DSN?foGF&ul~h^1Z)d2I zUx$o(6KLDqrGxeWfo6-&e4nDIR6->B-SwwXS1s)36kN*o=~%?*`i?oJEQwi=S9mlS}w4nwUt^g33(Xbl>@J%BtiQfwE| zeB;(`%*_$NQCjBccX7>hu#gJVVJ00@i#`QOde>cRc<}_6@cp?GE|$3|YWfinuH$N- z4XrW&BWznoY#>hQfqjAgYIr{?d4 zlmmdIe53yQ&&pjaoWE&e0S>7}`2F+InCc_)*i5i-+^wPX+}1`sd`1h0H7v;b-o1nH z`u=sCO1wU&UvbfA7GML!{!HyIPlm%>3c%j02A3?8Otg8hkGHN-hUV$H>nCA~iintg z>c)jVV_~1wI6fI`Mla;(AxI@#ls0pwLN|X>$p`+==kbu$zz=`4PC6ecH97&Ncp$%O zmnwZz@WCmVlhxJS_N3wF3Em02$L3Jv&TjJ50f)S1g%BMjK)(HNL&%WyizzF$)Go`L z0Poe;$q$n6W9&&*JLJg)0j6Hm2)m+qj7$pBtyirrS7045a9N}ADL@fsl1I)uM>2q- zeJ^fhF9JO%JbLcK6>Ct1H*ou~*}uw31H@O6vN_fhks{7cafihz9Pi1^r2C3_7|F+! z=P6Ho8(oaGTYnk;C}Z7nRIA4sPUQi#xDA9}|2UdnQ$aio*;cF-OYzE#4N+CxG)h9$ z!C%Kn*s{y&LuU+iG=4V8rEwr`M+;yN2b@~O+){-)3h<>See3)skMay5$A#ip4bZMN zZbgqJgsoGzmMN!~azLsd;&Zy8g-x{b+gspG*X);E&CW|~(Jsv|9c$+_YPH`iQwOy>lcI{Ey zl4zG=#3K7Zf>vP~dg~WVwBh5t#3pX&7vI_JhLk}DGn;e=hx@)k&-pS2= ziDpY@CQuP+o}W!!iKsC2BH1{@Jsp`VzOk(z`pfclDWjHt>=-H;OV#jKs#QHMx1ZUI z^{K5QYVaj-VT;D01W$3kim2rDB6_QCVQ?;CWKYg=nqhqAF&54BONHQl6&O0w+gBB=;$BU0d>2*`94d?8ewtE zb-q{{&?q!qwiyfQB244?N$W@c#lQn1wx*fc+ZFavfPZm@AV0`sVaT}VUVbLA; z@E^^*U#16Wi$#lbBFG?o<;_xtc=h=y9gl$ehZFt-Q{-K4wDy2scfYg`5a@~$y6?ko z$1S_e)qcx83Y^Ru*aALO^3#<=l&7?+a)pe`EOQ$dBaF%KCN(RQYqdz^8(M?NXbuF>Kw&905qMss}n_YeGHa5ZDl2cx}?BjVsth_ zvNZ%75DH^rmPJ8C8ksXjY=}r4b`5hi^<5Qb4l7F4Lbk&f1nO}a-Wk#O7872ZjDXL} zK26Airl831zOFDjBdI4P$#a;gwyu9uS+b2r@FE2{b*%)sZ-Ml06OW95-*Rep$c%N9fvFd2x1nRB;#ce$R&Bem4Vgs*XrYha>-La5Gl?GdNYC*Ej*62Q8Nx zCU&=24?tu?4R7Cdf`Vq9wN@6C7KKkUya2KJ+=bP8B44_1#gpO+YG{?J2GzvhoHNeq zG-@w?7|>}7%rPHG;y!!heu-@>F6Am1fo+j}#W9?`FevFw-iy^+G2k<{k%1KHACNcv z#iFD_OY(f*rvr&38W0uHg<~>-=h};R)A)3t3H~?GAaZt^s8vwF?6OI7N>2Botnu@Y zy2&z9;in-2uTat5CfDf4jg{NCoBVoO;&Kd0xD4cll>^R=-6bzRJx7ngY@VhqcFjcf zB8UmJi)MV{$M~1xi14K0*YQrv@3eA6uZrvtd-|r=kDO2AHfkPv0|TiZ%Q{Zqq!)?4 z9epY28iC z^kmsT#9g)(ihW6ge>h4iMO6n)w0QZPL43_R+fOYG83Om z7RzwKJg1aqa)_%3xxcDQp(TGj;Zf;5@>hkPS5O$@7)&^*+(q-05;VyxSY^;7z9e#sg^c zI;zp&3K|Xd$2~a-i z86=shWWkI})p);Fz;@#)y!JQGd1o>JdJOa{p~fx0ZiTj=TG*OlwYkt+w}rfY9o&Qo z{KvBl?KsQzdrSF0oC_}>otG2*o==2lQA~2N9(k7gOLMd@@h^MWuwnd|DcI-aaaNpA z^1VOoA^cByHD+16-H9>ql4R{GO^AHI5qxl;-OaIv+)NvJcoQ35Qnm*XxqDb?FmYpr z2RkafI;){G$NRUA9G6hzeEO4bAe_a_`pwVwCq7Co{B>UxGBq>BJmydKhlb{lvq_+% zzM~X7VAp!f%pmYCfFyk)jiQkSKEdgG;ZdQqzMQ{c(VDwp2lmme^m0M7C2j#<>GLl< zM1t`x@DGwPzQ)22_c)D{h4kvU(ej~S@|xpi@z$pt#qZV$SP`$ks&@GVv!!5V)4_+< zm0tyMPP3nrk0woPYo1V(@4er8K`=Aq(0> z?|n=1hn4@@bYjjLalCLGoKwnnQ-Jlvw>WY*-`vk#p}8tcF?_)k&12}5=lnzF`E^;P z-hBxy!Z0PocbscNyJ%YW*Wjf}=|~DqYwY~#@QaJ$r{roTl#d@&D~^7X6CL-|gexcR zI7%gCvcb%BRK)Bi9;h_;tqox+04emWy03u)FM;pNBtvbR>MLB zmoV7Wb+xD+-U&r$xWeWp-npH_f5+jR^bo#v<7ID}p1&MDa5zzI0A&KGSX_xXh&Akb z?upm+1h!8zpXU5LQB-4{(Z^Zrs2d=5^)C&6C0>5=xadjh-j&FWpB|%h1?nj7HYfi? zNW>4u#LG}uDYvxLx+`gmg^`fip+{++yACVPE-WNRi4BbL)5*~bEr+H2GY!MPlv2l& z2hm&+c5_}De#iy^d4D=N(2;C6yq;L>aNu$J$9pW_w;O9rE&?zM5e=8-ir&GNkVoMt zr1M=jd^~OhziyyOp;RF8GB)9SG$HI*dS!kq{Y7{oTx->j%1w@(#)0T6!n-k8(D|5P0?z7dYSk|Q268@ z_5SiBer=mA1zoQx#dR}`1*?x6ffi|vf=Y9jc)nIMri_c9D{HS#I#=pgh1e>th=9ku zwl0%RZ_^iU>iA-^8YXrHrmB&Ly;A7e&_Yb1?G{BB$ar94oya3D++wx1W;WmxqDBX{ zevMmjH*HL@#XX1~8HOliM)|k_`&i%L{y;YKKF1@S`X2HP{|aLAcKQ|@9e>cr>Ch`7 z=Z-g#am0?e(u*pik(Ta%%jKBj|E*W$^fYN?TFxiFo~h9%$&Aj8S0F9$j5^PCOl{a6V{2~bk~;s#t2ttH~+*}blWU8mr@zgjnJ#=hg3GEw%s zCdV&{W5w?g#7pb^f3g6G*+9Vdk6t(ZC-t6Gfgwb5W+A)cC;)CLvtd_Fk`OwW+4}6{ zia9vb^04p04!S&(4QJ&?-QBX~p_yiip@OB0Fd{Alf)}t!_M0T1RmDv5z&C#3#}XAU>o=hDjE zo*|wU>%?kY9uj55_;_%Ur-qJk-XGXv$4m>&7!U_?TC3FYlx>HG*N*dBpu4&$dEszE z*)JWorcjUpmDfwet~#!L5cQ>oUp2^h(YN87zy=@mfCt!OYW-ByIj^vEv z3Nwm>UFR6EHo&wEpUGIG%`3g?Y#P_9y=nRd#^=0|17#El0~sCM&uNnw*xE*GgJ@Mv zf6t2$r+JN6QdxySuFwER+Bnx`))gD9e&=%-x(+?4Y#Hre@Edk@N!kRrsYDqMf4g8+Hqj>t5XW+uqx~RH{Zcc(<2ER3 z<^frH9EZ=sJyeJ|_PMYkRy1;8@h6`_Q?aMVuN1;P;bP5RA59h6={!(bx2KtX=gAP& zP#6AXObu0yjpE+EiMaWEN!N37u?CET`uznU=ufQQoDP3ovs(|-_A4NDu*1=%yzq4| zJ>VSq)aOpH;+V3grzx7$`vJj*7|o=cE^0nJD6Cp8k{1iB`1P9jZ^kwd7^tj;ROoYS zFCGeTs>5F;y@&PnZBsLMYS`ppwgd+2$`7HP>WiLlI>lNWajmWoXSt6KjpIav1wClyA|Jk<{=m&$6&R@c z!Z5@aiW>p>nFd<5oUfD_#5>zHQ2O*0L{m@u)!dT7?4`K~g_Yno+M}ZVB}|Hj+y3BH zPq2m={>M>S+czJ^Ydy!wiW2m_HUPq>L8iBiJ73y-=m7vBpc;?*fz>^p((u~^N4|lL z`$JxCkNy=GS>;Yi0RA-1dF@%~0|~9N$cO3GOW8d}3~@2r6#Rewa(p$~a%0_}<6~Xl1ZgcqU!_Iz;S=f+O`GUz~djWZhiYO>TItb z;vE%^+;j^>{tPLnk8VbQW`>0#VW=j5nZv**{GC5D z3m%S&V^=KPyw7)Nr3Gu$FUTR@oB`3{%eu#~zLXJHF`tG5r+7TJW~S<)>oi8geUm^I*jc8#+JabzJKu zdc~^IWZP=qqV2`k57k(&`cO~CdWP4w0$+Bip!B?R_!_->zw6{@ttELg59n2tl zzM1qWI_t!I$r`F-Fur>er0=jY>HoXqv7pn8Rm-on8lmu9%CV5x9q4rd0Okr9^FM7q z!cLTPQ2n-1G*0()w0gFNz1+pZ96Q=(g@!;BOFoVIH!D898jo{6AoNx4$mU8Mxn|v= z@of-4N3O;>36?rK*K8K&OzFc`W3a^kKC3E*|0lqzmx#NUoHl0dt@<~OMk(SLkN6P& z6d5SaUO||HS#==E$kRd^t1@|vL9DN>(C@5B0x*ba>9m6z!&$V!KY8Q7B8z;CC6dJF zIqx}o3K1zvN7a7I#wcxz|E`yp(FwhPsGLrn*2sOy&&0jExbGA=(v`%cc1sv4S)M8# zZ)EQ7y%1Wv%#nP05rtC5VJg zyKnA}IgRxWPqprjR=(^$i*z(?O{*L!(a z>YS@bj0VL59#Xmd`wW{Gm9VKd$JU?6n4e(Ph84qW?)E~>PiDI{vE zmPmp6QInrndEZ)(_Y^6|aK-}Y&T2F^<>dejU`=N^yzHurelf9|mZGoCTEEd-d&}>v z70`%GcA0y5Ra?xuRDLGjm`@IVg_fV^gL9RKYXkW$H^k|Mb70$OI~y8AR`z+(3Z*sV zvx;#Wi;B3Z#0Jyd08#y>CT$xjyA#Qu@-sz>-!wQ%AN3rx@~!T0kTrU28l#5O&&x32 zufm_5_$JOw6Da~K+t_CX1e&O58uXYC%1qRF(k>U zsq~ZF;sV=6l&|w~N{8yRRY6}r?LiRrCzh29Y#J-06M|CPV`ohNtjRbj+L>Q}dH((ZV{FLCUeZi-f zwC@g1edof3f=&#lp)w(9!i>~Y{LcTyf1Q&2-&%#KTHWzBexDw-Mi73lnrYMMdm-zq zsgDo;hW*TgbRWQf`V0`R4*=a}ix3>!uGo4uY+4yrC9*LI8Kb-1s0cPNEqAX`_~$h- zf|&W@6`(eFC{RZnMTU|tEp_iB{cDCe{m6GJ22-^5_EI^u3TzBx<6j>RSHDUEdb_Ou z;}eG7N*%l>+12vgrZqjkEmPdsm>2k`a>ZXBm&=VEW`EPeOz;k+oMh<@3z4wl8IyoE?bWH_`60bBOK=_u7)MMcVOx}6MVmCb>iPegRY z{k^*m0hAZtHJviNL&b=HYa)SbheZ(J`5JM?RT1+8D)n0R5G zv3CAGr-T@2Ru8euk-Wm{wft^Np<1tF;hYy~?;`2d7wWC%W-{+F^>AEkN$u0M-&#VW zb9Q^W>nr?2II;-HTHYnHqx6{g$k-j>C$y!Lt*5<{mVxOpvp{QZaCV+_TNPtlu? z%fUO|<#*&%ffA;vu7v_+E~{|e!MWsW}KgD>IVRlD-n7Z{mAS8zKA0fDg?9nf3 z;n{{Q<8rNSdu8*JkeJc;nrYrX3i@gkbiNyhqB@TXUHtkHh ztdnM88Q}f-vblnB%s8HcrEt)b*>rpfD#3w%x#P069;Y}uP!fNWXF*#VH!3CHNt146UpZidu@ zevIodN_Wc^)~WtOTov#|dDtal@=B^o1UGJ{Zi7PViBOkaiO5N_h16!H_wh}10>4nw zWYp)VS3ne)llM>rT_ErXwpP~}5a#L0K3QrtIsBSw!}pnAM0D=1`a<4* zTb{7eNG#=ZyUO3ZACu0$kXc}-%`A_i{hwwBhSw(ercDg!UkHAG@IIUsv*uw2zF4!L zV~*Uy+d_E^mJ&s%ik#qh5j6+z=qg|RDwgprQ%bSIs^i+qK6L7qtEJmZho%7 z)NVaQ&(`JH!U)vY@|vu*lQN;*wvm?!A+E%ArLUSv0zt%g%)itWmpj#3YGkFSbzR0Zq9qMZm~m-KYtEXl%Y8C`fFjvO(Kx&Qt6!OE~M;qTqYD( z@DEXd`Ox?v&!si)Pp3VsM|L_b58^BdBG-MzwSEiK61wgaMR6k_XyAN7g{g6JKIzr) z4@>y+o!ZSj8_BYxwaM+Zt=Yv(7c^*iLpDOB@4NvLU}G2s`@x`7V^_cUVl zXo}WnH#+iH!B&D$1=n87xxbDt4XZU7&vO6fkDn6MWoR?F)TCzLBkz^Y0!Z8pPllAf z5lY;h7S7!zG4zwWxj2vJ`!@!=7abJrThe%Q~rpJT6&9eE1*xK#w=hL1hLP4tZ)Rg z8S_>1zY69vm%1)C=i=C!o>gR@Q6{|~rw)N^liW|%d+!oWN*~_e2V|YXBh2*lzF$=Z z-n8CxM_`y1#Kb^BtUE*v7aFL{`7mg$!75fx%aud$`;(Z;?SQ^G5{y8*w^=5MM&1jK zTWwe1IU7?}P2=7wFrcsAtkj@#G2m z^IrFC`wPh*#N%Sh1aF7&M`;gL1>3zZ9o_Ckk+jYes9e=Shgz7?-a`T9?E8_Q-r^VY zYq}59jrCdU*y@#jzBK&(*C#yHL%6h~yDmhD)zu#VqaDWHs>ujFHIXWj$js|M?tY=` z3Taqm1ow6y#pf9SyMzi&a@D|(geE!vi%$Bti!YZpLY<9jm!3hZNdwUFq=DpBIFe(+ zMScP!)Z@OY;m2t0TR=u+Vo!zIwa~(Y=9ToKHg&<5A4q<)SK?dH#nN(Tuu1A@cD|d* zqxof%DE^!_rwwqQar{iLfYWx|qiMYrg`8w}5%#!`YkGz}fv)EDG2> z5?617d$H*LH)v3m@nJ8W3WYZvI z1?gVfFoQm9Ge&YBQ@v@I4rbI?tJ5MTW_%rn?VXV4wa%abEo)cu4RekcKSI`;*ig-T zxK~<4vNziL6b8aIm5zMl3r^{HpX^0~i}I!^UO&+tO%Aa+s69L=g7euCJ))z$Q(M23 zm*Ie1z0J!R8Qnm_!AYZ@2P)qBD{_3ZXhO7K>*e{q#_2+Gb*MMYxhIYUTxuDxd2QT_#Ig?D zd}sC^buzR{Vs_8Wp~N%E&T#y9`e}@TP|A11rXZ3?NK_feRgP|x{BjDLv)Wdl6Z_&>_PG8C^SRs~;uBtq98 z`9ZMuadNX?JEfDaIo&uaye))TJ(XATLgseuLA&F!=K)E=kP!Mht6AoIR+79Zy$g9#E}SP zE3Lp}lybLLpUI+CxFEu~z~|#(OixaA`FI(%&FAu6>7ZfL%U*oZfe{|zp{T;hnN$%i zHmObyz3Z|l$ZK_OWKpO;!bjUBC*~7LX+)_=<&5iSoMcl z^*Vp+e*p|KJ5z}@_^@9GD2oQ?g4m8NhFn26NWx7Id6X+b$ycd4J={c{ozTE&QNQUJ z$~hpj@?m4x(|lN^os-z64Cy(tDoLnG&PMM7+3Why<{ATQWi~40TH3%;`Cot63U~0C z9UFOhfMcT9Sx0_*aX3dA{%kgl0bW(mtJ}bi=f@kZ^6*?sv!6-nbHdij&t0?Nn~gAg z54vF^ZRJUc-Vo36H-R5nMc%ft5OBp6ntd&$>6fx@Ig4BTvJxKLjT4D3%)DS!zUY|& zM_U)h4;+8)E!7Kr!@%EbM5EChhC-o+}dje6@%z#doWuezY4S2}mKUKXNmaZIx;Y5cEkV(Gs=Y<}LPI zQbRM%4}IgI*xQ)cGNPft-wD3<8K3JfA8<`}gEEHJ#I+H1vCra?#`_h9@upA@F+Qz~ zk@boHC4R2-pk-;;zMT|~t39x7`-3S$bp7yr$Tl%w)o%SEs1of2KX54lmp_`>&9#GSf~lQ(CY06kAl z3jILd*4u_GEC~aJD;~vq^YNGHra|sk0$!>N9X9Q(zOv;Tt@oFOitmk?4vw%pD$_U5 zy-haIZsz_nEs_Puqw+K1__0a^^Bn8)a)eY27`-i{5(PyYs|;+qv7U}!`=_o$;f`(0 z)YVvKyc*EoR`AE?!*;YdgL#(~kB&J(ezIBuOME6vTtUgvPl*XH1z#VSwRsumfp*}d z6rkqT(pAcE6%@!mV>1hdxoK(`3}G@Q%MD`FF>VhcAseBliI0Ba7uw-GI`KR9S~BD( zOY3`;hV<#?^~%k1>)N8zGrzOXv)6KSl!n`h8eBkw?3p(<7-svpv1-kM-|76F6^}OR zJ$C{XL)h)ljxLF(v9FLubMnS!?o3^ZX+$Z%@3e8k*fUGmmIdi2?Zuf=_HNco%eb`b z9_e#U{D9k+*xCPcB#`~of3X3;adWyii;Z>?HQ_mNKchg%4DPhRCE?jMv6eAdTM5W* zsc|@_(|O3?w&2~F9?}`NDzx598F9K=NbJR2*(`bdwT3phZ76bxP#(jpc4O^GLv#wv zeC_btSi<3BF68~v4Zn+!e)6Zc0lbg5 z`!7Z$dL9i1og7M8xSh61UOMza`rgsGKkb>vc8mZB&yT?V5E?H4Gxym-Rd8ofErQn%Q(KJltz~j^)EfeL3%3R zOCYlCS$zqzG=rJ`JCkvPA^CEu<2`ZGQDjXTMQ(XPXx~ zPOJU;Lt~W?rIv0g(owQmqLv8WkFAllxt`Sgw!8;q*A|M7C)q1E2U4` z&4VT)D<0T&DH@OYDDnjC;T)fDviNF|)YdjSIw>h@re(C9s?9Ubpt#&b%r)36E9T_6 zZOni9mY;r$#Yk2>sjSRcdSzd_FPp{{|QE@y_Y(&IR?WZWcLgc9yH>nYs)pj`p(&K~>iPh1aV zo1!b>1fg@SIIc3M$_w1?e4mpSZro9?$T>DLE$um9T7nlM^YU?Y#Uv*^A#rVgpelV| zU>qcq$;}7IuA`tB4z!Wo8~z7m{xLLM+{8X37+u|29>%L-6?}6d5zD?fvoq_%F~($# zTwfw&HD5-MNlsq-`B+a?RhRsSwrHPmX@9QYGHA?rW&C>!np8!}|K>MZG5*VADp)4@ zNNy^Hb=Cfl_fKtE%f1#HCxDOfBw1vefmk%PW*s(;(mV)bQjG&w z>QJDI-cvTX0KGf|dILaQI@53dZPNV^iN!G@K`o&)Y%{yW`XM29H!*4QTT(ZsBb>Wl zE7*ekg{y|c;Zf8M-uvsEEl7szZx&gmiwB~;h@w!DYo(UxTC!s>Ac?~+12kXE=X0!o zfvvJr-;|{hhXYw>RM>_I9qNvW1>cMQN%=JrRlwCz?bJ~A3YRWhN|gA8-QPQOpJ7sR z5Zb~Xvndf4az$v)j-7?oVA>M=j`mzS&w-fuX9#6JBKyPLk$!muB0udSYqzcw_ZFYx z>2WyG&toF>+CP(Ys7>nH;*;qhz~!Xf9dC4wUO%PHlcrIa5t%rqh?-%qJ~XEU6$Yg_ z8P2XJyV$Sj4Gxxbzu&YrO2&y|yP?Zn^1*)UvXrfGwYeb;ugOY2JJR1^59+I|q_Cd{ zZKYtyahu^tpi@=OS@jf-9KS-e9R^Cz?Md3d=H=B7D~Dad=6Va+>Pvp-q!@ktNx*I( zT=@PLo&H2q~jT)DZZ7YNJdEUKi$6X`L{g>qFiBGaW=MS&! z6W+mtitm}}Xc>4hSnQ#fqx^2;w%g38gOywItk}5cp=jan>`i}U7DoXhZa=|zD0b7d z)lq5X79uWETJ3X?2K7GJ7)bU`ij_-eQg|>~M>oHetcOO__i^|vzwE4w+rgsoj%6|3 zyt@UZY+-XG?mT%qCdeVRy?Jy#)=epoUy7>kCWTT&IZOH{Kig25&eoPFHW`%jt(EDb z1#2kl_Uyi4)qCGl`B!N2_m52dD3ukfbTX)(HF{g9z^d!0j0cZNRr5%(JL|6sc`S@e zK9Y4oZyWyeVkM$S)i_RScrBTo$nHju56L@uo+-HdewMjXwnS<#yMdp!IPGkoz67?Y;|S!69H~0KqzgX=)Y7XKytJVlCu%LibZVJeWw`RqsiT&nB-u zUsLN4Ev#4ZQ|Em*6KZawS1PmJhzQ_uA1HG17Z@rGYQ33| zg+S{^gj$4X8fk=j0bjO96&*^~Z=*)UaV<}avcX+wE|yrL?c@*wzv(w(pzjJ16a-(9 zT#zQx!GXJ*^fzzmy36A%~6w(RAvq7b@ zOvG_bV|*w11n31LSX0-{;4;det)kmW(G3Y8)-+=G5mJPEM{L-e(=lPL^R@57z$UL8 zF@L$aT1}$HN|O_Lv8$d^P+qoFfOmlxe)Hh%@1H{e^PpM96b^388cUvq+Em=cBPHCgUxyW-pvnC~;3KiE z`gCTg1qV3^p>v6Hsgh5ZNZ2J`wRJ6?&vwssUt=sHz5dM#2EcY*SY)*ab(`^{- zo&wxIq&$3s>}h4EPxf&90PX1SC-5E!3Ko8-Y;Ps)*3+e(_AmN3Wq2PNO_5cn_At8k zS9UA8APOB92-cJX zA`ztWKEMfEJs_1J5fbZR>e}$TU_h z9{9?vsVVc#eDkB7mabPO-!gOrE@B_HB~(N5?r$3|*X=(y$l2}3hx6ylYKQn~V9~K6 z>}k!bvZXkpDDa-tUi7-nkmj4yn}c0_pd?rp5`t4-^0fLB{y2dK1|Iu*uiX6dv{I=# zFHu(40fwgToUsJyB{a$5YwvEDnJQTuv;!$@2S0a4a2vY4x9o^227WwHK7m!jZ{~Ar z?7VLb5px%u3z|<`oQQ|#2R{?(e_M?!9ifxxxm_za^J=b_XomFxC%&0?_R}rL^X9q# z7L}cHkeqU&e<`>oh~wQYL6D_JP_LYteli|D@e$+twf9uMtWLweCm%^@> zoE;`JJUvmm_kSEz$?pnVUN{?#;FMsh3Af)FGnsz*BYS@`Gw_#@Jd0Sx>@dNLW*&fn z9M&fc(>?8n;rNdayPS`)8vd7dHqy^LvUgbxc2BvTp!r0!N=NV4B^rBcC|HgSGX4KA z2J-*Q2)kkZhi1u$=qDmD7jd)tj(!Vpd@YW(7cd7_Y|*N5J6e1j?=p2Y9$->7iVuTc zNlA{7!2t-7lTI{8l7yc<^XG9>zfz<#b`fO+O{JoXs((+*eL1|)v3fA8aLTWTaz*T9 zbHTNt*RMU!P?i2+S8l&2>R-ni-_|o`j_Q%X(<{kW*{e?W;5|6U1AWv3|&yl60mf_ zDS!uW?GFU-Tp#*9iHgSmbZ1Pfi*VXm&7!G;SJhqfWdi`{>0)6s72a3Be)6765=^lF zblF}@#ntg>7#tP*N$jOdlqMJ{4!$>fJ!yZ=CM9NetEcvd%(EVL6i^9gn4GUK218ii zDTECree+t(6?lTRmk@Tdm?4u7jIVY}_EN>z=!^iwd^2%!1nuhaa?2tH5ud7Tq`zS8#LNnNP|m6AQRZubHd@KwndW{-Ih>$=#<#=S zq_HM{&#J{Lj5{R$O7zU{9S23@Uc8F1$9`Tm>&^U~LdB!~7|^vp6jyhub?QtP)mpwu zTrw@wCJ#pQ@3#tXrN6#LD@7Cz*x|Y>9gETx?ljjK8q8a-3DNrn8^2e6f zG4=oXzT(-sLr=YZst<^4NOvI?hd#VtCF7OP<%8E)%_2eWOCPO6^O{Xn4WS7>k7sgr zlmvpqSJ%20%%&$@m2gq*hIpRpx%`!9_2I?m_I4r`}sXjF~%&Hk|K>ht{##4t*18TCVyvX;5$;(1fGj?*kX+|@4e=%rxHdkeQ- z$4QU-|7Z3_`)~FR>c}Y}qNzna9TY}i^Rd`|`$GM&qG@bbXc-F?(AIqms}RRqFL3$9 zZ>^6%^?1&YW33fD{a3;_BG>+9W2{%Q*=Y9IU>U|$)DrAJI7kj0$*Gz<>kOR4&y7#y zH;NJL(eHf|p3}N=Ay8<6>&8Mi`{EEJ2hG5)0Eqi6#Z3#gF{Df)PTaZqCC?+uXc~>- zx^ZWJR?WE4TvZ@BFae zErrdnH0rsuy(zKaJhy4=b1xcg>PO~ABz&PXSKXZy4pvB!9`n->b0+BWGzo`N7%Sof zVd-DNq^*3|`$kfF=nQsz%h{F?T{8ErI-P;$=Ae_VX^#qr?F z7t2!h*FKBpNKz&k-M%oW$4Mkc-8hx?UE;w^RqnPs6n3jF~ zD{Tqy)U?8Yit~Wc%%a;4*@1iWyiAG1tfTv!qvbq>AeU7ECw0G32l`HEh$uOElYWUZ z&Cs|*o6G3&!+@mi8oMSZsh(w2R1{)b1y_1W*hE0rh=;+h!W9Cwl{BIS<|d=Nn@ekS|S#G9V+zNQvK z&W_C%jaDmcFYZwmSNBElT3wJY&g6QD);dXR>H_2??bUyFZ#f{P;}Ha4!0n)dY*6O@ z5{R*C)rXc--$3bF)6rXedG-}q?EI^fyS!{+Q5&8yQA_5WdzQL<$@olD(D1H-?`er( zuq)X+>BMM}TZ2x-{j!so-RnKB|n2(oB$*u1k_tGcc>eN4O29sSrG zFFB{s54Daw*4b(!D@t=%J&S> zuR(njBeV=<-?~kN;fw5)fPN;$v&EX|&a+7KPSlOZT0G~U2d$2yy12`3~zLTNG%^N@jJ`}c%RNB@-bzSGSqjisxt81*$VPza^ zrz=0GBmZ|hk}k!6FTOdNun1CpT>p;ELCnat)AJ!U;xHsZB<#=jDyiIJKHKKGHhSb2 zGh6>v+do?}JE0t2muj)=uM6jOG>j{;95O1`zmdyGRiTzuK2d9&srRH z?w{0KcGM$el*SgGN@8{w<;5U`Ht#2K0?`OHvI=fV;#p1pVBJ3GqorS@KUXF9ESF!u zGrTQU%nkVdr%0a4Z-Md=2);TZKP>RuAcDWb5D7KEN_~3Fots{Tj3h~^M(ieinqxqx zx~nD@+_+>$8F{I*a>(rAa((C%6~3R8Cl?kr?Kc$c?@D{~BHH!@BymR26elG)eQp}U zY<pSDI21)s9eT-U30>Ebj9R^Gf~L(k`Rhu}o4?ipuxg`LotnG}cev7$VOwgR*^ z?rjeiTNbDuHy12$!)?KoHJT5|C4ll+CzkOeby|CnTYg+mok6G%Z) z+89OONq~lOMqHhA*VFF=7fU{$)r*Nck1pRHV^Ju0PR5)FM@wJH?QA=I)wX?a@QLGk{}c#k6#a39)zAB%s|*?Z?_ zTf3d}Ve#8brq9WxvVa*05ugej*nET9lUc4WH0QA%kOn+iw(EWV)7yNtl%*Jp0mgsr zuLazZ2;R28?OATlLSV%G7+R^pKQ^b8^=z7e%Vr(|&t-y7_-x?xxsaBCJC)B0BRcI| zP9>^9Q@b$HJ=aQZvPh`1qC{StvEDD}h6NG#{K@NG&&JOmI91;?n|oh&giVf@=o8{B zViDO&YzgCOWO*zwx7Lgr?`d=Y5!Ugvece;N`ZV}ehou_#Z5%*lfLhBEt4?@s19sobx%S#lP3HU^WOYP0Z?=m8tH9!p8R_fwPp_DcqDAsemf z{SHeb$8>gksMG?i?s{p={=3-&7$gG8fN1uPl5shqX=&|AQJYe1XyldRu&oNi^8qocnDSu=3H0LMlg+44FVYD__V~Na_#yM!7lkD zw|O-gFt=8^) zPC;$$l{b8y#;HhU4#0`pw!D)1(iuXC7%AH%Y zw5X51eiuRAIO*i(P|>`Y56ZyScF9L?tm8B08rNvJNRIZU_%J^Ny!sb7 zpObyzKYbMqQbT#otqU36+3h7_u&B@S=s&oc?sSMlJ19{B>#!TR@ks{*K>Jw?>kbY;?OM(g$dJNRU zE};|)rq}jHmkH{wn|kST8tmJ7%n~f3w-XWO_HKIhz53+-h9nHl4qgfx~ zQ1RBi$0@`CmD*Vd%UAtB&F{ijoCfDj);2XVgEjY(behA^#z-?wC#{EW_0i!K)0-lWzG zJ+Fe=_Szp`kO^i^EurWO-mafN|HGskNg0Xkkt^zDg@_oL?280*0|EVR0EJ$~<2HTz z>HnLAc7Rfsfq_y2FV=pcj3b9X87VYngkpwVDKlQw8Z($t+6!wS2O^PCCEo8JHbPC) z=3D&GErYH@CJ%33{OOW)MOHo~4St>SsEm%Z`%gUWvGi4xU9Cvg2wXJyh^0VxF)9n$ zo}EEoqNU@;W_s%Qri&tNOGy;gPooB|=#ysuAEp=sr2+&s4Z5q)PF>b|O4Xzi)d;92 zHFn)1_X!O*Zu);l`w92abQE#qQ7b^N}1 zB#wEW#PR?}MtPl-@vR05s>bgQF=JL$GT|~4O~PTdM=FzJmF`yuKy)uXIwVndI21GM zJfZP&GIb>~vg?kt97fTaAJ4OuN@sq|Sk>+*YG-os`-xPQJH&1DwU3SA<75wUsrtT! zkd?GK^z4PQX=0WmAYQxUm7CbLx_|Rc zc=SaR8r9U z;RIRqw-#3~^{2t+hoX8m9#KuxYKv=8zC~x?JWZ=Q@%-_1GU=R#UpVCAjz$NC>*qXc z)mTb6$9$oiVM8eT4)&UvV6Au(7XnwbLsj1Ev;Y>X-Ltj7g8IqC+vR!Hb7ilE?H+Ai zFx#>`3Cr!KM~=x(kUlr}Be6sZ_Js}qsqSYcfuVoF0MET)2Ve&rQxFeu-LS^%(0#F0 z$3|0hA~9#Eg9e-)Ws4BJBrd#_*yw&zQW(?kOTKt?A*NrL8Z4WIGCBX2g_%+g{Y3D% z%off5td^A{02;+k(5Dz04Nk68!5h7{tc|CH6jG81rPt!kNaFo&dm*R0UE0Qj8ICvb z3^$=LfP5E2CIE#K=apkes~OjhneLfpU(}QdZSQIhjG6>(N6z5Y%1b0%Xsk(i>X8S+ zs>6#>YqKAHQ65!Y&2lkldvj-AqievY{xjM_F2&^~@-yvPz(6!Z%r}GQ`|>&hl4vQ; zO|43U?_^+asET1k`iBEYJ8zVCL<~lOk&Alc zE1#)g#TMGPGbo0{m{5C~7kAd*>-D17aD~v2Viv3$tCYBlW&xQ+_`rYlAZ%u1$54qJ z)kfV5F3QW%0_F^9upqL3kBsk}j@-T#N1Rk3wLghj*PixtJq9#K0Z6_OWXQ$%2_R$% z&O~W}Awbk`NChHI$g*byPr;OSG4yd)rCQ#>D_=B|^Je91R4JiCi;wYt5e_R`-;L4} z%ogmUGDcvXb@Wk@T*;kM0}!A+EeH8f!-YT<;4^vlS%^&9680<6+@X9!de@d_1*(65Noh8$&{<(Up;=F(U8rMh9;WPQkY31 zG*3~O+6F#y?ibsDcsSc;KJNPY21f~VNPpej1gh)m0vQDi{!Pj57(@B4j;K7*c0$}{ zgkfhg4zfbRiDkBx43Ea7Js?$;e2^4N7)ePEjl_KTG@C3cs!Y10Y^|?Uf=Puv^Hv-- zviTevnW-_E4g4R=9HWA+ ziVE5Rwcq^p9ZGUE)p@QJA+TYXkSY06M%`_4@kcqHGfBo6WTi~VOWAE3Vv5G`0^=Zk zsoieB3;Z_YGPfhDC%K|qXqR^eM#aiXK9o~ggw`&jjP)=H9?L2^UlYGEo>CBRd~Y-< zp)%eKH-Q9E7nYi@-9iXY)ypOZT2={I{zP$ID3y+=6m%?vsu?HW5dK7T#oxpZOj1Yn zqhC!7_u62lCu9DBzeDV+Sy?xBAv+EeD4vL?oTupQCH&|gUusKCAELUD^e(X7uTJoeFQXWr7ms#qeoGl z=ROjh%f(zieuDrni&UI4XDfRZ5;pq~iiepU8kqY}!hewP9HFU55R?*U^)_GZ{4>cdFOnkHnG@J(Nt~WrM0V*OBC$2!pN=2SQ{l zbv9L`-X3OZT=%v2aD!fD0w(Anl8OX^7izhHh3xR(6s*xs?G*TKOrtT!QWBpBqAc;Z z3ZUxTn(G7O=F(+`sfQKjJ(9BBqDtiIf+4LG>XgB>BWiMtI@A@x!^H{Fn?glJI0l}` zG$iTYqkV(8E9B`|lV?3dbnN0~avvD?kTl1FiX9canMW2{EmK#?0aL0x1J{8IX1_yZ z(iu9LLh{hU=p|pGemH6{AHL@K8f_1hag+-XQj?qwV%v$4L?e02LsMFw(y6hUHdk>mRxZ6AiL!A8{=jdBhI>S1vsy$&vSrLK=sTj$$BWd0Oc8q) z-M7&g6v@iDtUVQE5=xa#M;A`zcI*D#FW6$;o*Q*#apWX+W<;U$IUJ)UNZ7+pI zH+}VQUrofhI`Y|CxN8b`RNP5Ri+2W;moPSB(p{O0>bB{}7h2Mp;x$ZcuuKwRAB9ft z>-l~vI_8fTj8QutPs*{QrEh&UMK}h-y-2Wy1*RG_pY}PyDtm!$&#V;!A zC~3#5xoMtHtBx}q@w?34?`*n{L0J`Hzd23Oy>`H5F5H3n8AC*5_O1d_$$QUjj`+^% zC%5f85th6=i@%?05UnGCk(ja9818*+_BZbMfqC)3BL4-Y!`6UJKp!ZXA0F1i3{5(c z9foEuCT`<7^RaY)vBl5W8a>Q7V3pik%zNZh9l)PjR#)iIT&P8HsIeBbC}?Re?z8Cg zB?^HCzVlqWhI#?r;g>@H=89;g{NFrdx303d9#w*a=tOM(AmICRbhO@2vo1VOs?LA?S6u&!onimHD&vLu}ta&)Y zlC%EbEP(%B7fJk|dm`pzXZfG6{(ous>>2+Ph@$4ErOy5T>wMOT|5zO(loVqAPdxMH zBNh2DqW9jb#(ii z)87ZDR>N*5@bIeS?O!=1-u`t~{N4N?!AF|7>VOhSdtol*(W%ClzIk=(h+>{-3jCai=`=2t_Tn_I%7P`KyIGtkZNF`PVB()l+ zTMU-{&#HUR{r_09IsCpTs~@zs3CV^UVh4K&DXR+6giwCyLd|1mq`bhxM0}EN<)(1| zT8)2%aah@0qg&k*M%wKZ-9^&2Sh2X_{qX*5Hz&;(`^mi}*K@wFd)Ny-I*&Bbg9raI z>f*bm(!tHksIh&tH?!f#wfrz~a!&@k!T6H)ly`y>XpY=bp(>Mc^32Cy5(xPsO!)xfrp_gr_lx@rN54OKpJZQVsdx9rn)$z?ar3L zeK(<|2WxzFc~$Gk*K1y#_+f4l{fsvS(CqC`B3pjF-pD=X7k>C~R&__?|ATE8O<-kq z#5-O7oQ=Z6y2U)VwkXFOPLEGjNXHfvC++*W$zSOX`fD0wJ@urkn2VluagCd*EW}Qk zNnFXY$;GrRREY#|{_W~2g(;jAl3#$JN0KHVDqOL+cUT*TFicP@DwfRJxcnUV$`!-- zT^Ve>=7WHa(D1_0qd<<~MvX)(Q}u%!A9aeK`JDzmf|9N)jVS`!BlQKkrv1hSUXLDg{(p zHZ-ixoxdaU{LR~yS0P=|8a8ODSGS@`Ma8c=YA_(V#_`qZ4E2wVk6S`j71KvLG~fM^wOjWcqT2b))p z+2s9#&6EmZnakQ3XFcK|I4|yD3+dU@eEKtW>OaD)u049;yv1?g#@Pgp-nzf??JYdI z0e|2JwqM)KSghabQYY?~X}&JfA;w&^mI=8(JmIwB7KVP_>QH^C&~Rfmlxp6S(PdVA zxS1&_e+{l%)|=F=&uVN@E3K+lrH}$hVXhk`RVOMFRY5(tD!tX=N0~?f$&vqJsaqFB z?CO+tc$;MTLq8m6n_!2@y6R?nxYq7KRwzPn1k+plBHc3VQo6B1eXKSK(U;0I5MzA{ zIwz2bU@NAKQZv(+vHjGSHKx(fa3~!>NG&)YKg8^Ts~-=K1)GKu0}YWVqdUz0T-0`) zd_ZeGwv#bm7w*BrW++WAp<0bid7&6>mM743x=F^+9-If#3~`Qe>{3@bB#nHMs$nXZ z0Dfl)qQ|&POUxOHSqkdvuMU>!=c%Ms36Lx+;hHd9JGzqt=O;29$8DO3JaCcLnv!70 z;#S7-YP9}wWDvVmy&immSw1Z5Qs=5cj|wtUe0o!DKi*+Dbn!5L1(h23=Kfts*^^FF z=M62+RJ(Cbqf^zef6!!$NYU!c)9;b+1ESpB+<-RNAZ_=onUnR_gSo{WgDOM`8B>W{ zmAVC?uCuFiTYvHmSyNkm75E&|l=X>yc3%=Iat!dtJ16FFw~6*nqnYAYOHMC19%%3(R>PaP#4alpDp>e9CNBl))lzT#;5c!Zzm{)~3?l5q|TPSk1)- z8BCNo%$s0zR}g9W(*p|!Ed!&81qJy^On94j%vhK}`Kk!ce3~IaA2T0Y!d9rL-^)#N zsE@fUm-4yVnm#(l_0>@{ld>krBiY}@rpO>7r2`x3Gp#OY!S`W>k#_c#ZRW|jUD7p% zZxqa_)qEfqe6`qmd}aO#{FBnbKq^r`lV_@LtfGC^K>e`JU}3x++RYOPF&EKk!9>jOj5O&jTa}CU=3*MvHY^8!&}2f^0;3~! z&vID%r|7Se*$}WP=?eg5Fi-U@h%3)iqz60*IoBDV1#?0mHM??}lNxq-Nlrj^TdJjD zAN|)Ry)LPLQ;O=#dn5c+5uO-78!A#C0ko^nE8F=Wo9Z*mb3{7M2v|GLO2VS51VPam zD0xnq)U5xE`PFYOPm{pp zAWeQDRzF>umc*2eSTnbKt*_7cSzo1X_8Hs1*!%z(ji`gw&V;5E3v)F~>V)LG5SKrV zKSn@&z|7L9mz_bzx;8v4CpRzO?*Bl-#N~{ndCf&z27> zwkpigjtcofp7S+$eqY3WS>~kt?rzAyAiA@+OzkV62Y@*SwE4opT@FM z)P{Yd_sC)DQID>5-Gt4OI@UYOART zvg1VYKYJ`_^~?$ZHpkLkzJA9MK6nLG&F;4wJBbBk7x!bg$Jozb{l922TFY)13>(GP zlzk652QU}e8N%$`ZPrT@E<&pp4kD3A3awWU30x@^j&`L2R$U#NRS zFAW$cO+iR)CDsd~B&&q^%r-7uuR)}Ri%>_>Uxlri0&3O@o5qvl^3H1Llpkwt7xv=EZMi7?+G596S;TsDTdBfiG5Zm^T1IUPZ?V(e%$=QY79Dvu%z9tpiiP5l~Cch;AYC0f88D_ieC_4iR32)-}Ysa?M2aAT!giNeS3 zdb9GF4Y>Kt0#Jwzh2Cz$&O5i)P%3#=Aid6L`31}i8%mP2%FVd`E!Hwl`R(Skh{z9D zV|1cytu7-o6lhlDOs(+XHpBH$^bnH#Q2Ic$C~C@>txU?E`}}i5uSf~Z&8bF&ANDxm zcIQ8yW?CGp~eIYsw=2W1X4CPAR1 zv$U)bU(2)4RkQA*)gp7@zrt`wukSxAJOd5qwa$M$Y8h1SNfI8NCw)^~?>Iww&p7ls zP40eO4lq*tvbhhK@IN^YD9~3@=+}w6sizF}2vOwX(NRLkp4~uCTOTpWdX$<_jM0hK z`j^S=ceB(cUL6!&I1ui~TaLlKw^~(}U3|Na8kKNE=13evhQ9#aL5sa(;TGFPzEvL+Z=t-85(JuiqG_c1RZZDu&u-)ccrao3VC3} zLiHz6mU{v!U5`e++(}%IT*VuOCi~ zn0k+!FjM(wk$5Lg2;HxUR0akO{V&gKq{ledp*5MuQFaDeHd);#I;ExGONcKBjGKpK zLqdPCsdU_zHn1(r4%zv+7Fi7q}1|la@7;m@F)_w%+eT<;f5`|4MLmMTwHVCB9eoiwudiz9p31TnwNW4zD|qqQ&O#VxmyS>nD2Cl?BU(IWDa89 z`=p_t=%D^4o5qCrsek|UVFK$(ZO1gAp3ryQ2f&10&YOt0mdk{TP*0%R(o{mc!jZg< zYr-Ydf0-8k+xC?KhDY#FzdZSYBuhJBrh@4KX(Hwl6ZJdtwr{rWJeqM1Z+b7%W!j78 z`o%S%DO_gK^yzNdHbQB6c@%j7o^3r&cr#1Abn+6znYi4bc^X3;Q*6qS&T))v}! zci7$(A4#ao-|=8T_Ij=4_J5M!G1+}YEEGVU)AIsdJrw1BGR~i5q%)B_?G+N8*Fd6d zKrG<}{`js^u18Zd+JG4&$xXmY+S`{uc{6h$m4-}eKbTp+m2bTAGDhlidaokfp-d!R zU|!kAUuH&F-QGT&ak%*O&en68$%90M_YRa}ohJjCYwVpzC33Se>PE{6o+=#zGI`U7 z4IO`8et5`!$3DSEXuIggIt#`RAbZ<`gJx9LcxTKtXTzd;?4hk2!c(m!x=~LzX(`lu z)E#|Rsvo!CMo;^7JFcs4A|8k=zDWpQ>z;jYs6yd|m|6cyO2onczyx93WvEn8UP<#m z=CSi!^Qkspv+#k0khN%Dan?)W{MP0b|33KGwGikNv-N?$<<9&`x%U!|$<4lzE`Zrm zKa(3^3Me#x0TP=nYUHo{_~jAT<$2qsp;*(SSCBM>>bLEHP`78(HMw0wRm&B~UVI~E zsz=3Cm8W+M#)rzRc--jf8zSj$&DLpKipJ-fPtLto($>&137fjufIAqg#us>rvT2P? zvL-0oP+VCT1y&l`_^j=>b1XM-Zf!!DRQ$>Qwc5Jwb5Ldu^mYBNXBcB6L+}!k6i=ol zB@tzGTQ|~R&o06gkoe^#QR~7G`f93|952IxrAVPE4E@-i6~<{}&8jVw7FI^7FAGU3 zE_N=Rg`p{+JIl%nfh>M{FdK{}`AQvq((HC`5sAOU@)7iOMCIPkQ5Qbt@aB@rU zVAuUbKk8JYUyC?!9vEoW_o*80==+tR{rGamg;=>>eltykH7Q}3M(5r|F5n~9yJ)76j%^wN5%W zUUEnTy+A$JFQt7l=fOCqXHR7HXn@vbA2Of$^|u3Y5PY(b2lYQ$*#f1_$k^vZXka^X z#oTGC4}d9Z&ss{v?WAFhm9(A=Z zd{diC_Cw{hjpTWa4NUa5#Y3QFC!Uy9`^90Ic>No$|>bob!0Z)b1+ z*Wf+B_EEETXuEM)SJx30nSqMqdGb%@zUNn@H03mmGd(K2rAqI$3jUo4(*h#YsUbH( z5J+_(*a?qzl>Ei%K4dVmn#6#JJT|lZGX&ov-uQ-&iFuacaR%Lj|oq_f?GeY&`7K zp!MRJY&S!JCf>ejAr&_tyEXnautYTk5#uG-Ra?J!7FgcnHrfh373*99^8;5-TLB+D zs0!w?d|4H@N~le1yPf24egWtZs%D)JHR>scn^(=N>aqBD^+MJH-ug$zOuWWBu})Z% z>EMB$j`M%f{&KKEZpA5n&;td+ZX^~%&-5|Rc{kG8q;MGz$=5`NjtNjqMh12w?p7}D zi@GnaI}q%!vr?-fU|Dmi(a8YP1&MoOe}En5NuWrN)O4 zN8C};3lD{7gG1y)E`jb8hw6>YR$%MLeS?x*$p~p=X+C~lJZ3I=l-u%3r3u1m-@3S zvVUZW)O;Zs!~3qPhF$-S2ly{-aYji0`78U~Pg4*P6E`K@KlwesoVTL2-C3=HJFt6v zkZ>0F>)~bBR>9VHs{y@h9vk|Ya$TS^2xCAEGd@5o?Dw2YZX&#!M3tRN<%rM4 zmb9H9^<#LC0dfo!Z)VVT;~B+Xes;T0y7h>mEfZ%%V+1B)o$E*)DZ$(;G88pb+|7P= z$kOTM3%A+uPvREZs`sYg4J-ZAQ_$=@`RTOCeDzUM3yNr*{0^R~mU~*Fj=Th2SX!Ju zwGPY(?Ga7P!sf|*S+-EX`uaCs3)?fWk&9fvnFiF49PwCgoN`H2>kv*6J3*p+GI^Vj zFRGGGj%{r|Vz8s6{0#mNOEhoY=?O2t%U)Nu5Rd(xsaNKp_ss6Zu?m~=ox!rNqCtqO z3StQDD%*87$WR%B5kN==);IhzuR+#$@1GADG{@iXf~s}@;M5Ydmopq`v^eDhblYbO z9)vLO4=kVDdlBXSYA$qm&T$xmK>qZP7nvtr8R;r}w|ck&_%nHOU!j&5orgF3I^s^)G(KNswq7coS4X2c&Q_mEIx zYk(Rxvzsk@uHE<@Z3cRtW6xJsCs0juAI1SRIzvV++_siKPnxgkelF)&=G42CDgoX~ z`~goMZzau;gGp_YGDvLwG&bkH1@Y&<0LR=yZToN21LlA8G3!B9qHr8!0VUjYo@%3J=@{dX zY-Jxh`&q8!j&ws5;AP5`1qvEBcy?^HS{G}bk1b8KIk9=uqO^TtMX4+Oi)4M2*bprQ z3_Au$T`xqlo9DLf{2mZuwnf5S>-lf^DkV&s#AXRy_n>gf!=*3e0E^%0Dw&I$Yh_sI z)oG>P6ajB0vun%Sd?P(kK3+XdVqcf~xBN(06BK4(1$B#x?$cJ`d2K5A~^SLkmn?dE~n}A{f{jdNnEO=mpvj?U(nH|Ib*0D-T~v* z0pekk@X1Lg)_Qe}o1hl#mZ?Fsh`LCfE{g_>>Mc>q*wj>t`$tw%GEv;v#6PFl4YG9Z zB8p4M{`3#ra1FYa$aa-sM7xJqRP9bK$&gei|1siB*F%%^uG>WTu-^nH(5WC;sZW2v zSHav}`iyudeq6-n+?0@iiN%b+FdU>#9gK;Cj(1B*>ZK{1D1YW_qrHEeD@KB2pw!{> zms+$&RNZhAiQ!6KGxE}3#!thxiQY24?2oM9Dnn6n=~+n4SmjgLIUI2IDtg9UJOlee z)h2^#MAbH#)>=+h4D*a3I-&RMU3PJA)hS|1S?HBug(bI;lFKHW)he7eshW=tq%GfN0ExbCJH%SH!zMtcuOXn2;kGa*N+`EL) z^WbKy*E$G(0xic0c$Zcmo{305_VJ+p21RMbS`0CKv+Y*7;HJq$Ls<&#xj`MdxJio$ zbctNhn`^AY!rQ_ei@vd6vLU;N;`u<-0)}ZVuQfNTv%|NUGu^8kG8|50m<$qzeuA`fsC$ETHqJ|CciREKY5pjVm^1)>!m zLe2Fb5(dG5M@uIP4dbNoMQ$#-L9GVz0CB~9?uC>ZB;!~l_QO`Y+d1xHC!PrnAVv&5 zV-Sz#>5K4-TFY6I@SdVsl$2W!=Z1l>{m0xlx{3Wn61(bU@qk+Zs4#?C2fx|Ac2^*( zlcFbvMITCJs@$_r(&?RL|0`8m@?R)ic+t%g+U`NN1It?f$Ej^H*A4+wwMG|r((!Yp zRdUYeW|QL8E#Y{Sn+W_Pd>5neT4kOC1YU}KrNm0gq)-UQ+etgyEA}X1gBYQVA^vB` zfu=+PrFk`pn2bE>^Y$*eR0@|&e}rfKat0xw>SJXmjD$ETj9k&Wx@`>Z1@9W0VWW09 zsKkbwS73$85^HWC@@Cvrg}WQB*mkT zvy3umO}6*9st|NLTjGT4=T%Dpbl7y!Bq7W^oL^~Fb z+~mK<6ZPCw^+1T=%>AmIZOZ2Y45U=4MMXVkDFh-?VTnU55)0kO7GSuGHnkyzKFz$I zXc*3azLEFs9#%{x=7k_dIafMI-XQZ;L{Tm`t_$sAe2WlTxNb(W3D7(vt7FW`&KgJ= z3PjWDsM51)0j_vxD=XLDxVmjI7OlBWu%9p1>V&PtUbncoyocrsip?x=JKE1nS$+k< zeOL)xpPd^P(z0gVc(q0>n-%y{i9F!?!+AmN^V%PPs$PGQ)o*3cHP{LX(ot8y#tX

    rScGimItO65&1VV3DrKkZF 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 NN;lN6mnfJ9{~tKt?7RQ~ literal 0 HcmV?d00001 diff --git a/assets/img/destrcturing.1503f4e8.png b/assets/img/destrcturing.1503f4e8.png new file mode 100644 index 0000000000000000000000000000000000000000..984a7c3ede6650dc7669498fe19dbc2cd9a01eeb GIT binary patch literal 236438 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