본문 바로가기

HTML, JAVASCRIPT/Vuejs

Vuejs 간단한 게시판 예제

간단하게 게시판 구현해 보았습니다.


paging 번호는 부트스트랩 썼습니다.


특이한건 자식 component를 사용하여 리스트를 구현했는데 x-template script 사용하여 목록이 루프되는 구문만 분리했습니다.


그리고 원래 코드는 axios써서 서블릿으로 데이터 받아왔었는데, 그냥 하드코딩한거 넣었습니다.


코드 보시고 응용하시면 됩니다.


프로그래스는 리스트 불러올 때 시작해서 다 불러오면 종료입니다.


코드자체는 어려울게 없고, 책이나 도큐먼트 사이트 참조하시면 쉽게 이해 되실겁니다.







<board.html>

---------------------------------------------------------------------------------

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<link href="css/bootstrap.min.css" rel="stylesheet">

<link href="css/nprogress.css" rel="stylesheet">

<style>

    body {font-size:10pt;}

</style>

</head>

<body>

<div id="app" class="container">{{ responseMsg }}

    <table class="table table-striped table-hover">

        <thead>

            <th>No.</th>

            <th>Title</th>

            <th>Created</th>

            <th>Date</th>

            <th>Hit</th>

        </thead>

        <tbody

            is="my-list"

            v-for="(data, index) in dataList"

            v-bind:no="data.no"

            v-bind:title="data.title"

            v-bind:created="data.created"

            v-bind:date="data.date"

            v-bind:hit="data.hit">

        </tbody>

    </table>


    <div class="d-flex justify-content-center">

        <page-component v-html:pagetag="paging"></page-component>

    </div>


</div>

<script src="js/vue.js"></script>

<script src="js/axios.js"></script>

<script src="js/jquery-3.3.1.min.js"></script>

<script src="js/bootstrap.min.js"></script>

<script src="js/es6-promise.auto.min.js"></script>

<script src="js/es6-promise.min.js"></script>

<script src="js/nprogress.js"></script>


<!-- 글목록 template script -->

<script type="text/x-template" id="list-template">

<tr>

    <td>{{ no }}</td>

        <td>{{ title }}</td>

        <td>{{ created }}</td>

        <td>{{ date }}</td>

        <td>{{ hit }}</td>

    </tr>

</script>


<script>

// 글 목록 component

// {{ }} 이 태그가 보였다 사라지는 것을 방지

    Vue.component('my-list', {

        template: '#list-template',

        props: ['no', 'title', 'created', 'date', 'hit']

    })

    // 페이징 component

    Vue.component('page-component', {

    template: '<ul class="pagination">{{ pagetag }}</ul>',

    props: ['pagetag']

    })


    // 페이지 클릭 이벤트가 vue 안에서 안먹혀서 이쪽으로 호출 후 vue로 다시 호출 

    function movepage(params, pageNumber) {

    vm.movepage(params, pageNumber)

    }

    

