abarthdew / vue-lesson

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

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

vue-lesson{:target="_blank"}

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

Untitled

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

Untitled

Untitled

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

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 ํฌ๋กฌ ํ™•์žฅ ์„ค์น˜

๊ฐ•์˜ ๋Œ€์ƒ

Untitled

vue ์„ค์น˜

// vue ์„ค์น˜
jonah@jonah-15U530-LH10K:~/Documents/vue-lesson$ npm install @vue/cli

โš ๏ธ npm install -g @vue.cli : ๊ธ€๋กœ๋ฒŒ๋กœ ์„ค์น˜ํ•˜๋ฉด ์—๋Ÿฌ๋‚จ
npm WARN checkPermissions Missing write access to /usr/local/lib
๊ถŒํ•œ ์—๋Ÿฌ์ธ ๋“ฏํ•œ๋ฐ ๊ท€์ฐฎ์•„์„œ ์ „์—ญ ์˜ต์…˜ ๋บŒ
์˜ค๋ฅ˜ ์ถœ์ฒ˜

jonah@jonah-15U530-LH10K:~/Documents/vue-lesson$ vue -version
// ๋ฒ„์ „ ์กฐํšŒํ–ˆ๋”๋‹ˆ ์˜ค๋ฅ˜๋‚˜์„œ ์‹œํ‚ค๋Š” ๋Œ€๋กœ ์„ค์น˜ํ•จ
Command 'vue' not found, but can be installed with:
sudo snap install vue

โ†’ ์ด๊ฑฐ ์•„๋‹˜

sudo npm install -g @vue/cli

โ†’ ์ด๊ฒƒ๋„ ์•„๋‹˜

jonah@jonah-15U530-LH10K:~/Documents/vue-lesson$ vue -version
bash: /snap/bin/vue: No such file or directory

โ†’ ์ง€์šฐ๊ณ  ๋‹ค์‹œ ์‹œ์ž‘

root@jonah-15U530-LH10K:~# npm uninstall -g @vue/cli
npm clear cache --force

โ†’ ๋‹ค์‹œ ์„ค์น˜

sudo npm install vue
sudo npm install -g @vue/cli

root@jonah-15U530-LH10K:~# vue --version
@vue/cli 4.5.15

root@jonah-15U530-LH10K:~# ls
node_modules  package-lock.json  snap

root@jonah-15U530-LH10K:/home/jonah/Documents/vue-lesson# vue init webpack vue-todo

โ†’ vue init webpack vue-todo : vue/cli2 ๋ช…๋ น์–ด๋ผ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ 2๋ฅผ ์„ค์น˜ํ•˜๋ผ๋Š” ์—๋Ÿฌ ์ถœ๋ ฅ

Command vue init requires a global addon to be installed.
  Please run npm i -g @vue/cli-init and try again.

// ์„ค์น˜
root@jonah-15U530-LH10K:/home/jonah/Documents/vue-lesson# npm i -g @vue/cli-init
root@jonah-15U530-LH10K:/home/jonah/Documents/vue-lesson# sudo vue init webpack vue-todo

? Project name vue-todo
? Project description A Vue.js project
? Author 
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Set up unit tests Yes
? Pick a test runner jest
? Setup e2e tests with Nightwatch? Yes
? Should we run `npm install` for you after the project has been created? (rec
ommended) npm

# Project initialization finished!
# ========================
To get started:
  cd vue-todo
  npm run dev

โ†’ ์„ค์น˜๋˜๊ธด ํ•จ. ๊ทผ๋ฐ vue/cli3 ๋กœ ํ•ด์•ผ์ง€.

// vue create
$ vue create vue-todo-cli3
Vue CLI v4.5.15
? Please pick a preset: (Use arrow keys)
โฏ Default ([Vue 2] babel, eslint) 
  Default (Vue 3) ([Vue 3] babel, eslint) 
  Manually select features

๐Ÿ“Œ vue/cli2, 3 ์ฐจ์ด์ 

โ†’ ์—๋Ÿฌ

