일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- BEAN
- Repository
- Java
- DB
- 캐시
- Stateless
- HTTP 메서드
- 의존성 주입
- Vue.js
- 라이프 사이클
- HTTP
- js
- vue-cli
- Spring
- 프로토타입
- di
- cache
- 싱글톤
- Security
- thymeleaf
- javascript
- Excel
- Kotlin
- vuex
- 로그인
- VUE
- JPA
- Singleton
- dependency injection
- Setter
- Today
- Total
jhhan의 블로그
vue.js - for문 관련 본문
Vue.js관련해서 오랜만에 다시 블로그에 글을 써봅니다.
이번에는 오늘 배웠던 v-for문과 key를 이용해서 포스트를 작성해보겠습니다.
이전에 계속 v-model을 적용하는데 어려움을 겪고 있었다.
동적으로 input 혹은 textarea 태그를 생성하는데 여기에는 v-model을 적용할 수 없어서 꽤 고생을 했었고,
결국 다른 방법을 찾아냈다.
-> id값을 이용해서 값을 받는 방식을 택했다.
먼저 기존에 적용했던 방법부터 살펴보겠다.
<form method="post" @submit.prevent="createDaily">
<div id="daily"></div>
<div>
<input type="button" value="Add" v-on:click="daily_add()"/>
<input type="button" value="Delete" v-on:click="daily_delete()"/>
</div><br/>
<button id="button" type="submit">Submit</button>
</form>
이게 제가 만들었던 textarea 혹은 input 태그를 동적으로 생성하는 폼입니다.
그리고 각각의 메소드를 살펴보겠습니다.
daily_add: function () {
const addedForm = document.getElementById('daily')
const str = `<br/><label>Daily_Done</label><br/>
<textarea type="text" cols="40" placeholder="최대 2000자" name="done${this.count}" id="done${this.count}"></textarea>`
const div = document.createElement('div')
div.id = 'added' + this.count
div.innerHTML = str
addedForm.appendChild(div)
this.count++
console.log(this.count)
},
daily_delete () {
if (this.count > 1) {
const addedDiv = document.getElementById('added' + (--this.count))
document.getElementById('daily').removeChild(addedDiv)
}
console.log(this.count)
},
createDaily: function () {
const fd = new FormData()
for (let i = 0; i < this.count; i++) {
const added = document.getElementById('done' + i)
console.log(added.value)
fd.append('done' + i, added.value)
}
console.log(fd)
this.$axios.post('/api/create/daily', fd)
.then((response) => {
console.log(response.data)
if (response.data === -1) {
alert('Creating Daily Report Wrong!')
}
this.$router.push({ name: 'Success' })
})
}
- daily_add() : 태그들을 동적으로 생성합니다.
- daily_delete() : 동적으로 생성된 태그들을 삭제합니다.
- createDaily : 생성된 textarea의 value들을 받아서 넘깁니다. 저는 백엔드를 Spring으로 사용하고 있어서 Spring Controller에서 받습니다.
- 전에는 그냥 그러려니 했지만, 지금 보니깐 코드가 굉장히 길군요. 남들이 본다면 혼란스러워할 코드 같습니다.
createDaily 메소드 안에서 document.getElementById를 통해 id의 value값을 넘겨받는 조건으로 진행했습니다.
이제 이 방법을 다르게 고쳐보겠습니다.
(아마 이렇게 하는게 더 옳다고 생각합니다. 저도 제가 짜놓은 코드를 모두 이런 식으로 바꿀 생각입니다.)
<div v-for="(input,k) in inputs" :key="k">
<label>Done</label>
<v-col cols="12" sm="7">
<v-textarea outlined rows="2" auto-grow type="text" :id="'done' + k" v-model="input.daily"/>
<span>
<v-btn small @click="remove(k)" v-show="k || (!k && inputs.length > 1)">minus</v-btn>
<v-btn small @click="add(k)" v-show="k === inputs.length - 1">plus</v-btn>
</span>
</v-col><br/>
</div>
많이 간결해졌습니다. method 코드를 본다면 훨씬 더 간단해진 코드를 볼 수 있습니다.
참고로 v-btn, v-col, v-textarea 태그는 vuetify에서 사용하는 태그입니다. vue 프로젝트에 vuetify를 설치하면 사용할 수 있습니다.
methods: {
add (k) {
this.inputs.push({ daily: '' })
},
remove (k) {
this.inputs.splice(k, 1)
},
DailyCreate () {
const fd = new FormData()
for (let i = 0; i < this.inputs.length; i++) {
console.log(this.inputs[i].daily)
fd.append('done' + i, this.inputs[i].daily)
}
this.$axios.post('/api/create/daily', fd).then(response => {
if (response.data === -1) {
alert('Creating Daily Report Wrong!')
}
this.$router.push({ name: 'Success' })
})
}
}
- add() : 동적 생성입니다.
- remove() : 삭제합니다.
- DailyCreate () : 입력받은 값들을 받아서 넘깁니다.
- DailyCreate() 메소드의 코드는 그대로인 것 같긴 하지만, add()와 remove() 메서드는 굉장히 간단해졌습니다.
역시 입력받은 값들은 Spring 에서 받아 처리합니다.
위 그림이 새로 적용한 코드의 모습입니다.
minus를 누르면 사라지고, plus를 누르면 새로 생깁니다.
굉장히 좋은 것 같습니다.
(참고로 여러개를 입력 받으시면 daily: '' 부분 뒤에 여러 개를 더 입력하시면 됩니다. 이정도는 코딩 해봤으면 눈치 채시겠죠 ㅎㅎ)
이 방식을 사용하면 동적으로 생성하더라도 v-model을 계속해서 사용할 수 있습니다. 그래서 굉장히 유용한 것 같습니다.
아래에는 제가 참조한 사이트 입니다.
smarttutorials.net/dynamically-add-or-remove-input-textbox-using-vuejs/
몇 주 전에 이런 내용에 대해 코멘트를 받긴 했었는데 정작 어떻게 써야할 지 모르다가 우연한 계기로 알게되서 써봅니다.
'Vue.js' 카테고리의 다른 글
Vuetify(2) (0) | 2020.06.07 |
---|---|
Vuetify 시작 (0) | 2020.05.23 |
Vue.js 라이프 사이클 (0) | 2020.05.02 |
Vue.js_기초_설치관련 (0) | 2020.04.12 |
Vue.js 기초(5)_심화 (0) | 2020.04.10 |