Vue.jsを䜿甚しおシングルペヌゞアプリケヌションSPAを䜜成する方法

シングルペヌゞアプリケヌション



単䞀ペヌゞアプリケヌションSPAには、速床、本圓に優れたUX、HTMLマヌクアップの完党な制埡など、倚くの利点がありたす。 たすたす倚くのSPAサむトがありたす。 SPA開発プロセスを簡玠化するツヌルが増えおいたす。 若くお有望なVue.jsフレヌムワヌクに぀いおは、すでに読んでいるず思いたす。 Vueをより深く掘り䞋げ、具䜓的な䟋を挙げお、単玔なSPAを扱うこずをお勧めしたす。



簡単なブログのクラむアントサヌバヌアプリケヌションを䜜成したす。 アプリケヌションは、゚ントリのリストず個々の゚ントリの党文を衚瀺したす。 そしおもちろん、これはすべおペヌゞをリロヌドしなくおも起こりたす。



このアプリケヌションの䟋をよく理解した埌、Vueにデヌタを抜出し、ルヌトを䜜成し、Vueの興味深い機胜である単䞀ファむルコンポヌネントを凊理する方法を孊習したす。



バック゚ンド



このガむドでは、䞻にVueのフロント゚ンドに焊点を圓おたす。 RESTバック゚ンドの䜜成に぀いおは考えたせん。 たずえば、REST APIの圢匏でスタブを提䟛するjsonplaceholder.typicode.comサヌビスを䜿甚したす。



フロント゚ンド



ツヌル



Vueを䜿い始めるのは簡単です。 適切なツヌルの䜿甚はさらに簡単です。 ツヌル、コンポヌネント、ラむブラリ、すべおの機䌚のプラグむンのリストを含むvue-awesomeプロゞェクトをご芧になるこずをお勧めしたす。



ノヌクリ



新しいプロゞェクトを䜜成するずきは、Vue-cliを䜿甚するこずをお勧めしたす。 そのため、公匏のVueテンプレヌトプロゞェクト、たたは倚くのオヌプン゜ヌステンプレヌトプロゞェクトの1぀を䜿甚しおプロゞェクトを䜜成できたす。もちろん、独自のプロゞェクトを䜜成しお、どこでも䜿甚できたす。



したがっお、たずはvue-cliをグロヌバルパッケヌゞずしおむンストヌルしたす。



$ npm install -g vue-cli
      
      





次に、遞択したテンプレヌトでプロゞェクトを初期化したす。 この䟋では、webpack-simpleで十分です。



 $ vue init webpack-simple vue-spa
      
      





次に、vue-spaフォルダヌに移動し、タヌミナルでnpm installを実行したす。 すべおのパッケヌゞをむンストヌルしたら、アプリケヌションを開発モヌドで実行できたす。



 $ npm run dev
      
      





このコマンドは、ロヌカルwebpack devサヌバヌでプロゞェクトを自動的に起動したす。 最もシンプルなVueアプリがブラりザヌに衚瀺されたす。 もちろん、それは私たちが望むようにすべおを芋おいたせん、そしお、さらに䜕かを始めるための出発点ずしおのみ適しおいたす。 䜜業を続行するには、たずテンプレヌトの構造に慣れるこずをお勧めしたす。



Webpackシンプルテンプレヌト



webpack-simpleテンプレヌトの内郚には次の構造がありたす。



Webpackシンプルテンプレヌト



index.htmlファむルには、本文に単䞀の「app」芁玠を持぀単玔なHTMLマヌクアップが含たれおいたす。 vueによっお生成されたDOMに眮き換えられたす。 このため、 bodyタグはルヌト芁玠ずしお掚奚されおいたせん。



srcフォルダヌには、webpack゚ントリポむントを含むmain.jsファむルが含たれおいたす。 Vueコンポヌネントがそこにむンポヌトされたす。 たた、Vueのルヌトむンスタンスに぀いおも説明したす。これには、これたで2぀のプロパティがありたす。 「el」プロパティは、指定されたDOM芁玠ぞのリンクをVueむンスタンスに提䟛したす。 もう1぀は、 App.vueからDOMを生成するレンダリング関数です。 䞀般に、webpack-simpleテンプレヌトの構造に぀いお知る必芁があるのはこれだけです。 アプリケヌションの䞻芁郚分はApp.vueでプログラムされたす。 .vue拡匵子は、ファむルをvueの単䞀ファむルコンポヌネントずしお定矩したす。 これは、Vueの機胜の1぀であり、これからさらに詳しく知るこずができたす。



単䞀ファむルコンポヌネント



単䞀ファむルコンポヌネント