npm ERR! code EINTEGRITY
npm ERR! sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== integrity checksum failed when using sha512: wanted sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== but got sha512-z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==. (0 bytes)

โ†’ ํ•ด๊ฒฐ : ์„ฑ๊ณต!!

// ๋กœ์ปฌ ํ„ฐ๋ฏธ๋„ ์—ด์–ด์„œ ๋ช…๋ น์–ด ์ž…๋ ฅํ•˜๊ณ 
**jonah@jonah-15U530-LH10K:~$ sudo -i**
[sudo] password for jonah: 
**root@jonah-15U530-LH10K:~# npm cache verify**
Cache verified and compressed (~/.npm/_cacache):
Content verified: 2240 (49187580 bytes)
Index entries: 3472
Finished in 8.761s
**root@jonah-15U530-LH10K:~# npm install -g create-react-app**
npm WARN deprecated tar@2.2.2: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.
/usr/local/bin/create-react-app -> /usr/local/lib/node_modules/create-react-app/index.js
+ create-react-app@4.0.3
updated 1 package in 1.077s

// vscode ํ„ฐ๋ฏธ๋„์—์„œ vue create ํ•˜๋‹ˆ๊นŒ ๋จ
**root@jonah-15U530-LH10K:/home/jonah/Documents/vue-lesson# vue create vue-todo-cli3**
๐ŸŽ‰  Successfully created project vue-todo-cli3.
๐Ÿ‘‰  Get started with the following commands:

 $ cd vue-todo-cli3
 $ npm run serve
  • ํ•„์š”์—†๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋Š” ์ „๋ถ€ ์‚ญ์ œ
$ sudo rm -rf [directory]

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ ๋ฐฉ๋ฒ•

  • ์ด 4๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ

Untitled

ํŒŒ๋น„์ฝ˜, ์•„์ด์ฝ˜, ํฐํŠธ, ๋ฐ˜์‘ํ˜• ํƒœ๊ทธ ์„ค์ •ํ•˜๊ธฐ

TodoHeader ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„

  • ์ƒ๋žต

TodoInput ์ปดํฌ๋„ŒํŠธ์˜ ํ•  ์ผ ์ €์žฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„

Untitled

11_๋ฆฌํŒฉํ† ๋ง

  • ์žฌ์ •๋น„

    Untitled

    Untitled

    • ํ”„๋ ˆ์  ํŠธ ์ปดํฌ๋„ŒํŠธ : ๋‹จ์ˆœํžˆ ํ™”๋ฉด์„ ํ‘œํ˜„ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ (input, list, footer)
    • ์ปดํฌ๋„ŒํŠธ : ์•ฑ์˜ ๋™์ž‘, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ํ‘œํ˜„๋‹จ (app)
    • ์ฆ‰, ์ „์ฒด์  ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฅผ app ํ•œ๊ตฐ๋ฐ๋กœ ๋ชฐ์•„๋„ฃ๊ณ , ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ ์กฐ์ž‘์ด ๋ฐœ์ƒ.

๋ฆฌํŒฉํ† ๋ง ์ •๋ฆฌ

  • app.vue์— ๋ฉ”์„œ๋“œ ๋ชจ์Œ(์ปดํฌ๋„ŒํŠธ ์ปจํ…Œ์ด๋„ˆ)
<todo-input @addTodoItem="addOneItem"/>
<todo-list
  :propsData="todoItems"
  @removeItem="removeOneItem"
  @toggleCompleteItem="toggleCompleteOneItem"
/>
<todo-footer @clearAll="clearAllItems"></todo-footer>
addOneItem(todoItem)
{
  // ...
}
},
removeOneItem(todoItem, index)
{
  // ...
}
,
toggleCompleteOneItem(index)
{
  // ...
}
,
clearAllItems()
{
  // ...
}
  • todo.vue์—์„œ๋Š” ui์  ํ‘œํ˜„, emit์œผ๋กœ ์ด๋ฒคํŠธ ์˜ฌ๋ฆฌ๊ธฐ๋งŒ ๋‹ด๋‹น(ํ”„๋ ˆ์  ํ…Œ์ด์…”๋„ ์ปดํฌ๋„ŒํŠธ)
