• aboutabout
  • servicesservices
  • worksworks
  • mediamedia
  • contactcontact
  • homeサイトトップ
  • about会社概要
  • services業務内容
  • works実績紹介
  • mediaメディア
  • contactお問い合わせ
ja/

media

メディア

  1. サイトトップ
  2. メディア
  3. プログラミングの記事
  4. v-modelでstateやgettersを変更したい時に使える算出プロパティのset()関数

v-modelでstateやgettersを変更したい時に使える算出プロパティのset()関数

  • 2019.06.13
  • プログラミング
  • Vue.js
Updated: 2019.06.13
フォームなどに入力した値がリアルタイムで変数と同期される双方向バインディングはVueの強みの一つでもあります。ただし、変数にstateを使った場合には仕様上、直接更新することができません。そこで今回はv-modelでstateを更新する方法についてまとめていきたいと思います。  
v-modelを使った双方向バインディングの基本形
まずはVueで扱う双方向バインディングの基本からおさらいです。過去記事「Vue.jsで双方向データバインドを使ったサンプル」にもまとめておりますのでご参考に。   この双方向バインディングは、対象となる入力要素(inputなど)に「v-model」ディレクティブを設定し、その値に変数や関数を指定します。出力側では2重波括弧のマスタッシュ( {{ }} )でv-modelで指定した変数もしくは関数を囲みます。 【Vue】
<template>
 <div id="app">
  <input type="text" v-model="messege">
  <p>入力:{{ messege }}</p> 
 </div>
</template>

<script>
 export default {
  data: function() {
   return {
    messege: 'default'
   }
  }
 }
</script>
  上記では、dataオプションで指定した変数の値がinputで入力した内容と同期される形になります。これが基本的な双方向バインディングの形となります。実際に実装した例を見るとこのような形になります。 v-modelでstateやgettersを変更したい時に使える算出プロパティのset()関数   テキストを入力すると出力側でも値が更新されるのが確認できます。 v-modelでstateやgettersを変更したい時に使える算出プロパティのset()関数   しかし、下記のように変数にstateを参照する場合、v-modelで更新しようとするとエラーになってしまいます。これはVueの仕様でstateの値はmutationsからのみ更新できるというルールに基づいているためです。 v-modelでstateやgettersを変更したい時に使える算出プロパティのset()関数   実際にstateの値も更新されていないのが確認できます。 v-modelでstateやgettersを変更したい時に使える算出プロパティのset()関数   そこで、v-modelでstateの値を更新する方法をいくつか見ていきましょう。  
v-onとdispatch()関数を使ったv-modelでのstateの更新
v-modelでstateの値を更新する方法の1つに、v-onのイベントハンドラで「dispatch()」関数でactionsを呼び出したり「commit()」関数でmutationsを呼び出すことによりstateを更新する方法があります。まずは下記のようにstateやactions、mutationsを定義していきます。 【store.js】
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
 state: {
  messege: 'default' // stateの初期値
 },
 mutations: {
  mutateMessege(state, payload) {
   state.messege = payload;
  }
 },
 actions: {
  commitMessege(store, payload) {
   return store.commit('mutateMessege', payload)
  }
 },
 getters: {
  getStateMessege: (state) => state.messege
 }
})
  stateには初期値を、mutationsにはstateの値を引数である「payload」によって更新されるように、actionsには引数である「payload」を受け取りmutationsに渡すための関数を指定します。stateの値はgettersで取得できるようにしておきます。詳しくはこちらの記事「stateの値を参照するときに使えるgettersについて」を参考に。   そして、Vueファイルの方でロジックを記述していきます。まずテンプレート側の入力要素にはv-modelディレクティブにdataオプションの変数を指定します。そしてv-onディレクティブでイベントを設定し、発火させる関数を指定します。ここではinputイベントで設定しています。必要であれば出力させる要素も用意しておきます。 【Vue】
<template>
 <div id="app">
  <textarea v-model="messege" @input="inputText">
  </textarea>
  <p>入力:{{ messege }}</p>
  <p>stateの値:{{ computedGetState }}</p>
 </div>
</template>