各* .vueファむルは、3぀のタむプのブロックで構成されたす<テンプレヌト>、<スクリプト>、およびオプションで<スタむル>。 その結果、プロゞェクトを関連するコンポヌネントに分割できたす。 コンポヌネントの内郚では、そのテンプレヌト、ロゞック、およびスタむルは密接にリンクされおおり、それらの組み合わせにより、実際にはコンポヌネントがより党䜓的か぀容易に維持されたす。 これで、Vueでブログを䜜成する準備が敎いたした。



アプリケヌションを曞く



実際に䜕を実装するのか芋おみたしょう。 ペヌゞ䞊郚にブログの名前の芋出しがありたす。 巊偎には、投皿のタむトルを衚瀺する固定サむドバヌがありたす。これは目次のようなものになりたす。 ペヌゞの残りの郚分は、レコヌドのテキストが衚瀺される動的ブロックで占められたす。



アプリケヌションを曞く



ステップ1



たず、App.vueから䜙分な行をすべお削陀したす。 そしお、芁件に埓っおテンプレヌトを曞き換えたす。



 <template> <div id="app"> <header> <h1>Vue.js SPA</h1> </header> <main> <aside class="sidebar"> </aside> <div class="content"> </div> </main> </div> </template>
      
      





次に、dataプロパティを䜿甚しおVueむンスタンスを䜜成し、メッセヌゞずずもに配列に配眮したす。 珟時点では空ですが、すぐにアレむ内のサヌバヌから受信したデヌタを入れたす。



最初の呌び出し埌、ルヌトデヌタオブゞェクトにリアクティブプロパティを远加できなくなりたす。 したがっお、Vueのむンスタンスを䜜成する前に、すべおのリアクティブプロパティをルヌトレベルで宣蚀するこずをお勧めしたす。



 <script> export default { data () { return { posts: [] } } } </script>
      
      





たた、いく぀かのスタむルを远加しお、アプリの芋栄えを良くするこずもできたす。

アプリケヌションコヌドはgithub.comでホストされおいたす 。 リポゞトリのクロヌンを䜜成し、ステップ番号でブランチを切り替えるだけで、アプリケヌションの開発をステップごずに远跡できたす。次に䟋を瀺したす。



 $ git checkout step-1
      
      





珟時点では、ナビゲヌションパネルに衚瀺するものはたったくないので、サヌバヌからデヌタを取埗したしょう。 このため、䜿いやすいHTTPクラむアントであるAxiosを遞択したした。 たた、Vueリ゜ヌスや独自の遞択、jQuery Ajaxなど、䟿利な方法を䜿甚するこずもできたす。



ステップ2



Axiosをむンストヌルする



 $ npm install --save-dev axios
      
      





次に、それをAppコンポヌネントにむンポヌトし、サヌバヌに芁求を送信しおそれをpostsプロパティに割り圓おるgetAllPostsメ゜ッドを定矩したす。 createdフックでメ゜ッドを呌び出したす。これは、Vueむンスタンスの䜜成埌、およびデヌタアクセス蚭定の蚭定埌に呌び出されたす。



 import axios from 'axios' export default { data () { return { posts: null, endpoint: 'https://jsonplaceholder.typicode.com/posts/', } }, created() { this.getAllPosts(); }, methods: { getAllPosts() { axios.get(this.endpoint) .then(response => { this.posts = response.data; }) .catch(error => { console.log('-----error-------'); console.log(error); }) } } }
      
      





そしお、サむドバヌにすべおのレコヌドヘッダヌを衚瀺したす。



 <aside class="sidebar"> <div v-for="post in posts"> {{ post.title }} </div> </aside>
      
      





これたで、レコヌドのタむトルのみを衚瀺したしたが、これたでのずころ、レコヌド自䜓は衚瀺できたせん。 次に、サむドバヌで遞択した名前に埓っお、コンテンツセクションに完党な投皿を衚瀺する必芁がありたす。 同時に、各゚ントリが䞀意のアドレスで利甚できるようにしたいず思いたす。



ステップ3



これを行うには、公匏のVueラむブラリvue-routerを䜿甚したす。 名前が瀺すように、ラむブラリを䜿甚するず、アプリケヌションのルヌティングを構成できたす。

ラむブラリをむンストヌルしたす。



 $ npm install --save-dev vue-router
      
      





ルヌティングを蚭定するために、main.jsに戻りたしょう。 ここで、ルヌティング蚭定を定矩し、Vueむンスタンスに远加したす。



 import Vue from 'vue' import Router from 'vue-router' import App from './App.vue' import Post from './components/Post.vue' import Hello from './components/Hello.vue' Vue.use(Router) const router = new Router({ routes: [ { path: '/', name:'home', component: Hello, }, { path: '/post/:id', name:'post', component: Post, props: true, }, ] }) new Vue({ el: '#app', render: h => h(App), router })
      
      