// input
addTodo()
{
  this.$emit('addTodoItem', this.newTodoItem);
}
// list
removeTodo(todoItem, index)
{
  this.$emit('removeItem', todoItem, index);
}
,
toggleComplete(index)
{
  this.$emit('toggleCompleteItem', index);
}

16_Todo App - ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ 

  • ์–ด๋–ค ๊ฒƒ๋“ค์ด ์ˆ˜์ •๋˜๊ณ , ์‚ญ์ œ๋๋Š”์ง€ ์œก์•ˆ์œผ๋กœ ๊ตฌ๋ณ„์ด ์–ด๋ ค์›€ โ†’ vue ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠธ๋žœ์ง€์…˜, ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ด์šฉํ•ด ๋ฌธ์ œ์  ํ•ด๊ฒฐํ•˜๊ธฐ

  • ๋ชจ๋‹ฌ : https://vuejs.org/v2/examples/modal.html

  • x-template : ES5 ๊ธฐ์ค€ / ํƒฌํ”Œ๋ฆฟ์„ ๋ชจ๋“ˆํ™”ํ•œ ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์”€

    <script type="text/x-template" id="modal-template">
    // register modal component
    Vue.component("modal", {
      template: "#modal-template"
    });
    // #modal-template id๋ฅผ ๊ฐ€์ง„ x-template์„ ์ฐพ์•„ modal ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๊ฒ ๋‹ค
  • Slot ํƒœ๊ทธ : ํƒœ๊ทธ๋ฅผ ์จ ๋†“์œผ๋ฉด Modal.vue๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ์žฌ์ •์˜ ๊ฐ€๋Šฅ

    • Modal.vue
    <!--MODAL HEADER-->
      <div class="modal-header">
        <slot name="header">
          default header
        </slot>
      </div>
    <!--MODAL BODY-->
      <div class="modal-body">
        <slot name="body">
          default body
        </slot>
      </div>
    <!--MODAL FOOTER-->
      <div class="modal-footer">
        <slot name="footer">
          default footer
          <button class="modal-default-button" @click="$emit('close')">
            OK
          </button>
        </slot>
        <!--THIS slot PART: you can refactor this <slot>part</slot> on TodoInput.vue(where it is slot implemented)-->
      </div>
    • Input.vue
    <modal v-if="showModal" @close="showModal = false">
      <!--
      *** you can use custom content here to overwrite
      default content ***
      -->
      <h3 slot="header">custom header<!--Not "default header" in Modal.vue--></h3>
      <h3 slot="body">custom body<!--์žฌ์ •์˜--></h3>
      <h3 slot="footer">custom footer<!--์žฌ์ •์˜--></h3>
      <!-- slot: refactoring  specific component or any part. so, you may reuse UI parts in any compnent-->
    </modal>
    • ํ™”๋ฉด : default heaer๊ฐ€ ์•„๋‹Œ custom header๊ฐ€ ์ถœ๋ ฅ๋จ

    Untitled

18_ํŠธ๋ Œ์ง€์…˜ ์†Œ๊ฐœ ๋ฐ ๊ตฌํ˜„

ES6

Untitled

Untitled

  • ES6๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๊ฐ„์ƒ ํšจ์œจ์ ์ด๊ณ , ๋น ๋ฅด๊ฒŒ ํ”„๋กœํ† ํƒ€์ดํ•‘ ํ•  ์ˆ˜ ์žˆ๊ณ , ๋น ๋ฅด๊ฒŒ ์žฌ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž ์Šค์Šค๋กœ๊ฐ€ ํŽธํ•ด์ง

ES6๋ž€?

Untitled

  • ES6๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›๋˜๋Š” ์–ธ์–ด๋Š” ์•„๋‹˜
  • ๊ทธ๋ž˜์„œ, BABEL๋กœ ์ตœ๋Œ€ํ•œ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง(ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ES5๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ปดํŒŒ์ผ๋ง)ํ•ด์•ผ ํ•จ

