inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

트렐로 개발로 배우는 Vuejs, Vuex, Vue-Router 프론트엔드 실전 기술

카드 이동 2 - 구현

복습 중 질문드립니다 ㅠ

해결된 질문

218

한아링

작성한 질문수 23

0

안녕하세요 다시 한번 복습중에 질문드립니다..

드래그하면 pos값이 변경돼서 데이터에는 잘 반영이 되는데

html에 data-pos속성의 값에는 변경되지 않아서

card를 드래그로 이동하고 drop시 연산이 일어날때는 html에 있는 date-pos 속성(고정되어있는)의 값으로 더하거나 곱하거나 해서 계산이 맞지않습니다 ㅠ 

강사님 코드를 참고해보긴 했는데 강사님도 data-pos="data.pos" 이런식으로 하시더라구요.. 제가 놓치고 있는 부분이 있을까요..? 질문드립니다!

				<li class="list_item" v-for="(row, index) in rowData" v-bind:key="index">
					<div :data-idx="row.idx" :data-pos="row.pos">
						<input type="text" :value="row.subject" readonly>
						{{row.idx}}
						<button type="button" class="memo_delete" @click="deleteList(row.idx)">&times;</button>
					</div>

...

...

...

			const targetList = {
				idx: el.firstElementChild.dataset.idx*1,
				pos: el.firstElementChild.dataset.pos*1
			};

			// 순서 비교는 배열의 index값으로 할꺼임
			Array.from(document.querySelectorAll('#memoList .list_item')).forEach((el, idx, arr) => { // 배열의 index로 target의 위치 확인
				const cardId = el.firstElementChild.dataset.idx;
				let prevList = null;
				let nextList = null;
				if(cardId == targetList.idx) {
					prevList = idx > 0 ? {
						idx: arr[idx-1].firstElementChild.dataset.idx*1,
						pos: arr[idx-1].firstElementChild.dataset.pos*1
					} : null;
					nextList = idx < arr.length-1 ? {
						idx: arr[idx+1].firstElementChild.dataset.idx*1,
						pos: arr[idx+1].firstElementChild.dataset.pos*1
					} : null;

					if(!prevList && nextList) {
						targetList.pos = nextList.pos / 2; // 첫 번째 자리
						console.log('첫 번째 자리');
					}
					else if(!nextList && prevList) {
						targetList.pos = prevList.pos * 2; //마지막 자리
						console.log('마지막 자리');
					}
					else {
						targetList.pos = (nextList.pos + prevList.pos) / 2; //중간 자리
						console.log('중간 자리 ===',prevList.pos,'====',nextList.pos, arr[idx+1]);
					}

					vm.$http({
						method: 'PUT',
						url: '/memo/update',
						data: {
							pos: targetList.pos,
							idx: targetList.idx
						}
					})
				}
			})

vuejs javascript

답변 1

0

김정환

데이터의 pos값은 갱신되는데 dom에 바인딩된 값이 변경 되지 않는 현상이죠? 혹시 화면 리프레시하면 잘나오지 않나요?

아마 v-for 디렉티브에서 key 값 사용하는 방법이 원인것 같습니다.

<li class="list_item" v-for="(row, index) in rowData" v-bind:key="index">

rowData의 index를 키값으로 사용했는데요. 이걸 row.id나 row.pos 값으로 바꿔 보세요. v-for로 리스트 렌더링할때는 key값이 리스트의 각 항목의 식별자를 사용하는 것이 좋습니다.

참고: https://kr.vuejs.org/v2/guide/list.html#Maintaining-State

0

한아링

네 화면 리프레시해도 맞지 않네요..?ㅠ

말씀해주신대로 v-bind:key를 변경해보았는데도 마찬가지입니다ㅠ

리프레시 했을 때의 pos의 값으로 고정되어있으니 이동을 했을 때 계산이 맞지않는 것같습니당... (특히 중간으로 이동이요!)

<li class="list_item" v-for="row in rowData" v-bind:key="row.idx">
					<div :data-idx="row.idx" :data-pos="row.pos">
						<input type="text" :value="row.subject" readonly>
						{{row.idx}}
						<button type="button" class="memo_delete" @click="deleteList(row.idx)">&times;</button>
					</div>
				</li>

0

김정환

리프레시해도 순서이동이 잘못되었다면 서버에 pos 정보가 잘못 저장된것 같네요. 그렇다면 drop 이벤트가 발생했을 때 pos를 재계산하는 로직이 좀 의심스러운것 같은데요. 이쪽을 좀 디버깅해보는게 어떻까요?

0

한아링

서버에 변경된 pos정보는 정상적으로 저장되는데 DOM에 그게 반영이 되지않아서 다음 계산이 진행되었을때 값이 맞지 않게됩니다 ㅠ(dom에는 처음 리프레시 했을때의 값이 고정으로 박혀있기때문..)

원래 서버에 데이터가 변경되면 자동으로 dom의 값도 바껴야되는데 안바뀌는건가요..? 아니면 서버값이 바꼇을때 dom의 값도 변경되게 작업해줘야 하는걸까요?! 

답변 부탁드립니다ㅠ

0

한아링

아! 다시 차근차근 쌤 코드를 보니 순서이동 후에 fetch를 한번더 해주셨구나 저도 그렇게 수정했더니 DOM에 pos값이 반영돼서 원하는대로 잘되네요 ㅎㅎ 끝까지 신경써주셔서 감사합니다 ^^

객체가 함께 반환되는데 왜 그럴까요

1

134

2

babel-core module 에러

0

227

2

watch와 computed

1

246

1

nextTick 관련 질문

0

703

1

a 태그에 href를 빈 값으로 계속 주는 이유

0

767

1

함수에서 _를 사용하셨는데 어떨때 쓰이는 건가요?

0

348

1

watch로 router 감시할 때

0

407

1

보드 아이템 배경색 변경 관련 질문

0

288

1

NavigationDuplicated 에러

0

673

1

vue-router 설치 중 계속해서 오류가 발생합니다.

2

1413

2

로컬 스토리지 관련 질문입니다!

0

469

1

<router-link> 질문

0

310

1

(재질문/Vuex 적용 - 인증 1) 강의에서 8분 18초 부분 질문 있습니다.

0

285

1

router-link 와 router-view 의 차이를 모르겠습니다!

1

1088

1

왜 index.js를 바로 볼 수 있나요?

0

365

2

리스트 내 카드 이동 오류

1

541

0

보드를 추가했을 때 추가한 보드에 대한 화면 업데이트(?) 갱신(?)에 관한 질문입니다.

0

291

1

(Vuex 적용 - 인증 1) 강의에서 8분 18초 부분 질문 있습니다.

0

444

1

npm install 시 에러

0

991

2

안녕하세요 리스트 이동 관련 질문이 있습니다.

0

313

2

질문이 있습니다.

0

297

1

마지막 부분에 로그아웃 해서 로그인 화면으로 돌아왔을 때

0

263

1

소스 공유 받을수 있을까요?

0

326

1

setAuthInHeader 했는데 오류가 발생합니다.

0

246

1