2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

フォームの値をキャッシュできるkeep-aliveを使ってみた(Vue.js / Nuxt.js)

Posted at

はじめに

登録フォームと入力確認フォームで、次の画面に進んで「やっぱ戻る!」となった時でも値がキャッシュされるようにできたのでその方法をこちらに記載します。

現在作成中のサービスで動作確認を行っていますので、ビジュアル的にイマイチなところはご了承くださいm(_ _)m

keep-aliveを使う

フォームの値をキャッシュする時に便利な仕組みがあります。
使い方は公式ドキュメントにわかりやすい例がのっています。
今回はそれを自分のサービス内で使ってどう書いたか、というところを説明します。
動的 & 非同期コンポーネント - Vue.js

まず動的コンポーネントとは?

動的なコンポーネントとは、ユーザーの操作やアプリケーションの状態によって、コンポーネントを切り替える仕組みです。
動的コンポーネントを使用すると、例えばタブ付きのインターフェースを持つアプリケーションで、タブがクリックされた時にタブページに表示されるコンポーネントを切り替えることができます。

コンポーネントを動的に切り替える 要素 [Vue.js]

つまり、何らかの操作や変化が加わった際に状態を変えるコンポーネントのことだと理解しました。Vueでよくある書き方だとv-ifやisなどでしょうか。

次で実際に書いたコードを見ていきます。

keep-aliveを使ったコードの全体像

まずコードの全体像を貼り、その後keep-aliveを使った場合と使わなかった場合の違いを説明します。


こちらのフォームを構成する要素は3つ。

メインとなるregistration.vueのページと、FormListInput コンポーネント、 FormListConfirmコンポーネントです。FormListInput は入力フォーム、FormListConfirm は登録が完了しましたと告げるページです。

pages/registration.vue
<template>
   <div>
       <keep-alive>
          <form-list-input v-if="formNumber === 0" />
          <form-list-confirm v-if="formNumber === 1" />
       </keep-alive>
       <button v-if="formNumber === 0" @click="plusNum">次へ</button>
       <button v-if="formNumber === 1" @click="minusNum">戻る</button>
   </div>
</template>

<script>
import FormListInput from '../../components/FormListInput.vue'
import FormListConfirm from '../../components/FormListConfirm.vue'

export default {
  components: {
      FormListInput,
      FormListConfirm,
  },
  data(){
      return {
          formNumber: 0,
      }
  },
  methods: {
      plusNum() {
          this.formNumber ++;
      },
      minusNum() {
          this.formNumber --;
      }
  }

}
</script>

components/FormListInput.vue
<template>
    <div>
        <h1>チームを登録する</h1>
        <label for="チーム名">チーム名:</label><input type="text" v-model="name">
        <label for="チーム名">競技レベル:</label><input type="text" v-model="level">
        <label for="チーム名">活動場所:</label><input type="text" v-model="area">
    </div>
</template>

<script>
export default {
    data(){
        return {
            name: "",
            level: "",
            area: "",
        }
    },
}
</script>

components/FormListConfirm.vue
<template>
    <div>
        <h1>登録内容を確認する</h1>
    </div>
</template>

コードの詳細

ここでkeep-aliveを使った場合と使わなかった場合を比べます。

###keep-aliveを使わなかった場合

<template>
    <div>
      <form-list-input v-if="formNumber === 0" />
      <form-list-confirm v-if="formNumber === 1" />
      <button v-if="formNumber === 0" @click="plusNum">次へ</button>
      <button v-if="formNumber === 1" @click="minusNum">戻る</button>
    </div>
</template>

...省略

※下記画像に表示される「フォーム番号:0」のコードは消してありますので気にしないでください。


**フォームを入力する** ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230656/621b416b-e20d-76be-5888-5fd21d45247f.png)

次へボタンで画面が切り替わった

2.png

ここで戻るボタンを押すと入力した値が消えている

3.png

###keep-aliveを使った場合

<template>
   <div>
       <keep-alive>
          <form-list-input v-if="formNumber === 0" />
          <form-list-confirm v-if="formNumber === 1" />
       </keep-alive>
       <button v-if="formNumber === 0" @click="plusNum">次へ</button>
       <button v-if="formNumber === 1" @click="minusNum">戻る</button>
   </div>
</template>

**フォーム入力**

4.png

確認画面へ

5.png

戻るを押しても値が保持されていることがわかる

6.png

さいごに

keep-aliveタグで囲むだけで入力値のキャッシュができるのはとても便利です。ただこの方法だとまだブラウザバックに対応しきれていないのでそこの対応は別途必要になります。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?