코드가 에러가 나면 에러 메세지를 보자. 답은 거기 있다.
오늘도 사용자 관리창을 이어서 만들었다.
null 값인 경우 처리(null이 들어가도 에러 뜨지 않게 해주기 위해)
<template #cell(Department)="data">
{{ data.item.Department && data.item.Department.name }} // 앞에가 true면 뒤에가 출력됨
</template>
모든 경우에 있어 테스트 늘 해야됨
watch(값이 변경되면 감지)
inform.vue
...
export default {
data() {
return {
user: {
id: null,
departmentId: null,
name: null,
userid: null,
password: null,
role: null,
email: null,
phone: null,
updatedPwDate: null,
createdAt: null,
updatedAt: null
},
userRole: {
default: 'member', // 기본값
options: [
{ value: 'leader', text: '팀장' },
{ value: 'member', text: '팀원' }
]
}
}
},
computed: {
infoData() {
return this.$store.getters.User
},
inputMode() {
return this.$store.getters.UserInputMode
},
//부서 리스트 (이때 created에서 생성한 걸 사용)
departmentList() {
return this.$store.getters.DepartmentList
}
},
watch: {
infoData(value) {
// value: 위에서 변경된 값
console.log('watch.infoData', value)
this.user = { ...value } // 전개연산자
}
},
...
신규입력 창 내용 초기화
user.js
// 초기화
actUserInit(context, payload) {
context.commit('setUser', { ...stateInit.User }) // 현재 값만 들어감/setUser에 statInit.User 요소를 풀어서 넣어줌=전부 복붙(null값이 됨)
// context.commit('setUser', stateInit.User) // 메모리 주소 복사(User가 변경되면 변경된 값이 들어감)
},
index.vue
onClickAddNew() {
// 1. 입력모드 설정
this.$store.dispatch('actUserInputMode', 'insert')
// 초기화
this.$store.dispatch('actUserInit') // 순서는 모달 뜨기 전
// 입력 모달 띄우기
this.$bvModal.show('modal-user-inform')
console.log('onClickAddNew')
사용자 등록 시 데이터 전송 처리
user.js
// 등록
actUserInsert(context, payload) {
console.log('actUserInsert', payload) // 적은 정보가 payload를 통해 넘어옴
},
// 백엔드 호출 (결과값 수신)(watch에서 감지하게 해주기 위해 setTimeout 사용)
setTimeout(() => {
const insertedResult = 1
context.commit('setInsertedResult', insertedResult)
}, 300) // state값의 변화를 감지하기 위하여 일부러 지연 시켰다.
},
inform.vue
methods: {
onSubmit() {
// console.log('onSubmit', { ...this.user })
if (this.inputMode === 'insert') {
this.$store.dispatch('actUserInsert', { ...this.user }) // 입력모드일때만 동작
}
},
전개 연산자 언제 써야할까
1. 전개 할때
2. 값만 복사 할때
3. 특정 항목의 값을 수정 할때
4. (없던)항목이 추가 될때
const user = {
id: 1,
name: 'kim'
}
const user2 = {
...user
}
const user3 = user
user.name = 'park'
const user4 = {
...user,
name: 'choi'
}
const user5 = {
...user,
department: 'dev'
}
console.log('user', user)
console.log('user2', user2)
console.log('user3', user3)
console.log('user4', user4)
console.log('user5', user5)
헤더에 NavBar 삽입
header.vue
<template>
<div>
<b-navbar toggleable="lg" type="light" variant="light">
<b-navbar-brand href="#">VUEPROJ</b-navbar-brand>
<b-navbar-toggle target="nav-collapse"></b-navbar-toggle>
<b-collapse id="nav-collapse" is-nav>
<b-navbar-nav>
<b-nav-item href="#">메뉴1</b-nav-item>
<b-nav-item href="#">메뉴2</b-nav-item>
</b-navbar-nav>
<!-- Right aligned nav items -->
<b-navbar-nav class="ml-auto">
<b-nav-item-dropdown right>
<!-- Using 'button-content' slot -->
<template #button-content>
<em>User</em>
</template>
<b-dropdown-item href="#">Profile</b-dropdown-item>
<b-dropdown-item href="#">Sign Out</b-dropdown-item>
</b-nav-item-dropdown>
</b-navbar-nav>
</b-collapse>
</b-navbar>
</div>
</template>
디버깅
위 항목을 삭제하고나서 다음에 또 삭제를 누르면 null 값이 들어가며 삭제 실패가 한번 뜨고 성공이 떴다.
하나씩 지워가며 확인해봤는데 다행히 문제를 찾았다.
index.vue
deletedResult(value) {
console.log('watch.deletedResult', value)
// 삭제 후 처리
if (value !== null) {
// null 값이 아닐 때 빼먹음!!!
if (value > 0) {
// 삭제가 성공한 경우
// 1. 메세지 출력
this.$bvToast.toast('삭제 되었습니다.', {
title: 'SUCCESS',
variant: 'success',
solid: true
})
// 2. 리스트 재 검색
this.searchUserList()
} else {
// 삭제가 실패한 경우
this.$bvToast.toast('삭제가 실패하였습니다.', {
title: 'ERROR',
variant: 'danger',
solid: true
})
}
}
}
여기서
if (value !== null)
이걸 빼먹었다! (조건 : null 값이 아닐 때)
null 값이 힌트였나보다.
이렇게 만든 프론트를 백엔드, db랑 연동 시키기
먼저 백엔드 확인
postgres : 확인한 DB 생성
DBeaver : postgres에서 생성한 DB 연결
백엔드 설치(npm install) 및 실행(npm run start => 개발할 땐 npm run dev를 많이 쓴다 이번엔 예외적으로 start로 실행)
연동 성공
쿼리
쿼리 날릴 때 위치 주의!
지정한 row만 실행
커서를 ;의 안쪽으로 옮긴 다음 ctrl-enter 누르면 해당 쿼리 실행(전체 쿼리 실행 시 큰일날 수 있음)
등록/수정 잘 작동한다.
느낀 점
백엔드랑 프론트엔드 연동...
뭔가 코드는 더 간단하긴 한데
좀 더 봐야겠다ㅎㅎ
'공부 > [TIL] Digital Twin Bootcamp' 카테고리의 다른 글
TIL_211230_VISION 인식 (0) | 2021.12.30 |
---|---|
TIL_211229_VISION 인식 (0) | 2021.12.29 |
TIL_211224_Frontend (0) | 2021.12.25 |
TIL_211223_Frontend (0) | 2021.12.23 |
TIL_211222_Frontend (0) | 2021.12.23 |