// Vue 

    var vm = new Vue({

        el: '#app',

        data: {

        showModal: false,

            dataList: [{

            no: 1,

            title: 'test',

            created: '오리궁뎅이',

            date: '2018-01-01',

            hit: 100

            },

            {

            no: 2,

            title: 'test2',

            created: '오리궁뎅이',

            date: '2018-01-02',

            hit: 1000

            }], // 리스트데이터

            responseMsg: '', // 반환받은 메시지

            paging: '',

            params: '',

            nowPage: 1, // 현재 페이지 번호

            totalCount: 1000, // 전체 카운트

            pageCount: 10, // 페이지당 보여줄 하단 번호 수

            pageRecordCount: 30 // 페이지당 보여줄 레코드 수

        },

        beforeCreate: function() {

           NProgress.start()

           NProgress.set(0, 4)

        },

        methods: {

        getList: function() {

                this.page(this.totalCount)

        },

        // 글목록

            /*

        getList: function() {

                axios.get('getList', {

                    params: {

                    params: vm.params

                    }

                })

                //성공

                .then(function(response) {

                    vm.responseMsg = response

                    //vm.dataList = response.data.serverlist //서블릿 호출하면 아래 데이터를 불러옵니다.

                   "{\"serverlist\": [{\"no\":\"2\", \"title\":\"22222222222\", \"created\":\"chang\", \"date\":\"2018-08-01\", \"hit\":\"10\"}, {\"no\":\"1\", \"title\":\"11111111\", \"created\":\"chang\", \"date\":\"2018-08-01\", \"hit\":\"10\"}], \"totalCount\":\"1000\"}";

                    vm.totalCount = response.data.totalCount

                    

                    vm.page(vm.totalCount)

                })

                //실패

                .catch(function(error) {

                    vm.msg = error.message

                })

            },*/

            //페이지 클릭

            movepage: function(params, pageNumber) {

            NProgress.start()

           NProgress.set(0, 4)

           

this.params = params

            this.nowPage = pageNumber

            

            this.getList()

            },

            //페이지 번호 목록 나열

            page: function(totalCount) { // 페이징

            if (this.nowPage == 0) this.nowPage = 1

            

            var totalPage = Math.ceil(totalCount / this.pageRecordCount + ((totalCount % this.pageRecordCount)>0 ? 1 : 0));

    if(this.nowPage > totalPage){

        this.nowPage = totalPage;

    }

        var startRownum = (this.nowPage - 1) * this.pageRecordCount + 1

        var endRownum = this.nowPage * this.pageRecordCount

        var groupNo = Math.floor(this.nowPage / this.pageCount + (this.nowPage % this.pageCount > 0 ? 1:0))

        var endPage = groupNo * this.pageCount

        var startPage = endPage - (this.pageCount - 1)

        

        if (endPage > totalPage) {

            endPage = totalPage

        }

var prevPage = startPage - this.pageCount

var nextPage = startPage + this.pageCount

if(prevPage < 1){

prevPage = 1

}

if(nextPage > totalPage){

nextPage = totalPage

}

        this.paging = ""


        if (nextPage <= 11) {

            this.paging = "<li class='page-item disabled'><span class='page-link'>Previous</span></li>"

        } else {

            this.paging = "<li class='page-item'><a class='page-link' href=\"javascript:movepage('"+this.params+"', "+(startPage - this.pageCount)+")\" aria-label='Previous'><span aria-hidden='true'>Previous</span></a></li>"

        }


        for (var i = startPage; i <= endPage; i++) {

            if (i == this.nowPage) {

        this.paging += "<li class='page-item active'><span class='page-link'>"+i+"<span class='sr-only'>(current)</span></span></li>"

            } else {

        this.paging += "<li class='page-item'><a class='page-link' href=\"javascript:movepage('"+this.params+"', "+i+")\">"+i+"<span class='sr-only'>"+i+"</span></a></li>"

            }

        }


        if (nextPage != totalPage) {

            this.paging += "<li class='page-item'><a class='page-link' href=\"javascript:movepage('"+this.params+"', "+(startPage + this.pageCount)+")\" aria-label='Next'><span aria-hidden='true'>Next</span></a></li>"

        } else {

            this.paging += "<li class='page-item disabled'><span class='page-link'>Next</span></li>"

        }

        

            //프로그래스바종료

            NProgress.done()

            }

            

        }

    })

    vm.getList()

</script>

</body>

</html>





'HTML, JAVASCRIPT > Vuejs' 카테고리의 다른 글

[Vuejs] EventBus에서 this 사용법  (1) 2018.12.16
Vuejs watch 사용법  (0) 2018.10.31
이벤트버스에서 parent 함수 호출 방법  (0) 2018.10.10
Vuejs 예제  (0) 2018.09.07
Vuejs란  (0) 2018.09.06