abarthdew / vue-master

๐Ÿ”ฐVue.js for Advanced๐Ÿ”ฐ

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

title date categories tags
Vue Master
2021-12-06
Front
Vue
Front
Vue

vue-master{:target="_blank"}

๊ฐ•์˜์—์„œ ๋‹ค๋ฃจ๋Š” ๋‚ด์šฉ

Untitled

์‹ค์Šต ๋ฏธ๋ฆฌ๋ณด๊ธฐ

Untitled

Untitled

Untitled

๊ฐœ๋ฐœํ™˜๊ฒฝ

Untitled

Untitled

node ์„ค์น˜

$ sudo apt update
$ sudo apt install nodejs // node download
$ nodejs -v // read version
$ sudo apt install npm // npm(node manager) download

git ์„ค์น˜

sudo apt install git-all

VSCode ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜

Vue.js ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ ๋ฐ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ ์†Œ๊ฐœ

https://vuejs.org/v2/style-guide/ https://vuejs.org/v2/style-guide/

์ œ์ž‘ํ•  ์‚ฌ์ดํŠธ ๋ฐ API ์†Œ๊ฐœ

https://news.ycombinator.com/ https://news.ycombinator.com/

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ผ์šฐํ„ฐ ์„ค๊ณ„

  • ์ƒ๋žต

๋น„๊ณต๊ฐœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์†Œ๊ฐœ ๋ฐ ๋ทฐ CLI ์„ค๋ช…

  • ์ƒ๋žต

Vue CLI 2.x vs Vue CLI 3.x

Untitled

vue-cli2 webpack ์„ค์ • vue-cli2 webpack ์„ค์ •

  • vue-cli2์—์„œ๋Š” webpack ์„ค์ • ํŒŒ์ผ์ด ๋“œ๋Ÿฌ๋‚˜์žˆ์Œ

  • ํ”„๋กœ์ ํŠธ ๋‚ด node_modules ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ์— npm install ํ•„์š”ํ•จ.

    Untitled

  • gitHub์—์„œ ํƒฌํ”Œ๋ฆฟ์„ ๋‹ค์šด๋ฐ›๋Š” ํ˜•์‹์œผ๋กœ ์”€.

Untitled

  • vue-cli3์€ webpack ์„ค์ • ํŒŒ์ผ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์—์„œ ์•Œ์•„์„œ ์ฒ˜๋ฆฌ๋จ. ๋…ธ์ถœX. โ†’ webpack ์„ค์ •ํ•˜๋ ค๋ฉด ์ง์ ‘ ์ถ”๊ฐ€.
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ.

Vue CLI๋กœ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ESLint ๋กœ๊ทธ ํ™•์ธ

  • preset์œผ๋กœ ๊ตฌ์„ฑ ์„ ํƒ ๊ฐ€๋Šฅ

Untitled

ESLint ๋„๊ตฌ ์†Œ๊ฐœ์™€ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ?

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋ฉฐ ๋งˆ์ง€๋ง‰์— ;๋ฅผ ๋„ฃ์–ด์คŒ โ†’ ;๋ฅผ ๋ถ™์ด์ง€ ์•Š์•„๋„ ์ฝ”๋“œ ๋™์ž‘์— ๋ฌด๋ฆฌ๊ฐ€ ์—†์Œ

    Untitled

  • ํ•˜์ง€๋งŒ ;๋ฅผ ์ฐ๊ฒŒ๋” ์œ ๋„ํ•จ โ†’ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ด์„๊ธฐ๊ฐ€ ํ˜ผ๋™์„ ํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ

    ๋งจ ๋ฐ‘ ๋งจ ๋ฐ‘

  • ๊ฐ์ฑ„ ๋‚ด ํ•œ ์Œ์ด ์˜ค๋Š” ๊ฒฝ์šฐ์—๋Š” ,๋ฅผ ์ฐ์ง€ ์•Š์•„๋„ ๋จ

    Untitled

  • ๋‘ ๋ฒˆ์งธ ์Œ์ด ์˜ค๋Š” ๊ฒฝ์šฐ ,๋ฅผ ์ฐ์Œ

    Untitled

โ‡’ ESLint : ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์œ ๋„ํ•˜๊ธฐ ์œ„ํ•œ ์žฅ์น˜.

01_Vue CLI 3.x์—์„œ ESLint ์„ค์ • ๋„๋Š” ๋ฐฉ๋ฒ•

  • ESLInt ์„ค์ •

    Untitled

  • ESLint๋ฅผ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์ปดํฌ๋„ŒํŠธ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜๋ก ๋ฒˆ๊ฑฐ๋กœ์›€.

    eslint-disable-next-line
    eslint-disable

    Untitled

  • ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• : vue.config.jsํŒŒ์ผ ์ƒ์„ฑ

    Untitled

    // vue.config.js
    module.exports = {
        lintOnSave: false
    }

๋ผ์šฐํ„ฐ ์„ค์น˜ ๋ฐ ๋ผ์šฐํ„ฐ ๊ตฌํ˜„

npm
i
vue - router--
save
  • package.json์˜ dependencies : ์•ฑ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐ ํ•„์š”ํ•œ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง, ์•ฑ์˜ ๋™์ž‘์„ ๋‹ด๋‹นํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋จ. (๋ฐฐํฌํ•  ๋•Œ๋„ ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)

    Untitled

02_์ฝ”๋“œ

  • ๋ผ์šฐํ„ฐ๋ฅผ main.js์— ์„ค์ •ํ•จ.
  • main.js๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๋“ฑ์„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ์ด๋ฏ€๋กœ, router๋ฅผ ๋ณ„๋„ ํด๋”์— ๋บŒ.
  • router๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— routes์ •๋ณด๋ฅผ ์„ธํŒ…ํ•จ. ์—ฌ๊ธฐ์„œ, path์— ๋Œ€ํ•œ component๋Š” page์˜ ๊ฐœ๋…๊ณผ ๊ฐ™์Œ. โ†’ ์ด page๋“ค์€ viewsํด๋”๋ฅผ ๋งŒ๋“ค์–ด ๊ทธ ์•ˆ์—์„œ ๊ด€๋ฆฌํ•จ.
  • view page component๋ฅผ importํ•ด์„œ component์— ๋„ฃ๊ธฐ
  • router๋ฅผ export ํ•ด์„œ main.js์— importํ•œ ๋‹ค์Œ vue ๊ฐ์ฒด์— ๋„ฃ๊ธฐ

03_router-view๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŒ… ์ปดํฌ๋„ŒํŠธ ํ‘œ์‹œ

  • App.vue

    <template>
      <div id="app">
        <router-view></router-view>
      </div>
    </template>

Untitled

