본문 바로가기
클라우드 데브옵스

Day68 2024.08.28.수 #코딩일기

by SSONG1521 2024. 8. 28.

 

 

npm run dev 를 터미널 창에 입력한 후 웹 사이트 들어가기

App.vue에 입력해야 창으로 넘어가진다. backup폴더를 따로 만들어놓는다.

App.vue에서 새로운 틀 만들 때 vb ctrl space -> vbase-3 만들어주기

 

 

CH11. Vue Project 생성

 

 

 

 

folder 04
vue App_keyEvent.vue
<template>
  <div id="modifiers">
    <div @click="clickDiv">
      DIV 영역
      <p @click="clickP">
        P 영역
        <span @click="clickSpan">span 영역</span>
        <!-- .prevent는 JavaScript의 Event.preventDefault 메소드를 호출한다. 
         Event 인터페이스의 preventDefault() 메소드는 이벤트가 명시적으로 
         처리되지 않은 경우에 user agent에 그 기본 액션을 정상적으로 
         수행해서는 안 된다고 전달 -->
        <a href="https://naver.com" @click.prevent.stop="clickA">a 영역</a>
      </p>
    </div>
    <button @click.once="clickDiv">once</button>
  </div>
</template>

<script>
export default {
  setup() {
    const clickDiv = () => {
      console.log('clickDiv')
    }

    const clickP = () => {
      console.log('clickP')
    }

    const clickSpan = () => {
      console.log('clickSpan')
    }

    const clickA = () => {
      alert('어떤기능~')
    }

    return {
      clickDiv,
      clickP,
      clickSpan,
      clickA
    }
  }
}
</script>

<style lang="scss" scoped>
#modifiers div,
#modifiers p,
#modifiers span {
  padding: 40px;
}
#modifiers div {
  background-color: #ccc;
}
#modifiers p {
  background-color: #999;
}
#modifiers span {
  background-color: #666;
  display: block;
}
</style>
view 단




 

 - 새 터미널 열어서 npm install -D sass 입력, -> 다시 npm run dev

 - prevent :  .prevent는 JavaScript의 Event.preventDefault 메소드를 호출한다. Event 인터페이스의 preventDefault() 메소드는 이벤트가 명시적으로 처리되지 않은 경우에 user agent에 그 기본 액션을 정상적으로 수행해서는 안 된다고 전달

 

     prevent 를 풀어주면, naver로 들어가게 된다.

 

 

   prevent는 예기치 못했던 event 들을 제거한다는 의미

 

 

 

 

 

 

 

 

folder 04
vue App_vfor.vue
<template>
  <div>
    <ul>
      <template v-for="(item, index) in evenItems" :key="item.id">
        <li>ID : {{ item.id }} 인덱스 : {{ index }} , {{ item.message }}</li>
      </template>
    </ul>
    <hr />
    <ul>
      <li v-for="(kvalue3, key3, kIndex) in myObject" :key="key3">
        {{ kIndex }} - {{ key3 }} - {{ kvalue3 }}
      </li>
    </ul>
  </div>
</template>

<script>
import { computed, reactive } from 'vue'

export default {
  setup() {
    const items = reactive([
      // { key: value , key: value}
      { id: 1, message: 'Java' },
      { id: 2, message: 'HTML' },
      { id: 3, message: 'CSS' },
      { id: 4, message: 'JavaScript' }
    ])
    //                                                 index가 아니라 id가 짝수
    const evenItems = computed(() => items.filter((item) => item.id % 2 === 0))

    const myObject = reactive({
      title: '제목',
      author: '강태광',
      publishedAt: '2024-03-04'
    })

    return {
      items,
      evenItems,
      myObject
    }
  }
}
</script>

<style lang="scss" scoped></style>
view 단

 

 -

 - for 문

 - eventItems를 filter 를 통해서 짝수를 걸러낸다.

 - templates에 index는 입력 안해줘도 내부적으로 가지고 있다.

 

 

 

 

 

 

 

 

 



folder 05
vue App_vmodel.vue
<template>
  <div>
    <h2>input value</h2>
    <input type="text" s v-model.trim="inputValue" />

    <div>{{ inputValue }}</div>
    <div>{{ typeof inputValue }}</div>
    <hr />
    <h2>textarea value</h2>
    <textarea v-model="textareaValue"></textarea>
    <div>{{ textareaValue }}</div>
    <hr />
    <h2>checkbox value</h2>
    <label for="checkbox">{{ checkboxValue }}</label>
    <input
      type="checkbox"
      id="checkbox"
      v-model="checkboxValue"
      true-value="Yes"
      false-value="No"
    />

    <h3>checkbox values</h3>
    <label>
      <input type="checkbox" value="html" v-model="checkboxValues" />
      HTML
    </label>
    <label>
      <input type="checkbox" value="jsp" v-model="checkboxValues" />
      JSP
    </label>
    <label>
      <input type="checkbox" value="javascript" v-model="checkboxValues" />
      JavaScript
    </label>
    <div>{{ checkboxValues }}</div>
    <hr />

    <h2>radio value</h2>
    <label>
      <input type="radio" name="type" value="O" v-model="radioValue" />
      O형
    </label>
    <label>
      <input type="radio" name="type" value="A" v-model="radioValue" />
      A형
    </label>
    <label>
      <input type="radio" name="type" value="B" v-model="radioValue" />
      B형
    </label>
    <label>
      <input type="radio" name="type" value="AB" v-model="radioValue" />
      AB형
    </label>
    <div>{{ radioValue }}</div>
  </div>
  <hr />

  <h2>select value</h2>
  <select v-model="selectValue">
    <option value="html">HTML 수업</option>
    <option value="jsp">JSP 수업</option>
    <option value="javascript">JavaScript 수업</option>
  </select>
  <div>{{ selectValue }}</div>
