강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

bebe님의 프로필 이미지
bebe

작성한 질문수

Vue3 완벽 마스터: 기초부터 실전까지 - "실전편"

Pagination & Filter 구현하기

_title_like: "", 문의드려요 해당 값을 설정하면 list가 아에 안나옵니다.

작성

·

36

0

<template>
	<div>
		<h2>게시글 목록</h2>
		<hr class="my-4" />
		<form @submit.prevent>
			<div class="row g-3">
				<div class="col">
					<input
						v-model="params._title_like"
						type="text"
						class="form-control"
					/>
				</div>
			</div>
		</form>
		<hr class="my-4" />
		<!-- list : row 가로 정렬 -->
		<div class="row g-3">
			<div v-for="post in posts" :key="post.id" class="col-4">
				<PostItem
					:title="post.title"
					:content="post.content"
					:create-at="post.createAt"
					@click="goPage(post.id)"
				></PostItem>
			</div>
		</div>
		<!-- list -->

		<!-- 페이지네이션 -->
		<nav
			class="mt-4 d-flex justify-content-center"
			aria-label="Page navigation example"
		>
			<ul class="pagination">
				<li class="page-item" :class="{ disabled: params._page <= 1 }">
					<a
						class="page-link"
						href="#"
						aria-label="Previous"
						@click.prevent="--params._page"
					>
						<span aria-hidden="true">&laquo;</span>
					</a>
				</li>
				<li v-for="pageNum in pageCount" :key="pageNum" class="page-item">
					<a class="page-link" href="#" @click.prevent="params._page = pageNum">
						{{ pageNum }}</a
					>
				</li>

				<li class="page-item" :class="{ disabled: params._page >= pageCount }">
					<a
						class="page-link"
						href="#"
						aria-label="Next"
						@click.prevent="++params._page"
					>
						<span aria-hidden="true">&raquo;</span>
					</a>
				</li>
			</ul>
		</nav>

		<hr class="my-4" />

		<AppCard v-if="posts.length > 0">
			<PostDetailView :id="posts[0].id" />
		</AppCard>
		<!-- <router-view></router-view> -->
		<!-- <PostDetailView></PostDetailView> -->
	</div>
</template>

<script setup>
import PostItem from "@/components/posts/PostItem.vue";
import PostDetailView from "./PostDetailView.vue";
import AppCard from "@/components/AppCard.vue";

import { computed, ref, watchEffect } from "vue";
import { getPosts } from "@/api/posts";
import { useRouter } from "vue-router";

const router = useRouter();
const posts = ref([]);
const params = ref({
	_sort: "createAt",
	_order: "desc",
	_page: 1,
	_limit: 3,
	_title_like: "",
});

// 페이지네이션 데이터
const totalCount = ref(0);
const pageCount = computed(() =>
	Math.ceil(totalCount.value / params.value._limit),
);

const fetchPosts = async () => {
	try {
		const { data, headers } = await getPosts(params.value);
		console.log("params.value", params.value);
		console.log("결과:", data);
		posts.value = data;
		// console.log("posts.value", posts.value);
		totalCount.value = headers["x-total-count"];
	} catch (err) {
		console.log("err", err);
	}
	// getPosts()
	// 	.then(res => {
	// 		console.log("res", res);
	// 	})
	// 	.catch(err => {
	// 		console.log("err", err);
	// 	});
};

watchEffect(fetchPosts);
// fetchPosts();

const goPage = id => {
	// router.push(`posts/${id}`);
	router.push({
		name: "PostDetail",
		params: {
			id,
		},
	});
};
</script>

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

기본값을 "" 을 주니 안나오는데 코드에 문제가 있을까요 ㅜㅜ?

image.png


답변 1

0

짐코딩님의 프로필 이미지
짐코딩
지식공유자

안녕하세요.

JSON Server는 _title_like=""로 요청하면 제목이 빈 문자열인 게시글만 찾으려고 시도합니다. 당연히 그런 데이터는 없으니 빈 배열이 반환되는 거죠.

방법 : 초기값을 undefined로 설정

const params = ref({
  _sort: "createAt",
  _order: "desc", 
  _page: 1,
  _limit: 3,
  _title_like: undefined, // "" 대신 undefined
});
bebe님의 프로필 이미지
bebe

작성한 질문수

질문하기