Vue 예제 – 02_Github Commits

02_Github Commits

  • JavaScript – indexOf(), slice(), replace(), XMLHttpRequest
  • VueJS – :id, :value, v-model, v-for, filters

Result

HTML

<div id="demo">
    <h2>Latest Vue.js Commits</h2>
    <!-- 등록된 브랜치 길이만큼 input radio 생성-->
    <template v-for="branch in branches">
        <!-- 브랜치명으로 id, value, name 할당 -->
        <input type="radio"
               :id="branch"
               :value="branch"
               name="branch"
               v-model="currentBranch">
        <label :for="branch">{{ branch }}</label>
    </template>
    <!-- 현재 브랜치명 출력 -->
    <p>vuejs/vue@{{ currentBranch }}</p>
    <ul>
        <!-- // commits에 담긴 정보 출력 -->
        <li v-for="record in commits">
            <a :href="record.html_url" target="_blank" class="commit">{{ record.sha.slice(0, 7) }}</a>
            - <span class="message">{{ record.commit.message | truncate }}</span><br>
            by <span class="author"><a :href="record.author.html_url" target="_blank">{{ record.commit.author.name }}</a></span>
            at <span class="date">{{ record.commit.author.date | formatDate }}</span>
        </li>
    </ul>
</div>
  • {{ message | filter function }} – filters에 정의된 함수에 message를 매개변수로 전달

JavaScript

var apiURL = 'https://api.github.com/repos/vuejs/vue/commits?per_page=3&sha='

/**
 * Actual demo
 */

var demo = new Vue({

    el: '#demo',

    data: {
        branches: ['master', 'dev'],
        currentBranch: 'master',
        commits: null
    },

    created: function () {
        this.fetchData()
    },

    // currentBranch 프로퍼티가 변경될때 fetchData 함수 실행
    watch: {
        currentBranch: 'fetchData'
    },

    filters: {
        // 줄바꿈 있을시 줄바꿈까지 글자 자르기 필터
        truncate: function (v) {
            var newline = v.indexOf('\n')
            return newline > 0 ? v.slice(0, newline) : v
        },
        // 날짜 데이터에서 T,Z 문자를 공백으로 변경
        formatDate: function (v) {
            return v.replace(/T|Z/g, ' ')
        }
    },

    methods: {
        // API 호출하여 JSON 형태로 commits에 할당
        fetchData: function () {
            var xhr = new XMLHttpRequest()
            var self = this
            xhr.open('GET', apiURL + self.currentBranch)
            xhr.onload = function () {
                self.commits = JSON.parse(xhr.responseText)
                console.log(self.commits[0].html_url)
            }
            xhr.send()
        }
    }
})
  • filters – 텍스트 형식화를 적용할 수 있는 필터 제공
  • slice() – 문자열을 잘라서 새로운 문자열로 반환

CSS

#demo {
    font-family: 'Helvetica', Arial, sans-serif;
}
a {
    text-decoration: none;
    color: #f66;
}
li {
    line-height: 1.5em;
    margin-bottom: 20px;
}
.author, .date {
    font-weight: bold;
}