Untitled

  • vue CLI๋ฅผ ์ด์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, webpack.config ๋“ฑ์„ ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ, ๋ฌด์Šจ ๊ธฐ๋Šฅ์„ ํ•˜๋Š”์ง€๋Š” ์•Œ๊ณ  ์žˆ์–ด์•ผํ•จ.

Untitled

  • ์œ„์ชฝ์ด ES6 ๋ฌธ๋ฒ• โ†’ ์•„๋ž˜์ชฝ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ES5๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜

const & let

Untitled

  • ๊ธฐ์กด js๊ฐ€ ๊ฐ€์ง„ ์œ ์—ฐํ•จ, ํ˜น์€ ์• ๋งค๋ชจํ˜ธํ•จ์„ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•จ.

  • const ๋Š” ๊ฐ’ ์žฌํ• ๋‹น ๋ถˆ๊ฐ€

    Untitled

  • let์€ ๊ฐ’ ์žฌํ• ๋‹น ๊ฐ€๋Šฅ

    Untitled

[ES5์˜ ์ฃผ์š” ํŠน์ง•]๋ณ€์ˆ˜ ์Šค์ฝ”ํ”„์™€ ํ˜ธ์ด์ŠคํŒ…

Untitled

  • for๋ฌธ ์•ˆ์—์„œ var i๋ฅผ ์„ ์–ธํ–ˆ์„ ๋•Œ, i๋Š” ์ „์—ญ๋ณ€์ˆ˜๊ฐ€ ๋จ

Untitled

  • Hoist : ๋Œ์–ด์˜ฌ๋ ค์ง„๋‹ค

    Untitled

  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹ X, ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ๋ณ€์ˆ˜๋งŒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ™•๋„ ๋จผ์ € ๋จ

Untitled

  • ์œ„ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š์Œ
    • 1์ˆœ์œ„ - var i, function์ด ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง
    • 2์ˆœ์œ„ - sum, i = 10 ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ๋งจ ๋งˆ์ง€๋ง‰์— ์ด๋ฃจ์–ด์ง
  • ๊ฒฐ๋ก ์ ์œผ๋กœ, ์œ„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๋จ

Untitled

const์™€ let ์ถ”๊ฐ€ ์„ค๋ช… ๋ฐ ์ •๋ฆฌ

Untitled

  • for๋ฌธ ์•ˆ์—์„œ ์„ ์–ธํ•œ let i๋Š” for๋ฌธ ๋ฐ–์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€

Untitled

  • const : ๋ฌธ์ž์—ด์€ ์žฌํ• ๋‹น ๋ถˆ๊ฐ€์ด๋‚˜, ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฐฐ์—ด์€ ์žฌํ• ๋‹น ๊ฐ€๋Šฅ

    Untitled

Untitled

Untitled

  • let x, const x๋Š” ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๋‘˜์€ ์ถฉ๋Œ์ด ๋‚˜์ง€ ์•Š์Œ

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์†Œ๊ฐœ ๋ฐ ์„ค๋ช…

Untitled

// ES5 : function
function () {
}

// EX6 : arrow
() => {
}

Untitled

์‹ค์Šต : BABELํ™ˆํŽ˜์ด์ง€

แ„‰แ…ฉแ†จแ„‰แ…ฅแ†ผ แ„†แ…ฆแ„‰แ…ฅแ„ƒแ…ณแ„‹แ…ด แ„Žแ…ฎแ†จแ„‹แ…ฃแ†จ ํŠน์ง• แ„‰แ…ฅแ†ฏแ„†แ…งแ†ผ

Untitled

Untitled

แ„‰แ…ฉแ†จแ„‰แ…ฅแ†ผแ„†แ…งแ†ผแ„‹แ…ด แ„Žแ…ฎแ†จแ„‹แ…ฃแ†จ แ„แ…ณแ†จแ„Œแ…ตแ†ผ แ„‰แ…ฅแ†ฏแ„†แ…งแ†ผ

Untitled

๋ชจ๋“ˆ

