<script src="../../dist/vue.global.js"></script> <div id="demo"> <h1>Latest Vue.js Commits</h1> <template v-for="branch in branches"> <input type="radio" :id="branch" :value="branch" name="branch" v-model="currentBranch"> <label :for="branch">{{ branch }}</label> </template> <p>vuejs/vue@{{ currentBranch }}</p> <ul> <li v-for="{ html_url, sha, author, commit } in commits"> <a :href="html_url" target="_blank" class="commit">{{ sha.slice(0, 7) }}</a> - <span class="message">{{ truncate(commit.message) }}</span><br> by <span class="author"><a :href="author.html_url" target="_blank">{{ commit.author.name }}</a></span> at <span class="date">{{ formatDate(commit.author.date) }}</span> </li> </ul> </div> <script> const API_URL = `https://api.github.com/repos/vuejs/vue-next/commits?per_page=3&sha=` const App = { data: { branches: ['master', 'sync'], currentBranch: 'master', commits: null }, created() { this.fetchData() }, watch: { currentBranch: 'fetchData' }, methods: { fetchData() { fetch(`${API_URL}${this.currentBranch}`) .then(res => res.json()) .then(data => { this.commits = data }) }, truncate(v) { const newline = v.indexOf('\n') return newline > 0 ? v.slice(0, newline) : v }, formatDate(v) { return v.replace(/T|Z/g, ' ') } } } Vue.createApp().mount(App, '#demo') </script> <style> #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; } </style>