Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Map computed field with vuex-map-fields

I have a question about mapping computed fields using vuex-map-fields.

I have a Vuex Store:

export const state = () => ({
  countryCode: null,
  phoneNumber: null,
  phone: null
})

The form has two input fields: countryCode and phoneNumber. I want the phone value will be updated based on countryCode and phoneNumber.

How do I solve the problem with vuex-map-fields?

like image 366
ansidev Avatar asked Apr 21 '26 15:04

ansidev


1 Answers

Based on the vuex-map-fields README, edit your store setup to use getField getter and updateField mutation from vuex-map-fields:

// store.js
import { getField, updateField } from 'vuex-map-fields'

export default new Vuex.Store({
  //...
  state: {
    countryCode: '',
    phoneNumber: '',
  },
  getters: {
    getField,
  },
  mutations: {
    updateField,
  },
})

...and then your component would use mapFields from vuex-map-fields:

<template>
  <div id="app">
    <input v-model="countryCode">
    <input v-model="phoneNumber">
  </div>
</template>

<script>
import { mapFields } from 'vuex-map-fields';

export default {
  //...
  computed: {
    ...mapFields([
      'countryCode',
      'phoneNumber',
    ]),
  },
}
</script>

For phone to be computed from the other two state variables, you could use a Vuex getter that formats it:

// store.js
const store = new Vuex.Store({
  //...
  getters: {
    phone: state => `${state.countryCode}-${state.phoneNumber}`
  },
})

...then use Vuex's mapGetter to display phone in your component:

<template>
  <div>
    <pre>phone: {{ phone }}</pre>
  </div>
</template>

<script>
import { mapGetters } from 'vuex'

export default {
  //...
  computed: {
    ...mapGetters(['phone'])
  }
}
</script>

Altogether, your component would look similar to this:

<template>
  <div>
    <input v-model="countryCode" type="number">
    <pre>countryCode: {{ countryCode }}</pre>
    <input v-model="phoneNumber" type="tel">
    <pre>phoneNumber: {{ phoneNumber }}</pre>
    <pre>phone: {{ phone }}</pre>
  </div>
</template>

<script>
import { mapFields } from 'vuex-map-fields'
import { mapGetters } from 'vuex'

export default {
  computed: {
    ...mapFields(['countryCode', 'phoneNumber']),
    ...mapGetters(['phone'])
  }
}
</script>

Edit Using vuex-map-fields

like image 63
tony19 Avatar answered Apr 23 '26 09:04

tony19



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!