</template>

<script>
import { ref } from 'vue'

export default {
  setup() {
    const inputValue = ref('')
    const textareaValue = ref('')
    const checkboxValue = ref('Yes')
    const checkboxValues = ref([])
    const radioValue = ref('O')
    const selectValue = ref('html')

    return {
      inputValue,
      textareaValue,
      checkboxValue,
      checkboxValues,
      radioValue,
      selectValue
    }
  }
}
</script>

<style lang="scss" scoped></style>
view 단

 

 - typeof : data의 type

 - div 태그에도 글씨가 넣어진다.

 - 배열값으로 넣어줄 수 있다. <label>

 

 - combobox 도 넣어줄 수 있다.

 

 

 

 

 

 

 



 

 

folder 05
vue App_watch01.vue
<template>
  <div>
    <p>{{ message }}</p>
    <p>{{ reverseMessage }}</p>
    <button v-on:click="reverseCall">reverseCall</button>
  </div>
</template>

<script>
import { ref, watch } from 'vue'

export default {
  setup() {
    const message = ref('안녕 Vue3')
    const reverseMessage = ref('')
    const reverseCall = () => {
      console.log('reverseCall 즉시 실행!!!')
      reverseMessage.value = message.value.split('').reverse().join()
    }

    watch(message, reverseCall)

    return {
      message,
      reverseMessage,
      reverseCall
    }
  }
}
</script>

<style lang="scss" scoped></style>
view 단

 

 - 우선 여기까지 실행시켜봐준다.

 - 글씨를 역순으로 넣는 공

 

 -  watch -> DB로 말하면 trigger 같은역할

    message  가 실행되면  reverseCall도 실행되어라!

 

 



 

 

 

folder 05
vue App_watch02.vue
<template>
  <div></div>
</template>

<script>
import { ref, watch } from 'vue'

export default {
  setup() {
    const message = ref('')

    watch(message, (newValue, oldValue) => {
      // newValue는 현재 message에 바인딩된 값
      // oldValue는 현재 message에 바인딩된 데이터 바로 이전의 값
      console.log('newValue: ', newValue)
      console.log('oldValue: ', oldValue)
    })

    return {
      message
    }
  }
}
</script>

<style lang="scss" scoped></style>
view 단

 

 

 



folder 05
vue App_watchEffect.vue
<template>
  <div>
    <!-- 일반 자바스크립트에서 form의 기본 동작 이벤트(새로고침)를
    하지 않도록  제어하는 이벤트. 
    Vue에서는 대신에 v-on:submit.prevent 를 사용 -->
    <form @submit.prevent>
      <p><input v-model.lazy="title" type="text" placeholder="Title" /></p>
      <br />
      <textarea v-model="contents" placeholder="Contents"></textarea>
      <hr />
      <button @click="save(title, contents)">저장</button>
    </form>
  </div>
</template>

<script>
import { ref, watchEffect } from 'vue'

export default {
  setup() {
    const title = ref('')
    const contents = ref('')
    const save = (title, contents) => {
      // ''랑 ``는 다르다!! (`는 ~랑 같은 곳에) -> `를 써야 ${}가 먹는다.
      console.log(`저장되었습니다. title: ${title}, contents: ${contents}`)
      // alert('저장 wait...')
    }

    // watch는 이전값, 현재값 모두 필요한 경우 사용.
    // watchEffect는 현재값만 필요할 때 사용.
    // watchEffect는 감시하는 대상을 명시적으로 지정하지 X
    watchEffect(() => {
      console.log('watchEffect')
      save(title.value, contents.value)
    })

    return {
      title,
      contents,
      save
    }
  }
}
</script>

<style lang="scss" scoped></style>
view 단

 

 - model을 걸어두면,  title이 해당되는 값이 같이 움직인다.

 

 - ${}가 ' ' 랑 ` `랑 다르다. (`는 ~랑 같은 칸에 있는!!)

 

 

 - prevent는 자동으로 버튼 같이 @click으로 이동되는 것을 막는 것

 

 - watchEffect -> 바로바로 저장 

   -> lazy를 걸어두어씩 때문에, 한번에 하나만 저장되고, contents는 하나하나 더 저장된다.

 


window R + cmd

 

cd C:\vueJs\Sources

npm init vue

 

프로젝트 이름 정하기

vue3Member01

 

ESlint (줄바꿈), Prettier yes

 

cd  C:\vueJs\Sources\vue3Member01...

 

npm install

 

npm run format

npm run dev

 

\