03_vue_router_and export_default_router_1, 2

  • ๋‘ ๊ฐ€์ง€ import, export ๋ฐฉ๋ฒ•

    //  router/index.js
    const router = new VueRouter({ ... });
    export default router;
    // main.js
    import router from './router/index'
    //  router/index.js
    export const router = new VueRouter({
    // main.js
    import { router } from './router/index'

    โ‡’ { router }, router ์ฐจ์ด

redirect ์†์„ฑ๊ณผ router-link

04_redirect

05_router-link

  • ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„ ์ฝ”๋”ฉ ์Šคํƒ€์ผ

    Untitled

    • ๋กœ ์จ์•ผ ํ•˜๋Š” ์ด์œ  : alt+์ปดํฌ๋„ŒํŠธ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์–ด์„œ ๋” ํŽธ๋ฆฌ.

06_[์‹ค์Šต ์•ˆ๋‚ด] ItemView์™€ UserView ๋ผ์šฐํ„ฐ ๊ตฌํ˜„

  • ์ƒ๋žต

06_๋ผ์šฐํ„ฐ ํด๋” ์ž‘๋ช… ํŒ๊ณผ ๋ผ์šฐํ„ฐ mode ์•ˆ๋‚ด

  • router ํด๋”๋ฅผ routes๋กœ ๋ฐ”๊ฟˆ
  • mode: history ์ถ”๊ฐ€

07_axiosแ„…แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ api แ„’แ…ฉแ„Žแ…ฎแ†ฏ

  • views์— ๋“ค์–ด๊ฐ€๋Š” page(์ปดํฌ๋„ŒํŠธ)๋‚ด์—๋Š” ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…์— ๊ด€๋ จ๋œ ์ •๋ณด๋งŒ ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒŒ ์ข‹๋‹ค.
  • views์— ๋ฐ์ดํ„ฐ ํŒจ์น˜ ๋“ฑ ๋กœ์ง์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์•ˆ ์ข‹์Œ. โ†’ ๋ณ„๋„์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋กœ์ง ๋ถˆ๋Ÿฌ์˜ค๊ธฐ.
  • ์—ฌ๊ธฐ์„œ๋Š” ์‹ค์Šต์„ ์œ„ํ•ด ์ผ๋‹จ views์— ์ฝ”๋“œ๋ฅผ ์“ฐ๊ณ  ๋‚˜์ค‘์— ๊ฐœ์„ .
  • axios ์„ค์น˜
npm
install
axios
// http, xhr ๋“ฑ์„ ํŽธํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

08_[์‹ค์Šต ์•ˆ๋‚ด] axiosแ„‹แ…ด api แ„’แ…กแ†ทแ„‰แ…ฎ ๊ตฌ์กฐํ™” แ„‡แ…กแ†ผแ„‡แ…ฅแ†ธ แ„†แ…ตแ†พ แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ แ„‹แ…กแ†ซแ„‚แ…ข

  • NewsView์˜ axios ๋กœ์ง /api/index๋กœ ์˜ฎ๊น€
axios.get('https://api.hnpwa.com/v0/news/1.json')
  .then(res => {
    console.log(res.data)
    this.users = res.data;
  })
  .catch(error => console.log(error));
// ==>  // new Promise()
// .then(function(response) {
//     console.log(response);
// })
// .catch(function() {

// })

08_[์‹ค์Šต] JobsView์™€ AskView ๊ตฌํ˜„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ this 4๊ฐ€์ง€์™€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ this

  • ๋‹ค๋ฅธ ์–ธ์–ด๋Š” ์ง€์—ญ scope๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ „์—ญ scope๋กœ ์‹œ์ž‘ํ•จ.

    Untitled

  • ์ฒซ๋ฒˆ์งธ this :๊ทธ๋ƒฅ this

    Untitled

  • ๋‘๋ฒˆ์งธ this : ํ•จ์ˆ˜ ์•ˆ this

    Untitled

    • ํ•จ์ˆ˜ ์•ˆ์—์„œ๋„ this๋Š” ์ „์—ญ์„ ๊ฐ€๋ฆฌํ‚ด
  • ์„ธ๋ฒˆ์งธ this : Vue์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ƒ์„ฑ

    Untitled

    function Vue(el) {
    	console.log(this); // => Vue {}
    	// ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ์—์„œ์˜ this
    	this.el = el;
    }
    • sum ํ•จ์ˆ˜์˜ this๊ฐ€ ์ „์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ Vue ์ƒ์„ฑ์ž์˜ this๋Š” ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด.
  • NewsView

    Untitled

    Untitled

    • ํ˜ธ์ถœ ์ „์—๋Š” vue component, ํ˜ธ์ถœ ํ›„์—๋Š” undefined๋ฅผ ๊ฐ€๋ฆฌํ‚ด.
    • http๋กœ ์„œ๋ฒ„์— ๊ฐ–๋‹ค์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ๋กœ ํ˜ธ์ถœ๋จ โ†’ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋ฒ—์–ด๋‚œ this๊ฐ€ ๋ฐœ์ƒ(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์‹)
    • ์ปดํฌ๋„ŒํŠธ, ๊ฐ์ฒด ๋“ฑ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์‹ถ์„ ๋•Œ๋Š” var vm = this; ๋ฅผ ์‚ฌ์šฉํ–ˆ์Œ. โ†’ ๋ฐ”์ธ๋”ฉ์„ ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์Œ.
  • ES6 ํ™”์‚ดํ‘œ ๋ฌธ๋ฒ•์œผ๋กœ ๋ฐ”๊ฟ”์„œ ๋‹ค์‹œ ์ฝ˜์†” ์ฐ์–ด๋ณด๋ฉด ํ˜ธ์ถœ ์ „๊ณผ ํ›„๊ฐ€ ๊ฐ™์Œ โ†’ this.user = response.data;์˜ this๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์œ„์น˜์˜ this๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ด.

    Untitled

    Untitled

07_แ„Œแ…กแ„‡แ…กแ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ธแ„แ…ณ แ„‡แ…ตแ„ƒแ…ฉแ†ผแ„€แ…ต แ„Žแ…ฅแ„…แ…ต(1) - Callback

  • callback.html

    file:///home/jonah/Documents/vue-master/vue-master-cli3/src/callback.html file:///home/jonah/Documents/vue-master/vue-master-cli3/src/callback.html

    • ํ•จ์ˆ˜ ๊ฒฐ๊ณผ(3)์ด ๋จผ์ € ๋‚˜์˜ค๊ณ  ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ ๊ฒฐ๊ณผ(2)๊ฐ€ ๋‚˜์ค‘์— ๋‚˜์™€์„œ, result ๊ฐ์ฒด ์•ˆ์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š์Œ. โ†’ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ ๋•Œ๋ฌธ.
    • ajax ๋ฐ์ดํ„ฐ ์š”์ฒญ์ด ๊ฐ€๊ณ  ๋‚˜์„œ, ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ โ†’ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑํ•จ์ˆ˜.
  • ์ฝœ๋ฐฑ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚˜์„œ, success๊ฐ€ ๋์„ ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์Œ.

    Untitled

    Untitled

    • ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ ๊ฒฐ๊ณผ, ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๊ฐ€ ์ฐํž˜.
  • ์ฝœ๋ฐฑ ๊ณผ์ •์ด ๋งŽ์•„์ง€๊ฒŒ ๋˜๋ฉด ์ฝœ๋ฐฑ ์ง€์˜ฅ์ด ์ƒ๊น€. ์ฝ”๋”ฉ ์‚ฌ๊ณ ์— ์œ„๋ฐฐ.

    Untitled

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ(2) - Promise

  • Promise : ์ฝœ๋ฐฑ ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์งœ๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅ.

    // ajax call function
    function callAjax() {
        return new Promise(function (resolve, reject) { // Promise must get parameter named resolve and reject
            $.ajax({ // ajax call
                url: 'https://api.hnpwa.com/v0/news/1.json',
                success: function (data) {
                    resolve(data); // when ajax call success, resolve handle success data
                }
            });
        });
    };
    function fetchData() {
        var result = [];
        callAjax() // Promise Object call
        .then(function() { // Promise resolve : Situation when Promise call success
            console.log('data call result', data);
            result = data;
            console.log('function result', result);
        })
        .catch(function(err) { // Promise reject
            console.log(err);
        }); 
    }
    • new Promise๋กœ ์ธํ•ด ์–ด๋–ค ๋™์ž‘์„ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์„œ resolveํ•˜๋ฉด, callAjax์˜ then์œผ๋กœ ์—ฐ๊ฒฐ๋จ.
    • ์ฆ‰, callAjax๋Š” new Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์„œ ๋ฐ์ดํ„ฐ๋ฅผ resolveํ–ˆ์„ ๋•Œ, then์•ˆ์˜ ๊ตฌ๋ฌธ์ด ์‹คํ–‰๋จ.
    • .then()์„ ์—ฐ๊ฒฐ์‹œ์ผœ ์ฒด์ด๋‹๋„ ๊ฐ€๋Šฅ.
    • ์ œ์ด์ฟผ๋ฆฌ์—๋„ Promise ์„ฑ๊ฒฉ์˜ ๋‚ด์žฅ ๊ฐ์ฒด(๋””ํผ๋“œ)๊ฐ€ ์žˆ์ง€๋งŒ, ๋ณด์™„์ด ํ•„์š”ํ•จ
    • ํ”„๋กœ๋ฏธ์Šค ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ๊ธ€ ์ฃผ์†Œ
    • Promise MDN ์ฃผ์†Œ

Vuex แ„‰แ…ฅแ†ฏแ„Žแ…ต แ„†แ…ตแ†พ Vuexแ„€แ…ก แ„Œแ…ฅแ†จแ„‹แ…ญแ†ผแ„ƒแ…ฌแ†ซ แ„‹แ…ขแ†ธ แ„€แ…ฎแ„Œแ…ฉ แ„‰แ…ฉแ„€แ…ข

  • ๊ตฌ์กฐ๋„

    Untitled

    • NewView์—์„œ api๋ฅผ ๋ฐ”๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, vuex๋ผ๋Š” ์ƒํƒœ, ์ฆ‰ state์— api๋ฅผ ๋‹ด์•„ ์˜ด
  • vuex : ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ. ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๊ณต์œ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์†์„ฑ.

    • state๋ฅผ ์ด์šฉํ•ด, NewsView๊ฐ€ users๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ.

09_Vuex แ„†แ…ฉแ„ƒแ…ฒแ†ฏแ„’แ…ช แ„†แ…ตแ†พ state ์ ์šฉ

  • ์ƒ๋žต

10_NewsViewแ„‹แ…ฆ actionsแ„‹แ…ช mutations แ„Œแ…ฅแ†จแ„‹แ…ญแ†ผ

  • api์—์„œ actions ํ˜ธ์ถœ, actions์—์„œ mutations ํ˜ธ์ถœ, mutations์—์„œ state ๊ฐ’์„ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ NewsView์— ์ ์šฉ.

    Untitled

11_[แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ ์•ˆ๋‚ด] JobsViewแ„‹แ…ช AskView แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ แ„‹แ…กแ†ซแ„‚แ…ข

  • ์ƒ๋žต

[แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ] JobsViewแ„‹แ…ฆ แ„‰แ…ณแ„แ…ฉแ„‹แ…ฅ แ„Œแ…ฅแ†จแ„‹แ…ญแ†ผ

  • ์ƒ๋žต

[แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ] map แ„’แ…ฆแ†ฏแ„‘แ…ฅ แ„’แ…กแ†ทแ„‰แ…ฎแ„…แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ AskView แ„‘แ…ฎแ†ฏแ„‹แ…ต

  • ์ƒ๋žต

12_แ„‰แ…ณแ„แ…ฉแ„‹แ…ฅ แ„‰แ…ฉแ†จแ„‰แ…ฅแ†ผ แ„†แ…ฉแ„ƒแ…ฒแ†ฏแ„’แ…ช

  • ์ƒ๋žต

13_์ค‘๊ฐ„ ์ •๋ฆฌ ๋ฐ ์Šคํƒ€์ผ๋ง

  • ์ƒ๋žต

14_แ„ƒแ…ฉแ†ผแ„Œแ…ฅแ†จ แ„…แ…กแ„‹แ…ฎแ„แ…ณ แ„†แ…ขแ„Žแ…ตแ†ผ แ„‹แ…ฏแ†ซแ„…แ…ต แ„†แ…ตแ†พ แ„Œแ…ฅแ†จแ„‹แ…ญแ†ผ

Untitled

15_แ„…แ…กแ„‹แ…ฎแ„แ…ฅ paramsแ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ User แ„‰แ…กแ†ผแ„‰แ…ฆ แ„‘แ…ฆแ„‹แ…ตแ„Œแ…ต แ„€แ…ฎแ„’แ…งแ†ซ

  • mapActions 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•

    created() {
        console.log(this.$route.params.id);
        const userName = this.$route.params.id;
        this.$store.dispatch('FETCH_USER', userName);
    },
    created() {
        console.log(this.$route.params.id);
        const userName = this.$route.params.id;
        this.FETCH_USER(userName);
    },
    methods: {
        ...mapActions({
            FETCH_USER: 'FETCH_USER',
        }),
    }

    Untitled

[แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ] แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซ แ„‰แ…กแ†ผแ„‰แ…ฆ แ„‘แ…ฆแ„‹แ…ตแ„Œแ…ต แ„€แ…ฎแ„’แ…งแ†ซ แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ แ„‹แ…กแ†ซแ„‚แ…ข

Untitled

16_[แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ] แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซ แ„‰แ…กแ†ผแ„‰แ…ฆ แ„‘แ…ฆแ„‹แ…ตแ„Œแ…ต แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ แ„‘แ…ฎแ†ฏแ„‹แ…ต แ„†แ…ตแ†พ แ„‹แ…ฉแ„…แ…ฒ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผ

17_แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซ แ„‰แ…กแ†ผแ„‰แ…ฆ แ„‘แ…ฆแ„‹แ…ตแ„Œแ…ต แ„‰แ…ณแ„แ…กแ„‹แ…ตแ†ฏแ„…แ…ตแ†ผ แ„†แ…ตแ†พ v-html แ„ƒแ…ตแ„…แ…ฆแ†จแ„แ…ตแ„‡แ…ณ แ„‰แ…กแ„‹แ…ญแ†ผแ„‡แ…ฅแ†ธ แ„‰แ…ฉแ„€แ…ข

  • ์ƒ๋žต

18_๋ผ์šฐํ„ฐ ํŠธ๋žœ์ง€์…˜

<transition name="fade">
  <router-view></router-view>
</transition>

  /* router transition */
  .fade - enter - active,
.
fade - leave - active
{
  transition: opacity
  .5
  s;
}
.
fade - enter,
.
fade - leave - to /* .fade-leave-active below version 2.1.8 */
{
  opacity: 0;
}
<transition name="page">
  <router-view></router-view>
</transition>

  /* router transition */
  .page - enter - active,
.
page - leave - active
{
  transition: opacity
  .5
  s;
}
.
page - enter,
.
page - leave - to /* .fade-leave-active below version 2.1.8 */
{
  opacity: 0;
}
  • ์ด๋ ‡๊ฒŒ ์ ์šฉํ•˜๋ฉด ๋ผ์šฐํ„ฐ ์ด๋™ํ•  ๋•Œ ํ™”๋ฉด์ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋„˜์–ด๊ฐ.
  • enter, leave๋Š” ๋ณดํ†ต ์Œ์œผ๋กœ ์ง์„ ์ง€์–ด css๋ฅผ ์ ์šฉํ•จ.

Untitled

แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ แ„€แ…ฉแ†ผแ„แ…ฉแ†ผแ„’แ…ช แ„…แ…ตแ„‘แ…ขแ†จแ„แ…ฉแ„…แ…ตแ†ผ แ„‰แ…ฉแ„€แ…ข

  • view์—์„œ ๋ฐ”๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ, component ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง

Untitled

19_css

  • ์ƒ๋žต

20_[แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ แ„‹แ…กแ†ซแ„‚แ…ข] ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ListItem ์ œ์ž‘ ๋ฐ ์‹ค์Šต ์•ˆ๋‚ด

  • NewsView ์—๋Š” list-item ์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ๊น€

Untitled

  • AskView ์—๋Š” ์—†์Œ

Untitled

21_แ„€แ…ฉแ†ผแ„แ…ฉแ†ผ แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ แ„€แ…ฎแ„’แ…งแ†ซ(1) - แ„‘แ…ฆแ„‹แ…ตแ„Œแ…ตแ„‡แ…งแ†ฏ แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„‡แ…ฎแ†ซแ„€แ…ต

  • ์˜์ƒ ์•ˆ ๋ณด๊ณ  ๋‚ด ๋ง˜๋Œ€๋กœ ํ•จ

22_แ„€แ…ฉแ†ผแ„แ…ฉแ†ผ แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ แ„€แ…ฎแ„’แ…งแ†ซ(2) - computed แ„‰แ…ฉแ†จแ„‰แ…ฅแ†ผ

  • ListItem
computed: {
  listItems()
  {
    if (this.router === 'news') {
      return 'news';
    } else if (this.router === 'jobs') {
      return 'jobs';
    } else if (this.router === 'asks') {
      return 'asks';
    }
  }
}
,

23_แ„€แ…ฉแ†ผแ„แ…ฉแ†ผ แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ แ„€แ…ฎแ„’แ…งแ†ซ(3) - template แ„‰แ…ฉแ†จแ„‰แ…ฅแ†ผแ„€แ…ช v-if แ„ƒแ…ตแ„…แ…ฆแ†จแ„แ…ตแ„‡แ…ณ แ„’แ…ชแ†ฏแ„‹แ…ญแ†ผ 1, 2

  • ListItem.vue
<p>
  <template v-if="item.domain">
    <a :href="item.url">
    {{item.title}}
  </a>
</template>
<template v-else>
  <router-link
  :to="`/item/${item.id}`">
  {{item.title}}
</router-link>
</template>
</p>

24_แ„‰แ…กแ„‹แ…ญแ†ผแ„Œแ…ก แ„‘แ…ณแ„…แ…ฉแ„‘แ…ตแ†ฏ แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ แ„‰แ…ฉแ„€แ…ข แ„†แ…ตแ†พ แ„ƒแ…ณแ†ผแ„…แ…ฉแ†จ

  • UserProfile

Untitled

๐Ÿ’ก Router path์™€ router-link ํ˜•์‹์ด ๋งž์ง€ ์•Š์œผ๋ฉด ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋ทฐ๊ฐ€ ๋œจ์ง€ ์•Š์Œ.

<template>
  <router-link to="/user">User</router-link>
</template>

{
  path: '/user/:id',
    component
:
  UserView,
}
,

Untitled

<template>
  <router-link to="/user/:id">User</router-link>
</div>
</template>

{
  path: '/user/:id',
    component
:
  ItemView,
}

Untitled

25_์‚ฌ์šฉ์ž ์ปดํฌ๋„ŒํŠธ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ฒ˜๋ฆฌ 1

  • ์ƒ๋žต

26_์‚ฌ์šฉ์ž ์ปดํฌ๋„ŒํŠธ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ฒ˜๋ฆฌ 2

  • ์ƒ๋žต

2แ„€แ…กแ„Œแ…ต ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ๋ฆ„ แ„‡แ…ตแ„€แ…ญ

  • UserProfile์—์„œ computed๋กœ ์ ‘๊ทผ

    Untitled

  • UserView์—์„œ props๋กœ ์ „๋‹ฌ

    Untitled

27_slotแ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„‰แ…กแ„‹แ…ญแ†ผแ„Œแ…ก แ„‘แ…ณแ„…แ…ฉแ„‘แ…ตแ†ฏ แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ แ„€แ…ฎแ„’แ…งแ†ซ

  • user, item ํ˜•์‹์„ []์—์„œ {}๋กœ ๋ฐ”๊ฟ”์คŒ.

    state: {
        news: [],
        jobs: [],
        asks: [],
        user: {},
        item: {},
    },

    Untitled

    Untitled

    Untitled

28_แ„‰แ…กแ„‹แ…ญแ†ผแ„Œแ…ก แ„‘แ…ณแ„…แ…ฉแ„‘แ…ตแ†ฏ แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ แ„‰แ…ณแ„แ…กแ„‹แ…ตแ†ฏแ„…แ…ตแ†ผ แ„†แ…ตแ†พ แ„แ…ฉแ„ƒแ…ณ แ„Œแ…ฅแ†ผแ„…แ…ต

  • ์ƒ๋žต

29_แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ แ„Œแ…ขแ„’แ…ชแ†ฏแ„‹แ…ญแ†ผ แ„‡แ…กแ†ผแ„‡แ…ฅแ†ธ แ„†แ…ตแ†พ แ„Œแ…ขแ„’แ…ชแ†ฏแ„‹แ…ญแ†ผแ„’แ…กแ†ฏ แ„‘แ…ฉแ„‹แ…ตแ†ซแ„แ…ณ แ„‰แ…ฉแ„€แ…ข

  • ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ ์žฌํ™œ์šฉ

30_แ„‹แ…ตแ„‡แ…ฆแ†ซแ„แ…ณ แ„‡แ…ฅแ„‰แ…ณแ„…แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„‰แ…ณแ„‘แ…ตแ„‚แ…ฅ แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ แ„€แ…ฎแ„’แ…งแ†ซ

  • ํŽ˜์ด์ง€ ์ด๋™ํ•  ๋•Œ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋™์•ˆ spinner๋ฅผ ๋„์› ๋‹ค๊ฐ€, ๊บผ์ง€๋Š” ์ˆœ๊ฐ„ spinner ๋ฅผ ๋„๋ฉด ๋จ.

30_2_๊ทธ๋ ‡๋‹ค๋ฉด, spinner๋ฅผ ์–ธ์ œ ์ผœ๊ณ  ๋„๋Š”์ง€ ๊ณ ๋ฏผํ•ด๋ณด์ž.

  • spinner๋Š” NewsView์—์„œ props๋กœ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š”, app์—์„œ emit์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ๋” ๋‚˜์Œ. (์ด๋ฒคํŠธ ๋ฒ„์Šค)

  • /src/utils/bus.js : ๋นˆ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ด๋ฒคํŠธ ์ „๋‹ฌ

  • default์™€ ๊ทธ์™ธ์˜ ์ฐจ์ด์ 

    // bus.js
    export const bus = new Vue();
    // App.vue
    import { bus } from './bus.js'
    
    // default
    // bus.js
    export default new Vue();
    // App.vue
    import Bus from './bus.js' // ๋ญ˜ ์„ ์–ธํ•˜๋“  ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ(Bus๊ฐ€ ๋˜๋“ , bbbb๋“  ๋‹ค ๋จ)
  • start:spinner๊ฐ€ ๋Œ๊ณ  ์žˆ๋Š” ๋ชจ์Šต

    Untitled

  • start๋กœ spinner๊ฐ€ ์ƒ๊ธฐ๊ณ , end๋กœ ์‚ฌ๋ผ์ง โ‡’ ์–ธ์ œ ์ƒ๊ธฐ๊ฒŒ ํ•˜๊ณ  ์‚ฌ๋ผ์ง€๊ฒŒ ๋งŒ๋“ค๊ฑด์ง€๋งŒ ๊ณ ๋ฏผํ•˜๋ฉด ๋จ

    Untitled

  • ๋งˆ์ง€๋ง‰์— off ํ•„์ˆ˜

    • ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ์ด๋ฒคํŠธ ๋ฒ„์Šค์— ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์Œ“์ด๊ธฐ ๋•Œ๋ฌธ์—.
    • ํ•ญ์ƒ ํŽ˜์ด์ง€์—์„œ ์•ฑ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์—ญํ• (์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๋Š”)์ด ๋๋‚˜๊ณ  ๋‚˜์„œ off๋ฅผ ํ•ด ์ค˜์•ผ ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ํ•ด์ง€๋จ.
created()
{
  // bus.$on('start:spinner', () => this.spinner = true);
  bus.$on('start:spinner', this.startSpinner); // recieved
  bus.$on('end:spinner', this.endSpinner); // recieved
}
,
beforeDestroy()
{
  bus.$off('start:startSpinner')
  bus.$off('start:endSpinner')
}

31_แ„‰แ…ณแ„‘แ…ตแ„‚แ…ฅ แ„‰แ…ตแ†ฏแ„’แ…ขแ†ผ แ„†แ…ตแ†พ แ„Œแ…ฉแ†ผแ„…แ…ญ แ„‰แ…ตแ„Œแ…ฅแ†ท แ„‹แ…กแ†ฏแ„‹แ…กแ„‡แ…ฉแ„€แ…ต

  • ๊ฐ€์ƒ์˜ ๋„คํŠธ์›Œํฌ(์†๋„๊ฐ€ ๋Š๋ฆฐ)๋ฅผ ๋งŒ๋“ค์–ด spinner ํ…Œ์ŠคํŠธ

    Untitled

    Untitled

    Untitled

  • actions.js

FETCH_NEWS(context)
{
  fetchNewsList()
    .then(res => { // ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ
      context.commit('SET_NEWS', res.data); // mutation์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ 
      return res; // ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด
    })
    .catch(err => console.log(err));
}
,

32_แ„’แ…กแ„‹แ…ต แ„‹แ…ฉแ„ƒแ…ฅ แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ(HOC) แ„‰แ…ฉแ„€แ…ข แ„†แ…ตแ†พ แ„€แ…ฎแ„’แ…งแ†ซ

Untitled

  • createListView ์ƒ์„ฑ โ†’ router์—์„œ ์‚ฌ์šฉ

    • NewsView ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ”๋กœ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์Œ

      โ†’ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ์œ„์— ์ปดํฌ๋„ŒํŠธ(ํ•˜์ด์˜ค๋”)๊ฐ€ ํ•˜๋‚˜ ๋” ์ƒ๊น€

    {
        path: '/news', // url address
        name: 'news',
        // component: NewsView,
        component:  createListView('NewsView'),
    },
    {
        path: '/ask', // If you go to '/ask',
        name: 'asks',
        // component: AskView,
        component: createListView('NewsView'),
    },
    {
        path: '/jobs',
        name: 'jobs',
        // component: JobsView,
        component: createListView('NewsView'),
    },
  • ๋น„๊ต

    • NewView ๋กœ ๋ฐ”๋กœ ๊ฐ

    Untitled

    • createListView๋ฅผ ํ†ตํ•ด ๊ฐ€๋Š” ๊ฑด App๋ฐ‘์— ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜ ๋” ์ƒ๊น€
  • ListView.vue๋ฅผ ๋งŒ๋“ค์–ด createListView์— ๋žœ๋”๋ง

    import ListView from './ListView'
    
    export default function createListView (name) { 
        return { 
           name: name,
           render(createElement) {
                return createElement(ListView);
           }
        }
    }

33_ํ•˜์ด ์˜ค๋” ์ปดํฌ๋„ŒํŠธแ„‹แ…ฆแ„‰แ…ฅ แ„‰แ…กแ„‹แ…ญแ†ผแ„’แ…กแ†ฏ ListView แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ แ„€แ…ฎแ„’แ…งแ†ซ

  • ListView.vue : ๋ฐ์ดํ„ฐ๋ฅผ ๋ฟŒ๋ ค์ฃผ๋Š” ์—ญํ• 

  • createListView : ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ์—ญํ• 

  • router/index.js : createListView๋ฅผ ๊ฑฐ์ณ ํŽ˜์ด์ง€ ์ด๋™์„ ํ•˜๋„๋ก ํ•จ

    {
        path: '/news', // url address
        name: 'news',
        // component: NewsView,
        component:  createListView('NewsView'), // high order component
    },
    {
        path: '/ask', // If you go to '/ask',
        name: 'asks',
        // component: AskView,
        component: createListView('AskView'),
    },
    {
        path: '/jobs',
        name: 'jobs',
        // component: JobsView,
        component: createListView('JobsView'),
    },
  • CreateListView์—์„œ ๋ฐ์ดํ„ฐ ๋ฐ›์Œ

    created() {
        console.log(11111);
        bus.$emit('start:spinner'); 
        setTimeout(() => { 
            this.$store.dispatch('FETCH_LIST', this.$route.name)
                .then(() => {
                    bus.$emit('end:spinner');
                })
                .catch(err => console.log(err));
        }, 1500);
    },
  • ๊ทธ๊ฑธ ListView๋กœ ๋žœ๋”๋ง

    // (2) rendering
     render(createElement) {
          console.log(22222);
          return createElement(ListView);
     }
  • NewsView์— ListView ๋‚ด์šฉ ๋ฟŒ๋ ค์คŒ > NewsView, JobsView, AskView.vue ํ•„์š” ์—†์œผ๋ฏ€๋กœ ์‚ญ์ œ

    createListView('NewsView') ๊ฐ€ ์ž‘๋™๋˜๋ฉฐ, ListView๊ฐ€ ํŽ˜์ด์ง€ ์—ญํ• ์„ ํ•จ.
  • ListView.vue๋Š” ListItem ๋‚ด์šฉ์„ ๋ฟŒ๋ ค์คŒ

  • ListItem์— ํ™”๋ฉด ๊ตฌ์„ฑ : ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹จ๊ณ„์—์„œ ์™„๋ฃŒ๋์œผ๋ฏ€๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋จ

    <li v-for="item in listItems" :key="item.id">
    
    computed: {
        listItems() {
            return this.$store.state.list;
        }
    },
  • ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ(์ด์ „์—๋Š” NewsView ์•„๋ž˜ ๋ฐ”๋กœ ListItem์ด ์žˆ์—ˆ์Œ) : ์‹ค์งˆ์  hoc๋Š” NewsView

    Untitled

34_แ„’แ…กแ„‹แ…ต แ„‹แ…ฉแ„ƒแ…ฅ แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณแ„€แ…ก แ„Œแ…ฅแ†จแ„‹แ…ญแ†ผแ„ƒแ…ฌแ†ซ แ„‹แ…ขแ†ธ แ„€แ…ฎแ„Œแ…ฉ แ„‰แ…ฅแ†ฏแ„†แ…งแ†ผ แ„†แ…ตแ†พ แ„’แ…ณแ„…แ…ณแ†ท แ„Œแ…ฅแ†ผแ„…แ…ต

  • createListView
name: 'HOC component',
// ๊ทธ๋ƒฅ name์„ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด 
// component: createListView('AskView'), component: createListView('JobsView'),
// ์ฒ˜๋Ÿผ ์ธ์ž๊ฐ€ ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์ด ๋จ

Untitled

  • ์ฆ‰, NewsView, AskView, JobsView๊ฐ€ ํ•˜์ด์˜ค๋”์ปดํฌ๋„ŒํŠธ(hoc)

Untitled

  • ์ด์ œ NewsView, JobsView, AskView.vue ํ•„์š” ์—†์œผ๋ฏ€๋กœ ์‚ญ์ œ

๊ตฌ์กฐ

Untitled

๐Ÿ’ก ๋‹จ๊ณ„ router change โ†’ createListView(get data) โ†’ ListView(page view) โ†’ ListItem(component)

Mixinแ„‹แ…ด แ„€แ…ขแ„‹แ…ญแ„‹แ…ช แ„’แ…ชแ†ฏแ„‹แ…ญแ†ผแ„Žแ…ฅ แ„€แ…ณแ„…แ…ตแ„€แ…ฉ HOCแ„‹แ…ชแ„‹แ…ด แ„Žแ…กแ„‹แ…ตแ„Œแ…ฅแ†ท

  • hoc์˜ ๋‹จ์  : hoc๋ฅผ ๋งŽ์ด ์“ธ ์ˆ˜๋ก ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊นŠ์–ด์ง€๋ฏ€๋กœ, ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ํ†ต์‹ ์ด ์–ด๋ ค์›€

Untitled

  • Mixin : ์žฌํ™œ์šฉ ๋กœ์ง
    • ์žฅ์ 
      • mixin์— ์„ ์–ธ๋œ ์ฝ”๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ๋จ
      • spinner, modal๋“ฑ์„ Mixin์œผ๋กœ ๋นผ๋ฉด ํšจ์œจ์ด ์ข‹์Œ
      • crud๋ฅผ ์ œ์™ธํ•œ ๋ถ€์ฐจ์  ๋กœ์ง์€ ์ „๋ถ€ Mixin์œผ๋กœ ๋นผ๋ฉด ๋จ

35_**[แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ แ„‹แ…กแ†ซแ„‚แ…ข] Mixin แ„Œแ…ฅแ†จแ„‹แ…ญแ†ผ แ„’แ…ฎ HOC แ„€แ…ฎแ„Œแ…ฉแ„‹แ…ช แ„‡แ…ตแ„€แ…ญ, [แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ] Mixin แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ แ„†แ…ตแ†พ แ„แ…ฅแ†ทแ„‘แ…ฉแ„‚แ…ฅแ†ซแ„แ…ณ แ„Œแ…ขแ„’แ…ชแ†ฏแ„‹แ…ญแ†ผ แ„‡แ…กแ†ผแ„‡แ…ฅแ†ธแ„‹แ…ฆ แ„ƒแ…ขแ„’แ…กแ†ซ

แ„…แ…ตแ„‡แ…ฒ**

  • NewsView : mixins๋ฅผ ์„ ์–ธํ•˜๋ฉด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋กœ์ง์„ ๋ถˆ๋Ÿฌ์˜ด
export default {
  components: {
    ListItem,
  },
  mixins: [ListMixin]
}
  • hoc ์™€ mixin ๋น„๊ต

hoc - listview๋ฅผ ๊ฑฐ์นจ hoc - listview๋ฅผ ๊ฑฐ์นจ

mixin - ๋ฐ”๋กœ listitem mixin - ๋ฐ”๋กœ listitem

UX๋ฅผ ๊ณ ๋ คํ•œ ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ ์‹œ์ 

  • ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ ์‹œ์ 
    1. ์ปดํฌ๋„ŒํŠธ ๋ผ์ดํ”„ ์‚ฌ์ดํด ํ›… : create

      1. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์ž๋งˆ์ž ์ƒ์„ฑ๋˜๋Š” ๋กœ์ง
      2. ๊ธฐ๋ณธ์  vue์˜ ๋™์ž‘ ์›๋ฆฌ(๋ฐ์ดํ„ฐ ๊ด€์ฐฐ, computed, watch ์ฝœ๋ฐฑ ๋“ฑ)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ดํ”„ ์‚ฌ์ดํด ํ›…
      3. ํ™”๋ฉด์— ์ธ์Šคํ„ด์Šค ๋‚ด์šฉ๋“ค์ด ๋ถ™์–ด์žˆ์ง€ ์•Š๋Š” ์ƒํƒœ
      4. ์ฆ‰, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์ž๋งˆ์ž ํ˜ธ์ถœ๋˜๋Š” ๋กœ์ง
    2. ๋ผ์šฐํ„ฐ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ : ์ปดํฌ๋„ŒํŠธ์— ์ง„์ž…ํ•˜๊ธฐ ์ „์— ๋ผ์šฐํ„ฐ ์†์„ฑ์„ ์ด์šฉ(๊ณต์‹๋ฌธ์„œ)

      1. ๋ผ์šฐํ„ฐ๋กœ ํŠน์ • url์— ์ ‘๊ทผํ•˜๊ธฐ ์ „์˜ ๋™์ž‘๋“ค์„ ์ •์˜

      2. ํŠน์ • url์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•œ๋‹ค๋˜์ง€, ์ธ์ฆ๊ฐ’์„ ํ™•์ธํ•œ๋‹ค๋˜์ง€

      3. ์ฆ‰, ํŠน์ • url๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์ „์˜ ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” ์†์„ฑ(ํ•จ์ˆ˜)

        router.beforeEach(function (to, from, next) {
          // ๋ผ์šฐํ„ฐ ์ฃผ์†Œ์— ์ง„์ž…ํ•˜๊ธฐ ์ „์— ์–ด๋–ค ๋กœ์ง์„ ์—ฌ๊ธฐ ์ฝœ๋ฐฑ ์•ˆ์— ์ •์˜
          // ์ด ๋กœ์ง์ด ๋๋‚˜๊ณ  next๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ๋งŒ ์˜๋„ํ•œ ์œ„์น˜๋กœ ๊ฐ€๋Šฅ
        });
    3. ์ˆœ์„œ๋Š” ๋ผ์šฐํ„ฐ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ๊ฐ€ ๋จผ์ €์ž„

      1. ๋ผ์ดํ”„ ์‚ฌ์ดํด ํ›… : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋‚˜์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœํ• ๊ฑด์ง€
      2. ๋ผ์šฐํ„ฐ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ „์— ๋ผ์šฐํŒ… ์ƒํƒœ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœํ• ๊ฑด์ง€

36_แ„…แ…กแ„‹แ…ตแ„‘แ…ณ แ„‰แ…กแ„‹แ…ตแ„แ…ณแ†ฏ แ„’แ…ฎแ†จแ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„’แ…ฉแ„Žแ…ฎแ†ฏ แ„‡แ…กแ†ผแ„‡แ…ฅแ†ธ์˜ ๋ฌธ์ œ์™€ แ„‡แ…ตแ„ƒแ…ฉแ†ผแ„€แ…ต แ„Žแ…ฅแ„…แ…ต แ„แ…ฉแ„ƒแ…ณ แ„‰แ…ฎแ„Œแ…ฅแ†ผ

  • News ๋ฉ”๋‰ด์—์„œ Ask ๋ฉ”๋‰ด๋กœ ์ด๋™ํ•˜๋Š”๋ฐ, NewsView ๋ชฉ๋ก์ด ์ž ๊น ๋ณด์ด๊ณ  AskView ๋ชฉ๋ก์ด ์ถœ๋ ฅ๋˜๋Š” ํ˜„์ƒ์— ๋Œ€ํ•˜์—ฌ
state: {
  news: [],
    jobs
:
  [],
    // ์ด๋ ‡๊ฒŒ ๊ฐ๊ฐ ๋‚˜๋‰˜์–ด์ ธ ์žˆ์„ ๋•Œ๋Š” ์˜ค๋™์ž‘์ด ๋‚˜์ง€ ์•Š์•˜์Œ
    list
:
  [],
  // list๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ news, jobs, askview๊ฐ€ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋™์ž‘ ๋ฐœ์ƒ
}
,
  • spinner๊ฐ€ ์•ˆ ๋„๋Š” ์˜ค๋ฅ˜ : return ๋นผ๋จน์Œ

    • return fetchList์„ ํ•˜๋Š” ์ด์œ  : ํ™”๋ฉด์—์„œ dispatch๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‚˜์„œ, then์œผ๋กœ ์ฒด์ด๋‹์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ return์ด ์•ˆ ๋„˜์–ด์˜ค๋ฉด ์˜๋„๋Œ€๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์Œ
    FETCH_LIST({ commit }, name) {
          return fetchList(name)
              .then(res => { // get data
                  commit('SET_LIST', res.data); // send mutation
                  return res; // return response(send Promise object to View Page - in this case, NewsView.vue)
              })
              .catch(err => console.log(err));
      },
      FETCH_USER(context) {
          return fetchUserInfo()
          .then(res => {
              context.commit('SET_USER', res.data);
          })
          .catch(err => console.log(err));
      },
      FETCH_ITEM({ commit }, id) {
          return fetchCommentItem(id)
          .then(({ data }) => {
              commit('SET_ITEM', data);
          })
          .catch(err => console.log(err));
      },
    • mixin.js
    created() { 
        bus.$emit('start:spinner');
        // #1
        console.log(1);
        this.$store.dispatch('FETCH_LIST', this.$route.name)
        // #5
            .then(() => {
                console.log(5);
                bus.$emit('end:spinner');
            })
            .catch(err => console.log(err));
    },
    • actions.js
      • fetchList์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ€ Promise๋กœ ์ฒด์ด๋‹์ด ๋˜์–ด, #5์— .then()์ด ๋จ
      • fetchList ์•ž์— return์ด ์—†์„ ์‹œ #5๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ
    // #2
    FETCH_LIST({ commit }, name) {
        // #3
        console.log(3);
        return fetchList(name)
        // #4
            .then(res => {
                console.log(4);
                commit('SET_LIST', res.data); 
                return res; 
            })
            .catch(err => console.log(err));
    },

37_แ„…แ…กแ„‹แ…ฎแ„แ…ฅ แ„‚แ…ฆแ„‡แ…ตแ„€แ…ฆแ„‹แ…ตแ„‰แ…งแ†ซแ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„’แ…ฉแ„Žแ…ฎแ†ฏ แ„‡แ…กแ†ผแ„‡แ…ฅแ†ธ

  • router/index

    {
        path: '/news', // url address
        name: 'news',
        component: NewsView, // high order component
        beforeEnter: (to, from, next) => {
            console.log(to)
            console.log(from)
            console.log(next)
        } 
    },

    Untitled

    Untitled

    beforeEnter: (to, from, next) => {
        next();
    }
    // next๋ฅผ ํ˜ธ์ถœํ•ด ์ค˜์•ผ url๋„˜์–ด๊ฐ

[แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ] แ„…แ…กแ„‹แ…ฎแ„แ…ฅ แ„‚แ…ฆแ„‡แ…ตแ„€แ…ฆแ„‹แ…ตแ„‰แ…งแ†ซ แ„€แ…กแ„ƒแ…ณ แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ แ„‹แ…กแ†ซแ„‚แ…ข

  • ๋‚ด์šฉ์—†์Œ

38_[แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ] แ„…แ…กแ„‹แ…ฎแ„แ…ฅ แ„‚แ…ฆแ„‡แ…ตแ„€แ…ฆแ„‹แ…ตแ„‰แ…งแ†ซ แ„€แ…กแ„ƒแ…ณ ์‹ค์Šต ๋ฐ ์Šคํ”ผ๋„ˆ ์ข…๋ฃŒ ์‹œ์  ๋ณ€๊ฒฝ

  • spinner ์‹œ์ ์ด ์•ฝ๊ฐ„ ์•ˆ ๋งž์Œ โ†’ mounted(์ธ์Šคํ„ด์Šค๊ฐ€ ํ™”๋ฉด์— ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ)์— spinner ์ข…๋ฃŒ์‹œํ‚ค๊ธฐ

แ„Œแ…กแ„‡แ…กแ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ธแ„แ…ณ แ„‡แ…ตแ„ƒแ…ฉแ†ผแ„€แ…ต แ„Žแ…ฅแ„…แ…ต แ„‘แ…ขแ„แ…ฅแ†ซแ„‹แ…ด แ„‡แ…กแ†ฏแ„Œแ…ฅแ†ซ แ„€แ…ชแ„Œแ…ฅแ†ผ

  1. ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ

    john์ด๋ผ๋Š” id๊ฐ€ ์žˆ์„ ์‹œ products ํ•จ์ˆ˜ ์‹คํ–‰

    john์ด๋ผ๋Š” id๊ฐ€ ์žˆ์„ ์‹œ products ํ•จ์ˆ˜ ์‹คํ–‰

    ๋ฐ›์•„ ์˜จ ๊ฒฐ๊ณผ ๊ฐ’ products๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

    ๋ฐ›์•„ ์˜จ ๊ฒฐ๊ณผ ๊ฐ’ products๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

  2. promise๋กœ ์“ฐ๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ

    ํ•จ์ˆ˜ ํ•จ์ˆ˜

    ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋กœ์ง ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋กœ์ง

  3. 2์—์„œ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ข€ ๋” ๋ช…์‹œ์ ์œผ๋กœ

    Untitled

  • ๊ฒฐ๊ตญ, john ์ด๋ผ๋Š” id๊ฐ€ ์žˆ์„ ์‹œ ๋ถˆ๋Ÿฌ์˜จ products๊ฐ’์„ products ๋ณ€์ˆ˜์— ๋‹ด๊ณ , ์ด ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๊ณผ์ •์ด ํ•ต์‹ฌ.

    ๋…ผ๋ฆฌ๊ณผ์ • ์˜ˆ์‹œ(์‹ค์ œ๋กœ์ง ์•„๋‹˜)

    ๋…ผ๋ฆฌ๊ณผ์ • ์˜ˆ์‹œ(์‹ค์ œ๋กœ์ง ์•„๋‹˜)

async & await ๋ฌธ๋ฒ• ์†Œ๊ฐœ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ async์™€ await, [2]
  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์•ž์— async๋ฅผ ๋ถ™์ด๊ณ , ๊ทธ async function ์•ˆ์— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋กœ์ง ์•ž์— await๋ฅผ ๋ถ™์—ฌ์คŒ.
async function ํ•จ์ˆ˜๋ช…() {
  await ๋น„๋™๊ธฐ_์ฒ˜๋ฆฌ_๋ฉ”์„œ๋“œ_๋ช…();
}

39_async & await ์˜ˆ์ œ ์†Œ๊ฐœ

  • ์ƒ๋žต

40_async await แ„‹แ…จแ„Œแ…ฆ แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ

  • ์ƒ๋žต

41_async await แ„‹แ…ฆแ„…แ…ฅ แ„Žแ…ฅแ„…แ…ต แ„‡แ…กแ†ผแ„‡แ…ฅแ†ธแ„€แ…ช แ„€แ…ฉแ†ผแ„แ…ฉแ†ผแ„’แ…ช แ„’แ…กแ†ทแ„‰แ…ฎ แ„Œแ…กแ†จแ„‰แ…ฅแ†ผ แ„‡แ…กแ†ผแ„‡แ…ฅแ†ธ

  • promise์˜ then, catch : ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ๋น„๋™๊ธฐ ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋งŒ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
loginUser()
{
  axios.get('https://jsonplaceholder.typicode.com/users/1')
    .then(response => {
      if (response.data.id === 1) {
        axios.get('https://jsonplaceholder.typicode.com/todos')
          .then(response2 => console.log(response2))
          .catch(error => console.log(error));
      }
    })
    .catch(error => console.log(error));
}
  • async, await์˜ try-catch : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์š”์ฒญ๋ฟ ์•„๋‹ˆ๋ผ, ์ผ๋ฐ˜์  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์—๋Ÿฌ๊นŒ์ง€ ํฌ๊ด„์ ์œผ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
async
loginUser2()
{
  try {
    var response = await axios.get('https://jsonplaceholder.typicode.com/users/1');
    if (response.data.id === 1) {
      var response2 = await axios.get('https://jsonplaceholder.typicode.com/todos');
      console.log(response2);
    }
  } catch (error) {
    handleException(error);
    console.log(error);
  }
}
  • ๊ณตํ†ต ์—๋Ÿฌ์ฒ˜๋ฆฌ : utils/handelException.js
function handleException(status) {
  // handle error logic
}

42_async ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง

  • api ๊ฒฐ๊ณผ๊ฐ’์€ new Promise(); ํ˜•ํƒœ
function fetchList(name) {
  return axios.get(`${config.baseUrl}/${name}/1.json`);
  // = return new Promise();
}
  • return response๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ํ™”๋ฉด์—์„œ ๋น„๋™๊ธฐ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹

  • ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค˜์•ผ FETCH_LIST2(); ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ด์–ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ.

    โ‡’ FETCH_LIST2().then().catch();

  • async ํ•จ์ˆ˜์—์„œ ์–ด๋–ค ๊ฒƒ์„ ๋ฆฌํ„ดํ•˜๋˜ promise๊ฐ€ ๋ฆฌํ„ด๋จ.

async
FETCH_LIST({commit}, name)
{
  const response = await fetchList(name);
  commit('SET_LIST', response.data);
  return response; // promise
}
,

[แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ แ„‹แ…กแ†ซแ„‚แ…ข] async await แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ แ„‹แ…กแ†ซแ„‚แ…ข

  • ๋‚ด์šฉ ์—†์Œ

43_[แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ] async await แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ แ„‘แ…ฎแ†ฏแ„‹แ…ต

  • ์ƒ๋žต

แ„…แ…กแ„‹แ…ตแ„‡แ…ณแ„…แ…ฅแ„…แ…ต แ„†แ…ฉแ„ƒแ…ฒแ†ฏแ„’แ…ชแ„‹แ…ด แ„‹แ…ตแ„‹แ…ฒแ„‹แ…ช แ„‡แ…ขแ„€แ…งแ†ผ

  1. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋“ˆํ™”
    • ์ด์œ  : vue.js ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†์„ ๋•Œ ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ.
    • ์ข…๋ฅ˜ : ์ฐจํŠธ, ๋ฐ์ดํŠธ ํ”ผ์ปค, ํ…Œ์ด๋ธ”, ์Šคํ”ผ๋„ˆ

44_แ„Žแ…กแ„แ…ณ แ„…แ…กแ„‹แ…ตแ„‡แ…ณแ„…แ…ฅแ„…แ…ต แ„‰แ…ฅแ†ฏแ„Žแ…ต แ„†แ…ตแ†พ ์ฐจํŠธ ๊ทธ๋ฆฌ๊ธฐ

  • ์„ค์น˜
npm
install
chart.js

Reference

About

๐Ÿ”ฐVue.js for Advanced๐Ÿ”ฐ


Languages

Language:Vue 53.1%Language:JavaScript 34.5%Language:HTML 12.4%