김니은 
KimN's Blog
김니은 
  • 분류 전체보기
    • Algorithm
      • Programmers
    • Develop
      • Swift
      • Flask
      • RubyonRails
      • AWS
      • Ardunio
      • Vue
      • Node.js
      • Infra
      • CS
    • IT Story
      • Hackintosh
      • GitHub
      • IT Review

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • Ruby on Rails
  • Code Snippet
  • 항상 맨 위
  • SWIFT
  • TOAST
  • 카카오 챗봇
  • SWIFTUI
  • Ruby

최근 댓글

최근 글

티스토리

반응형
hELLO
김니은 

KimN's Blog

[nuxt.js] 페이지 네이션, 스크롤 페이징
Develop/Vue

[nuxt.js] 페이지 네이션, 스크롤 페이징

2020. 4. 5. 21:09
반응형

이번 글은 node.js를 통해 데이터를 가져온 후, pagination과 infinite-loading 기법을 적용하는 방법을 정리해 보았습니다.

​

​

​

페이지네이션 (Pagination)

​

​

 

위 그림과 같이 페이지마다 5개의 목록을 가져오도록 하겠습니다.

 

...
  data () {
    return {
      commentlist : [],
      curpagenum : 1,
      datapage : 5
    }
  },

  methods: {
    ...
    async getCommentlist () {
      await axios.get(' [ 데이터 가져올 api 주소 ] '+ this.$route.params.id).then(
        (res) => {
          this.commentlist = res.data.data // 데이터 배열 저장
        },
        (err) => {
          console.log(err)
        }
      )
    }
  },
  computed: {
    startOffset() {
      return ((this.curpagenum - 1) * this.datapage);
    },
    endOffset() {
      return (this.startOffset + this.datapage);
    },
    numofpage() {
        return Math.ceil(this.commentlist.length / this.datapage);
    },
    calData() {
      return this.commentlist.slice(this.startOffset, this.endOffset);
    }
  },
  mounted () {
    ...
    this.getCommentlist()
  }
}

 

위는 nuxt의 script 주소입니다.

페이지에 글 5개씩 출력하도록 하였습니다.

​

 

<h2>리뷰 테스트</h2>
  <div v-for="(item, index) in calData">
    <div v-if="index != 0"></div>
    <h4>{{ item.[ 테이블 필드 ] }}</h4>
  </div>
  <v-pagination :length= "numofpage" v-model="curpagenum"> </v-pagination>
</div>

 

html에 해당 내용을 입력하시면 해당 테이블의 정보를 출력하게 됩니다.

​

​

​


스크롤 페이징 (infinite-loading)

 

 

스크롤페이징 구현 화면 *출처:공식문서

​

페이스 북처럼 아래로 스크롤을 내리면 계속 해당 정보를 출력해주는 기능입니다.

​

먼저 npm 모듈을 설치해줍시다.

 

 

npm install vue-infinite-loading -s

 

모듈 설치 후 소스를 적어봅시다.

 

import axios from 'axios'
import InfiniteLoading from 'vue-infinite-loading'
...

export default {
  ...

  components: {
    InfiniteLoading
  },
  data () {
    return {
      limit: 5,
      list: [],
      busy: false,
      listItems: [],
      ...
    }
  },
  methods : {
    ...
    async getItem () {
      await axios.get('[ api 주소 ]').then(
        (res) => {
          this.listItems = res.data.data
        },
        (err) => {
          console.log(err)
        }
      )
    },
    async infiniteHandler ($state) {
      await setTimeout(() => {
        const temp = []
        if (this.busy === false) {
          for (let i = this.list.length + 1; i <= this.list.length + 5; i++) {
            temp.push(this.listItems[i])
            if (this.listItems.length - 1 === i) {
              this.busy = true
              break
            }
          }
        }
        if (this.busy === true) {
          $state.complete()
        }
        this.list = this.list.concat(temp)
        $state.loaded()
      }, 1000)
    }
  },
  mounted () {
    ...
    this.getItem()
    this.infiniteHandler()
  }
...

 

getItem 메서드를 통해 데이터를 가져온 후 infiniteHandler 메서드에서 이를 5개씩 잘라 스크롤을 내릴 때 마다 정보를 push해서 출력해줍니다.

제 느낌대로 만든거라.. 더 정리할 수 있을 것 같은데.. 아직은 생각이 안나네요..

 

<div v-for="item in list">
  {{ item }}
</div>
<infinite-loading @infinite="infiniteHandler"></infinite-loading>

 

html 부분에 해당 내용을 작성 후 출력해보았습니다.

​

​

 

...? 왠 오류지..

다른 사이트에서 링크를 타서 들어가면 정상적으로 되지만.. 바로 주소치고 들어가면 에러뜹니다.

​

ssr 오류라 하네요

​

고쳐줍시다.

​

  ...
  plugins: [
    '~/plugins/i18n.js',
    '~/plugins/axios.js',
    '~/plugins/infinite-load.js'
  ],
  ...

 

스크립트 쪽에 해당 소스를 추가해줍니다.

 

<no-ssr><infinite-loading @infinite="infiniteHandler"></infinite-loading></no-ssr>

 

no-ssr 태그를 추가해줍시다.

​

​

​

정보가 제대로 출력되네요!

​

모든 정보가 출력되면 아래에 해당 문구가 뜹니다.

​

​

​

css 아무거나 입혀보니 제대로 작동되는걸 확인할 수 있습니다.

반응형
저작자표시 (새창열림)

'Develop > Vue' 카테고리의 다른 글

[Nuxt.js & Node.js] S3에 다중 이미지 업로드를 해보자  (0) 2020.04.05
[Nuxt.js] 설명 및 Nginx / PM2 연동  (0) 2020.04.05
Vue 애플리케이션 구현 심화편  (0) 2020.01.26
Vue 애플리케이션 만들기  (0) 2020.01.26
Vue 프로젝트 구성  (0) 2020.01.26
    'Develop/Vue' 카테고리의 다른 글
    • [Nuxt.js & Node.js] S3에 다중 이미지 업로드를 해보자
    • [Nuxt.js] 설명 및 Nginx / PM2 연동
    • Vue 애플리케이션 구현 심화편
    • Vue 애플리케이션 만들기
    김니은 
    김니은 

    티스토리툴바