Untitled

  • ES5 ๊ธฐ์ค€ ๋ชจ๋“ˆ ๊ธฐ๋Šฅ์ด ์—†์—ˆ์Œ โ†’ Common js๋ฅผ ๊ฐ€์ ธ๋‹ค ์จ์„œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ–ˆ์Œ
  • ๋ชจ๋“ˆ : ํŠน์ • ๊ธฐ๋Šฅ์„ ์‹œํ–‰ํ•˜๋Š” ํ•œ ๋‹จ์œ„, ๋ฉ์–ด๋ฆฌ
    • ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋›ฐ์–ด๋‚œ ๊ธฐ๋Šฅ๋“ค์„ ๋ฌถ์–ด ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ–๋‹ค ์”€
    • ํŒŒ์ผ๋ณ„๋กœ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ ธ๊ฐ
    • import ๋ฅผ ํ•  ๋•Œ export๊ฐ€ ์‹คํ–‰๋จ

Untitled

  • default : ํ•œ ๊ฐœ ํŒŒ์ผ์—์„œ ํ•˜๋‚˜๋งŒ export ๋จ โ†’ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ด ์“ธ๋ฐ์—†์ด import๋˜์ง€ ์•Š๊ฒŒ ํ•จ โ‡’ ๋ชจ๋“ˆํ™”(encapsulation)

Vuex - ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Untitled

  • ์ˆ˜๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ
  • ๋ฆฌ์•กํŠธ(flux ํŒจํ„ด), ์•ต๊ทค๋Ÿฌ๋ฅผ ๋‹ต์Šต, ์žฅ์ ์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ณผ์ •์—์„œ ์ƒ๊ธด ํ˜•์ œ ํ”„๋ ˆ์ž„์›Œํฌ
  • state(data), getters(computed), mutations(sync method), actions(async method)

Untitled

Vuex๋ž€?

Untitled

  • ์•ฑ์ด ์ปค์กŒ์„ ๋•Œ, ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•

Untitled

  • ํŽ˜์ด์Šค๋ถ ๊ฐœ๋ฐœ์ž๋“ค์ด MVCํŒจํ„ด, ๋ฆฌ์•กํŠธ๋กœ ๊ฐœ๋ฐœํ•˜๋‹ค๊ฐ€ ๋งŒ๋“ค์–ด๋ƒ„
  • ์ „์ฒด์  ์•ฑ์˜ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•จ
  • Unidirectional data flow : ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์›€์ง์ž„
  • Dispatcher : ๋ชจ๋ธ์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•œ ์—ญํ•  ๋”ฑ ํ•˜๋‚˜ ์žˆ์Œ.

Untitled

Untitled

  • ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์ถ”์ ํ•  ์ˆ˜ ์—†์Œ โ†’ ์–ด๋–ค ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธฐ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ.

Untitled

  • ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์ •ํ˜•ํ™”์‹œ์ผœ ํ–ฅํ›„์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์  ๋ฐฉ์ง€
  • store = model

Vuexแ„€แ…ก แ„‘แ…ตแ†ฏแ„‹แ…ญแ„’แ…กแ†ซ แ„‹แ…ตแ„‹แ…ฒ, Vuex แ„แ…ฅแ†ซแ„‰แ…ฆแ†ธ, Vuex แ„€แ…ฎแ„Œแ…ฉ

Untitled

  • ๋งŒ์•ฝ porps๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง

Untitled

Untitled

Untitled

  • state : ์ƒํƒœ
  • view(ํ…œํ”Œ๋ฆฟ ํ™”๋ฉด์—์„œ add ๋ฒ„ํŠผ ํด๋ฆญ) โ†’ action ๋ฐœ์ƒ(addTodo๋ฉ”์„œ๋“œ ๋ฐœ์ƒ) โ†’ state ๋ณ€๊ฒฝ๋จ(this.item.push(โ€™itemโ€™))

Untitled

20_vuex ์„ค์น˜ํ•˜๊ธฐ

  • EX6๋กœ ์„ค์น˜