<script>
 export default {
  data: function() {
   return {
    messege: 'default'
   }
  },
  computed: {
   computedGetState() {
    return this.$store.getters.getStateMessege
   }
  },
  methods: {
   inputText() {
    // dispatch()でactionsを呼び出す、もしくはcommit()で直接mutationsを呼び出す
    this.$store.dispatch('commitMessege', this.messege)
   }
  }
 }
</script>
  スクリプトの方では、変数をdataオプションで用意します。そしてmethodsではイベントハンドラに設定した関数を記述します。この関数内で、v-modelで指定した変数を「dispatch()」関数で定義したactionsを呼び出す形になります。dispatchの第一引数には呼び出すactionsの関数を、第二引数には受け取る変数を指定します。ちなみにactionsを経由せずに「commit()」関数で直接mutationsを呼び出してもOKです。   これでv-modelとstateが紐づけられ、双方向バインディングが実装することができました。実際のサンプルを見ていきます。デフォルトではそれぞれの初期値が表示されています。 v-modelでstateやgettersを変更したい時に使える算出プロパティのset()関数   値を入力すると、mutationsを経由して、stateの値が更新されているのが確認できますね。 v-modelでstateやgettersを変更したい時に使える算出プロパティのset()関数    
算出プロパティのset()関数を使ったv-modelでのstateの更新
先ほどのイベントハンドラを使った方法でも実装は可能ですが、少し冗長性が感じられてしまいます。そこで算出プロパティの「set()」関数を使ってよりシンプルに実装する方法についてまとめていきたいと思います。actions、mutationsなどの定義は先程と同じなのですが、Vueの方ではよりすっきりと短いコードになります。 【Vue】
<template>
 <div id="app">
  <textarea v-model="computedGetState">
  </textarea>
  <p>入力:{{ computedGetState }}</p>
  <p>stateの値:{{ computedGetState }}</p>
 </div>
</template>

<script>
 export default {
  computed: {
   computedGetState: {
    get() {
     // 値を返すときはgettersを指定
     return this.$store.getters.getStateMessege
    },
    set(value) {
     // 値の代入はdispatch()でactionsを呼び出す、もしくはcommit()で直接mutationsを呼び出す
     this.$store.dispatch('commitMessege', value)
    }
   }
  }
 }
</script>
  まず、テンプレート側ではv-modelに算出プロパティのcomputedで定義した関数のオブジェクトのキーを指定します。出力する要素にも同じものでOKです。先ほどのものと比べてもかなりスッキリとしましたね。   スクリプト側では、テンプレートで指定したオブジェクトをcomputedに用意していきます。ここで「get()」関数と「set()」関数の2つを用意します。   まず、get()関数の方には、そのままgettersが返されるようにしておきます。つまり、出力される場合はgettersの値が表示されるようになります。   そして、set()関数には引数を受けてdispatch()もしくはcommit()関数でactionsやmutationsを経由してstateの値を更新するようにしておきます。つまり、値が入力されて代入する場合にはその値を受け取りstateが更新される仕組みです。ですので、set()関数には引数が必要になります。この引数にはv-modelで関連づけられた入力要素の入力値が入ります。   実際のサンプルを見ていきます。算出プロパティにあるgettersが初期値に表示されています。 v-modelでstateやgettersを変更したい時に使える算出プロパティのset()関数   入力すると双方向バインディングにより、入力値が同期され、stateにはmutations経由で値が更新され、出力側にはgettersで更新されたstateの値が表示されています。 v-modelでstateやgettersを変更したい時に使える算出プロパティのset()関数 v-modelでstateやgettersを変更したい時に使える算出プロパティのset()関数  
  いかがでしょうか、双方向バインディングにおいては実装ケースも多いかと思いますが、stateの値を扱う場合には少し注意が必要ですね。その場合には上記の方法がとても役に立つのではないでしょうか。
XでシェアLINEで送るはてブに追加

この記事を書いた人オガワ シンヤ

合同会社デザインサプライ代表兼CEO / ディレクター・ウェブデザイナー・フロントエンドエンジニアをやっています。「ウェブとデザインでヒト・モノ・サービスを繋げ新しい価値を生み出す」をコンセプトに日々奮闘中!制作中はダイエットコーラとチョコレートが欠かせないアラフォーWebクリエイター。

Sponsored Link

  • Showcase
  • Startify UI
  • Functional Gradation Generator
  • Coloooors

keyword search