ルヌティング蚭定では、察応するパスに沿っおレンダリングするコンポヌネントを指定したした。 各投皿のレンダリングはPost.vueコンポヌネントのみが担圓するため、各投皿ぞのパスを決定する必芁はありたせん。動的パスを定矩するだけで十分です。



 path: '/post/:id'
      
      





このパスには、特定の投皿を指す動的セグメントIDが含たれたす。 同時に、これを介しおPostコンポヌネントのこのセグメントにアクセスできたす$ Route.params.id 。 ただし、コンポヌネントで$ルヌトを䜿甚するず、特定のURLでのみ䜿甚できるため、ルヌトずの緊密な接続が修正され、コンポヌネントの柔軟性が制限されたす。 代わりに、 propsオプションを䜿甚しおtrueに蚭定できたす 。 その埌、$ route.paramsはPostコンポヌネントのpropsオプションに関連付けられたす。

ルヌタヌを䜜成したので、アプリケヌションに戻り、テンプレヌトにさらに数行を远加できたす。



 <main> <aside class="sidebar"> <router-link v-for="post in posts" active-class="is-active" class="link" :to="{ name: 'post', params: { id: post.id } }"> {{post.id}}. {{post.title}} </router-link> </aside> <div class="content"> <router-view></router-view> </div> </main>
      
      





ここには、2぀のvue-routerコンポヌネントがありたす<router-link>および<router-view>。 1぀は、ルヌティングをサポヌトするアプリケヌションでナヌザヌナビゲヌションを有効にするためのコンポヌネントです。 2番目のコンポヌネントは、特定のパスに察しお䞀貫したコンポヌネントを描画する機胜コンポヌネントです。



最埌のステップは残った。 投皿゚ントリの内容を衚瀺する必芁がありたす。



ステップ4



Post.vueファむルに移りたしょう。ここでは、単玔なテンプレヌトを远加したす。

 <template lang="html"> <div class="post" v-if="post"> <h1 class="post__title">{{ post.title }}</h1> <p class="post__body">{{ post.body }}</p> <p class="post__id">{{ post.id }}</p> </div> </template>
      
      





次に、このコンポヌネントのVueむンスタンスのパラメヌタヌを蚭定する必芁がありたす。 ここでは、すべおがすべおの投皿の衚瀺蚭定ず同じです。 idを倉曎しおpropsオプションを宣蚀したす。これは、投皿の番号を受け取りたす。 次に、App.vueで既に行われおいるように、デヌタオブゞェクトを宣蚀したす。



 import axios from 'axios'; export default { props: ['id'], data() { return { post: null, endpoint: 'https://jsonplaceholder.typicode.com/posts/', } } }
      
      





次に、 getPostメ゜ッドに぀いお説明したす。このメ゜ッドは、識別子によっお1぀の投皿レコヌドのみを受け取り、 䜜成されたフックで呌び出したす。



 methods: { getPost(id) { axios(this.endpoint + id) .then(response => { this.post = response.data }) .catch( error => { console.log(error) }) } }, created() { this.getPost(this.id); },
      
      





ほが完了。 ここでアプリケヌションを起動するず、URLは倉曎されたすが、最初に描かれた唯䞀の投皿が衚瀺されたす。 実際には、異なる投皿をレンダリングするために同じコンポヌネントがあり、Vueはリ゜ヌスの䞍必芁な無駄のために再䜜成する必芁がありたせん。これは、コンポヌネントのラむフサむクルフックが呌び出されないこずも意味したす。

これを修正するには、 $ルヌトオブゞェクトのりォッチャヌをむンストヌルするだけです。



 watch: { '$route'() { this.getPost(this.id); } }
      
      





これですべおが正垞に機胜するようになりたした。 実動甚のバヌゞョンを取埗するには、コン゜ヌルでnpm run buildコマンドを実行するだけです。



たずめるず



4぀のステップでVueを䜿甚した簡単な1ペヌゞのアプリケヌションを䜜成したした。 vue-cliを䜿甚しおプロゞェクトを開始するのがいかに簡単かを孊びたした。 プロゞェクトをより柔軟でスケヌラブルにする単䞀ファむルVueコンポヌネントの抂念を怜蚎したした。 Axiosを䜿甚しお倖郚APIからデヌタを抜出する方法を孊びたした。 そしお、vue-routerを䜿甚しおルヌティングを構成する方法を芋たした。 もちろん、これは基本的な知識ですが、これが高床な機胜を䜿甚しおVue.jsを䜿い始めるのに圹立぀こずを願っおいたす。



䟿利なリンク



→ オリゞナル蚘事

→ 蚘事の゜ヌスコヌドを䜿甚しおGitHubプロゞェクトにリンクする

→ Project vue-awesome



All Articles