Untitled

  • vuex๋Š” ๋ณดํ†ต store๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๊ด€ํ–‰์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ํด๋”๊ฐ€ ์žˆ์Œ โ†’ /src/store/store.js
  • store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex); // use vue plugin
  • use : ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ „์—ญ์œผ๋กœ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ โ†’ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์—์„œ this.$store์™€ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ์Œ

state์™€ getters ์†Œ๊ฐœ

Untitled

Untitled

Untitled

21_[๋ฆฌํŒฉํ† ๋ง] state ์†์„ฑ ์ ์šฉ

Untitled

Untitled

mutationsแ„‹แ…ช commit() แ„’แ…งแ†ผแ„‰แ…ตแ†จ แ„‰แ…ฉแ„€แ…ข

Untitled

  • mutation์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฌด์กฐ๊ฑด state
  • 20 = anotherNum

Untitled

  • payload : ๊ด€ํ–‰์ƒ ์ด๋Ÿฐ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ

22_[๋ฆฌํŒฉํ† ๋ง&ํ€ด์ฆˆ] mutations ํ€ด์ฆˆ ํ’€์ด ๋ฐ ํ•  ์ผ ์ง€์šฐ๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„

  • ์ƒ๋žต

์™œ mutations๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

Untitled

Untitled

  • vue components โ†’ (commit) โ†’ mutation โ†’ (mutate) โ†’ state : mutation์€ state์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•จ
  • Devtools(๊ฐœ๋ฐœ์ž๋„๊ตฌ)๋กœ state๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

actions ์†Œ๊ฐœ ๋ฐ ์˜ˆ์ œ

Untitled

  • context : actions์—์„œ mutation์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ
  • ์ฆ‰, actions๋Š” mutation์—๊ฒŒ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ์—ญํ• 

Untitled

Untitled

์™œ actions์— ๋น„๋™๊ธฐ ๋กœ์ง์„ ์„ ์–ธํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

Untitled

  • actions์—์„œ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด, ๋ฌด์กฐ๊ฑด mutation์œผ๋กœ ๋“ค๊ณ ์™€์„œ ๊ฐ’์„ ์ฒ˜๋ฆฌ โ†’ ๊ทœ๊ฒฉํ™”๋จ

ํ—ฌํผ ํ•จ์ˆ˜ ๋ฐ ES6 Spread ์—ฐ์‚ฐ์ž ์†Œ๊ฐœ

Untitled

Untitled

  • this.$store.state.num
  • this.$store.getters.countedNum
  • this.$store.commit.clickBtn
  • this.$store.dispatcher.asyncClickBtn

mapState, mapGetters ์†Œ๊ฐœ ๋ฐ ES6 Spread ์—ฐ์‚ฐ์ž ์“ฐ๋Š” ์ด์œ 

Untitled

Untitled

23_[๋ฆฌํŒฉํ† ๋ง] getters์™€ mapGetters ์ ์šฉํ•˜๊ธฐ

  • ์ƒ๋žต

[๋ฆฌํŒฉํ† ๋ง & ํ€ด์ฆˆ] mapMutations ์ ์šฉ ๋ฐ ํ€ด์ฆˆ

Untitled

Untitled

Untitled

24_[๋ฆฌํŒฉํ† ๋ง & ํ€ด์ฆˆ] mapMutations ์ ์šฉ ๋ฐ ํ€ด์ฆˆ

  • ์ƒ๋žต

๐Ÿ’ก getters๋Š” computed์™€ ์†์„ฑ์ด ๊ฐ™์œผ๋ฏ€๋กœ computed์—, mutations๋Š” method์™€ ์†์„ฑ์ด ๊ฐ™์œผ๋ฏ€๋กœ method์— helperํ•จ์ˆ˜๋ฅผ ์„ ์–ธ!

ํ—ฌํผ ํ•จ์ˆ˜๊ฐ€ ์ฃผ๋Š” ๊ฐ„ํŽธํ•จ

  • getters๊ฐ€ 3๊ฐœ ์žˆ์„ ๋•Œ,

    Untitled

  • ์ด๊ฑธ ์“ฐ๊ธฐ ์œ„ํ•ด ์ ‘๊ทผํ•  ๋•Œ ํ•˜๋‚˜ํ•˜๋‚˜ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒˆ๊ฑฐ๋กœ์›€

    Untitled

  • map helper ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ดํ•‘ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

    Untitled