categories

  • WordPress(61)
  • JavaScript(49)
  • Vue.js(48)
  • CSS(46)
  • jQuery(34)
  • Nuxt.js(22)
  • Sass(21)
  • Gulp(17)
  • webpack(16)
  • PHP(14)
  • HTML(14)
  • GSAP(11)
  • React(10)
  • Vite(9)
  • Pug(9)
  • Laravel(8)
  • Cordova(8)
  • Linux(7)
  • Next.js(6)
  • Apache(5)
  • Shopify(4)
  • REST API(4)
  • Node.js(4)
  • Smarty(3)
  • Git(3)
  • JSON(3)
  • その他プログラミング(3)
  • Google Apps API(3)
  • Bootstrap(3)
  • 環境構築・システム(3)
  • TypeScript(2)
  • EJS(2)
  • RMS(2)
  • Docker(2)
  • Instagram API(2)
  • Excel VBA(2)
  • SVG(1)
  • Dart(1)
  • ECカートASP(1)
  • Markdown(1)
  • AMP(1)
  • Nginx(1)
  • XML(1)
  • shellscript(1)
  • Ruby(1)
  • MySQL(1)

recent articles

  • Next.jsとWordPressでヘッドレスCMSのサイトを作成する#6:PWA対応とビルド時のエラー
    read more

    Next.jsとWordPressでヘッドレスCMSのサイトを作成する#6:PWA対応とビルド時のエラー

    2024.12.25/Next.js
  • Next.jsとWordPressでヘッドレスCMSのサイトを作成する#5:アナリティクス・アドセンスの導入とサイトマップ作成
    read more

    Next.jsとWordPressでヘッドレスCMSのサイトを作成する#5:アナリティクス・アドセンスの導入とサイトマップ作成

    2024.08.26/Next.js
  • Next.jsとWordPressでヘッドレスCMSのサイトを作成する#4:静的・動的ルーティングとページ作成
    read more

    Next.jsとWordPressでヘッドレスCMSのサイトを作成する#4:静的・動的ルーティングとページ作成

    2024.07.31/Next.js
  • Next.jsとWordPressでヘッドレスCMSのサイトを作成する#3:メタ情報設定・ファイル最適化・ステート管理
    read more

    Next.jsとWordPressでヘッドレスCMSのサイトを作成する#3:メタ情報設定・ファイル最適化・ステート管理

    2024.06.30/Next.js
  • Next.jsとWordPressでヘッドレスCMSのサイトを作成する#2:コーディング環境の構築
    read more

    Next.jsとWordPressでヘッドレスCMSのサイトを作成する#2:コーディング環境の構築

    2024.05.29/Next.js
  • Next.jsとWordPressでヘッドレスCMSのサイトを作成する#1:インストール・導入
    read more

    Next.jsとWordPressでヘッドレスCMSのサイトを作成する#1:インストール・導入

    2024.04.30/Next.js
  • 次の記事
  • 一覧に戻る
  • 前の記事

まだ依頼内容が決まっていなくても、ご相談ください。

課題の整理や小さな検証、UI/UX・フロントエンドの部分的な支援から始められます。

お問い合わせやご相談はこちらから

Webサイト・プロダクトの企画設計/UI・UXデザイン/フロントエンド開発合同会社デザインサプライ(DesignSupply. LLC)

Office:大阪府大阪市天王寺区清水谷町3-22
Email:info@designsupply-web.com
home
  • サイトトップ
about
  • 3つのポリシー
  • 経営理念
  • 代表・クリエイター紹介
  • 会社概要
services
  • ビジネス・プロダクト支援
  • UI/UX・フロントエンド開発支援
  • プロジェクトの進め方・支援体制
  • エデュケーション事業
works
  • 開発プロジェクト支援
  • クリエイティブ制作
  • 自社プロダクト
media
  • デザイン
  • プログラミング
  • マーケティング
  • Web開発
  • 写真・動画制作
contact
  • お問い合わせ
news
  • インフォメーション
privacy
  • プライバシーポリシー

WE THINK WITH YOU, DESIGN FOR PEOPLE, AND BUILD WHAT WORKS.

WE THINK WITH YOU, DESIGN FOR PEOPLE, AND BUILD WHAT WORKS.

© 2013 - 2026 DesignSupply.LLC
サイトトップへ
contact