• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    해결됨

복습 중 질문드립니다 ㅠ

21.03.04 00:21 작성 조회수 143

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
						}
					})
				}
			})

답변 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

한아링님의 프로필

한아링

질문자

2021.03.07

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

말씀해주신대로 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>

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

한아링님의 프로필

한아링

질문자

2021.03.10

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

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

답변 부탁드립니다ㅠ

한아링님의 프로필

한아링

질문자

2021.03.10

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