๋ทฐ์—‘์Šค๋กœ ๋ฆฌํŒฉํ† ๋งํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ ๋ถ„์„ ๋ฐ ์ •๋ฆฌ

  • app : ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋งŒ ๋“ฑ๋ก๋˜์–ด ์žˆ์Œ

  • store : ๊ธฐ์กด app์— ์žˆ๋˜ ๋ฉ”์„œ๋“œ ๋“ฑ ์ฝ”๋“œ ๊ธฐ๋Šฅ๋“ค์ด ์ „๋ถ€ store์—์„œ ์š”์ฒญ

  • list, input, footer : store์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๋ถˆ๋Ÿฌ์™€์„œ ํ˜ธ์ถœ

    โ‡’ ํ•˜์ง€๋งŒ store์— ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๋‘๊ฒŒ ๋˜๋ฉด ์ถ”์ ์ด ํž˜๋“ค์–ด์ง€๋ฏ€๋กœ, ๋ชจ๋“ˆํ™”, ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ. (modules๋ฅผ ์ด์šฉํ•ด ๊ตฌ์กฐํ™”)

25_์Šคํ† ์–ด ์†์„ฑ ๋ชจ๋“ˆํ™” ๋ฐฉ๋ฒ•

Untitled

Untitled

26_์Šคํ† ์–ด ๋ชจ๋“ˆํ™” ๋ฐฉ๋ฒ•

๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ

๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ

ubuntu ์˜ค๋ฅ˜ ๋ชจ์Œ

// cli2
# npm i -g @vue/cli-init
# sudo vue init webpack vue-todo
$ cd vue-todo
$ npm run dev
// cli3
**root@jonah-15U530-LH10K:/home/jonah/Documents/vue-lesson# vue create vue-todo-cli3**
$ cd vue-todo-cli3
$ npm run serve

2. ๊ถŒํ•œ ์˜ค๋ฅ˜[1][2]

  • vscode ์—์„œ ํŒŒ์ผ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋œจ๋Š” ์˜ค๋ฅ˜
Error: EACCES: permission denied, rename '/home/jonah/Documents/vue-lesson/vue-todo-cli3/src/components/HelloWorld.vue' -> '/home/jonah/Documents/vue-lesson/vue-todo-cli3/src/components/111.vue'
  • ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๊ถŒํ•œ ์„ค์ •์„ ํ•ด ์คŒ(์‚ฌ์šฉ์ž ๊ณ„์ •)

    โ†’ ๊ท€์ฐฎ์•„์„œ ์ „์ฒด ๋””๋ ‰ํ† ๋ฆฌ ๊ถŒํ•œ ํ—ˆ์šฉํ•จ

jonah@jonah-15U530-LH10K:~$ ls -la /usr/local/lib/node_modules
total 16
drwxr-xr-x 4 jonah jonah 4096 Dec  6 23:42 .
drwxr-xr-x 5 root  root  4096 Dec  6 23:16 ..
drwxr-xr-x 3 jonah jonah 4096 Dec  6 23:42 create-react-app
drwxr-xr-x 4 jonah jonah 4096 Dec  6 23:20 @vue
-- ์›๋ž˜ ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”๋ฐ
jonah@jonah-15U530-LH10K:~$ sudo chown -R jonah:jonah /usr/local/lib/node_modules/
[sudo] password for jonah: 
-- ์•ˆ๋˜๊ธธ๋ž˜ ์ „์ฒด ๊ถŒํ•œ ํ—ˆ์šฉ
jonah@jonah-15U530-LH10K:~$ sudo chown -R jonah *

3. git push ์ธ์ฆ ์˜ค๋ฅ˜

Reference

About

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


Languages

Language:Vue 63.1%Language:JavaScript 21.3%Language:HTML 15.5%