tag:crieit.net,2005:https://crieit.net/tags/vue-router/feed 「vue-router」の記事 - Crieit Crieitでタグ「vue-router」に投稿された最近の記事 2020-02-19T19:57:45+09:00 https://crieit.net/tags/vue-router/feed tag:crieit.net,2005:PublicArticle/15725 2020-02-19T19:57:45+09:00 2020-02-19T19:57:45+09:00 https://crieit.net/posts/Nuxt-js-5e4d14a9d61f4 Nuxt.jsで編集中に、ページ移動やページを閉じるときに警告を出すやつ <p>よくある編集中に、ページを離れると、<br /> 「編集中のデータが消えちゃうよ」<br /> と教えてしてくれるやつを調べたときの備忘録。</p> <p>ページを閉じるときに出るこんなのや</p> <p><a href="https://crieit.now.sh/upload_images/7a311dc945e4b02e674c6ac135927b435e4d144cbcdfd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7a311dc945e4b02e674c6ac135927b435e4d144cbcdfd.png?mw=700" alt="スクリーンショット 2020-02-19 15.18.53.png" /></a></p> <p>戻るや別のページに移動しようとするときに出るこんなの</p> <p><a href="https://crieit.now.sh/upload_images/365938af5e847d960e78a9bcd81601375e4d1457433bf.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/365938af5e847d960e78a9bcd81601375e4d1457433bf.png?mw=700" alt="スクリーンショット 2020-02-19 15.19.33.png" /></a></p> <h3 id="ソースコード"><a href="#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89">ソースコード</a></h3> <p>中身はこんな感じ。Mixinで実装してるけど、pageでもOK。</p> <p>ページを閉じるときと、ページを移動するときとで処理が異なり、</p> <ol> <li>ページを閉じるとき ... windowのbeforeunloadイベントでハンドリング</li> <li>ページを移動するとき ... vue-routerのbeforeRouteLeaveでハンドリング</li> </ol> <p>という感じになる。</p> <p>なにも編集してないときに出るのが嫌なので、<br /> <code>isBlockUnload</code>というフラグを使って制御できるようにしてる。</p> <pre><code class="typescript">import Vue from "vue"; import Component from "vue-class-component"; @Component export default class BlockUnloadMixin extends Vue { // 表示するメッセージ protected blockUnloadMessage = "編集した内容が消えちゃうけど、移動する?"; // アラートを出すかのフラグ protected isBlockUnload: boolean = false; // **************************** // * ページを閉じるときの処理: beforeunloadイベント // **************************** created() { if (process.client) { // 作成時にイベントリスナーに登録 window.addEventListener("beforeunload", this.checkWindow); } } beforeDestroy() { // 破棄される前にイベントリスナーから削除 window.removeEventListener("beforeunload", this.checkWindow); } // 実際の処理 protected checkWindow(event: BeforeUnloadEvent) { if (!!this.isBlockUnload) { // unloadをキャンセルして、メッセージを表示 event.preventDefault(); event.returnValue = this.blockUnloadMessage; } } // **************************** // * ページを移動するときの処理: v-router // **************************** beforeRouteLeave(to, from, next) { if (!!this.isBlockUnload) { // アラートダイアログを表示して、結果に応じて遷移 const msg = this.blockUnloadMessage; const answer = window.confirm(msg); next(answer); } else { // next()は必ず呼び出さないといけない next(); } } } </code></pre> <h3 id="Mixinsを使う例"><a href="#Mixins%E3%82%92%E4%BD%BF%E3%81%86%E4%BE%8B">Mixinsを使う例</a></h3> <p>使うときはこんな感じ。</p> <pre><code class="html"><template> <div><!-- 略... --></div> </template> <script lang="ts"> import { Component, Vue, mixins } from "nuxt-property-decorator"; // minins import BlockUnloadMixin from "~/mixins/BlockUnloadMixin"; // ※ mixinsでBlockUnloadMixinを追加 @Component export default class CreateMap extends mixins(BlockUnloadMixin) { // なんかあたりが更新されるときによばれるなにか private changeValue(val: string) { // 略... // ※ 変更があったら、アラートを出すフラグをONにする this.isBlockUnload = true; } } </script> </code></pre> <p>以上!!</p> <h3 id="へんあいマップをリリースしました!"><a href="#%E3%81%B8%E3%82%93%E3%81%82%E3%81%84%E3%83%9E%E3%83%83%E3%83%97%E3%82%92%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81">へんあいマップをリリースしました!</a></h3> <p>「偏愛マップ」を簡単に作れるWebアプリです!</p> <p><a href="https://crieit.now.sh/upload_images/8031402d59242e760178c357223a16245e4d146e01def.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8031402d59242e760178c357223a16245e4d146e01def.png?mw=700" alt="ogp_top.png" /></a></p> <p>偏愛マップは人見知りや口下手な人にも優しいコミュニケーションツールで、<br /> 勉強会、懇親会、オフ会などの余興・アイスブレイクや自分のプロフィールにも!</p> <p>よかったら遊んでみてください(<em>´ω`</em>)</p> <p><a target="_blank" rel="nofollow noopener" href="https://hen-ai.net/">好きを集めた自己紹介マップ|へんあいマップ</a></p> <h1 id="参考にしたサイト様"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88%E6%A7%98">参考にしたサイト様</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://blog.fukata.org/archives/9613">Vue.jsでbeforeunloadを正しく実装する | blog.fukata.org</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/issan/items/7facec98aebfc7f6c326">vue.jsでフォームを離脱するときに警告をだすやつを実装する - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://gist.github.com/saneatsu/975f13109cde46763fedbfdebd10098d">nuxtjs_memo.md</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://webbibouroku.com/Blog/Article/js-unload-confirm">[Javascript] Webページからの離脱時に確認メッセージを表示する方法 │ Web備忘録</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/API/Window/beforeunload_event">Window: beforeunload イベント - Web API | MDN</a></li> </ul> きらぷか@積読ハウマッチ/SSSAPIなど tag:crieit.net,2005:PublicArticle/14719 2019-01-14T01:06:52+09:00 2019-01-14T01:07:09+09:00 https://crieit.net/posts/Vue-Vue-Router-Vuex-Laravel-16 Vue + Vue Router + Vuex + Laravel チュートリアル(全16回)を書きました。 <p><img src="https://cdn.hypertextcandy.com/posts/vue-laravel-tutorial/eye-catch.jpg" alt="" /></p> <p><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com">技術ブログ</a>に<br /> 『<a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-introduction/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう</a>(全16回)』<br /> を公開しました 😄👏🎉</p> <p>出来るだけたくさんの方に見てほしいので宣伝エントリを書きます。</p> <h2 id="コンテンツ"><a href="#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84">コンテンツ</a></h2> <p>フロントエンドに Vue.js + Vue Router + Vuex と<br /> サーバーサイドに Laravel を使用して写真共有アプリを開発するという内容です。</p> <p>こんなやつ 👇 ができます。</p> <p><img src="https://cdn.hypertextcandy.com/posts/vue-laravel-tutorial/VLT-vuesplash-1.jpg" alt="トップページ" /></p> <p>写真を投稿できます。</p> <p><img src="https://cdn.hypertextcandy.com/posts/vue-laravel-tutorial/VLT-vuesplash-7.jpg" alt="写真投稿パネル" width="480" /></p> <p>コメント投稿、いいね、ダウンロード機能も実装します。</p> <p><img src="https://cdn.hypertextcandy.com/posts/vue-laravel-tutorial/VLT-vuesplash-5.jpg" alt="写真閲覧ページ" /></p> <p>ログイン・会員登録といった認証機能もカバーします。</p> <p><img src="https://cdn.hypertextcandy.com/posts/vue-laravel-tutorial/VLT-vuesplash-3.jpg" alt="ログイン / 会員登録ページ" /></p> <p>ちなみにチュートリアルで扱うツールなどのバージョンは以下の通りです。</p> <div class="table-responsive"><table> <thead> <tr> <th align="center">Node</th> <th align="center">npm</th> <th align="center">Vue.js</th> <th align="center">Vue Router</th> <th align="center">Vuex</th> <th align="center">PHP</th> <th align="center">Laravel</th> </tr> </thead> <tbody> <tr> <td align="center">10.7.0</td> <td align="center">6.4.1</td> <td align="center">2.5.21</td> <td align="center">3.0.2</td> <td align="center">3.0.1</td> <td align="center">7.2.10</td> <td align="center">5.7.19</td> </tr> </tbody> </table></div> <h2 id="学べること"><a href="#%E5%AD%A6%E3%81%B9%E3%82%8B%E3%81%93%E3%81%A8">学べること</a></h2> <ul> <li>Vue.js と Laravel を組み合わせる</li> <li>ルーティングライブラリ Vue Router を取り入れる</li> <li>状態管理ライブラリ Vuex を取り入れる</li> <li>タブやローディングを作る</li> <li>Vue.js + Laravel の構成でクッキー認証と CSRF 対策を行う</li> <li>SPA でエラー処理を行う</li> </ul> <h2 id="こんな人に読んでほしい"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E4%BA%BA%E3%81%AB%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%BB%E3%81%97%E3%81%84">こんな人に読んでほしい</a></h2> <p>Vue や Laravel について、</p> <ul> <li>入門書を読んだあとに実際に何か作ってみたい!という人</li> <li>仕事などで触れて基本的な機能はわかったけどゼロからアプリを作ったことはない人</li> </ul> <p>より複雑なアプリを作れるようになるためのきっかけになればいいなと思います 🤗</p> <h2 id="連載記事"><a href="#%E9%80%A3%E8%BC%89%E8%A8%98%E4%BA%8B">連載記事</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-introduction/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (1) イントロダクション</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-application-design/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (2) アプリケーションの設計</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-setting-up-spa-project/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (3) SPA開発環境とVue Router</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-authentication/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (4) 認証API</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-authentication-part-2/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (5) 認証ページ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-authentication-part-3/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (6) 認証機能とVuex</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-authentication-part-4/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (7) 認証機能とVuex Part.2</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-error-handling/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (8) エラーハンドリング</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-submit-photo/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (9) 写真投稿API</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-submit-photo-part-2/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (10) 写真投稿フォーム</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-list-photos/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (11) 写真一覧取得API</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-list-photos-part-2/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (12) 写真一覧ページ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-photo-detail/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (13) 写真詳細ページ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-add-comment/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (14) コメント投稿機能</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-likes/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (15) いいね機能</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.hypertextcandy.com/vue-laravel-tutorial-error-handling-part-2/">Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (16) エラーハンドリング Part.2</a></li> </ul> <p>🚀🚀🚀</p> <p>以上です。ぜひチェックしてみてください。</p> Masahiro Harada