'How to update data in input after loading data from onSSR?

I'm trying to load my shipping data from server (onSSR) and update to my input form. But it don't update even I put my code in onSSR like:

onSSR(async () => {
      await load();
      await loadCountries();
      if (shipping !== undefined) {
        form.firstName = shipping.value.firstName;
      }
    });

Please help.

<template>
  <ValidationObserver v-slot='{ handleSubmit }'>
    <SfHeading
      :level='3'
      :title="$t('Shipping')"
      class='sf-heading--left sf-heading--no-underline title'
    />
    <div v-if='shipping!=null'>{{ shipping.firstName }}</div>

    <form @submit.prevent='handleSubmit(handleFormSubmit)'>
      <div class='form'>
        <ValidationProvider
          v-if='!isAuthenticated'
          name='email'
          rules='required|email'
          v-slot='{ errors }'
          slim
        >
          <SfInput
            v-model='form.email'
            label='Email'
            name='email'
            class='form__element'
            required
            :valid='!errors[0]'
            :errorMessage='errors[0]'
          />
        </ValidationProvider>
        <ValidationProvider
          name='firstName'
          rules='required|min:2'
          v-slot='{ errors }'
          slim
        >
          <SfInput
            v-model='form.firstName'
            label='First name'
            name='firstName'
            class='form__element form__element--half'
            required
            :valid='!errors[0]'
            :errorMessage='errors[0]'
          />
        </ValidationProvider>
        <ValidationProvider
          name='lastName'
          rules='required|min:2'
          v-slot='{ errors }'
          slim
        >
          <SfInput
            v-model='form.lastName'
            label='Last name'
            name='lastName'
            class='form__element form__element--half form__element--half-even'
            required
            :valid='!errors[0]'
            :errorMessage='errors[0]'
          />
        </ValidationProvider>
        <ValidationProvider
          name='streetName'
          rules='required|min:2'
          v-slot='{ errors }'
          slim
        >
          <SfInput
            v-model='form.addressLine1'
            label='Street name'
            name='streetName'
            class='form__element form__element--half'
            required
            :valid='!errors[0]'
            :errorMessage='errors[0]'
          />
        </ValidationProvider>
        <ValidationProvider
          name='apartment'
          rules='required|min:2'
          v-slot='{ errors }'
          slim
        >
          <SfInput
            v-model='form.addressLine2'
            label='House/Apartment number'
            name='apartment'
            class='form__element form__element--half form__element--half-even'
            required
            :valid='!errors[0]'
            :errorMessage='errors[0]'
          />
        </ValidationProvider>
        <ValidationProvider
          name='city'
          rules='required|min:2'
          v-slot='{ errors }'
          slim
        >
          <SfInput
            v-model='form.city'
            label='City'
            name='city'
            class='form__element form__element--half'
            required
            :valid='!errors[0]'
            :errorMessage='errors[0]'
          />
        </ValidationProvider>
        <ValidationProvider
          name='state'
          slim
        >
          <SfInput
            v-model='form.state'
            label='State/Province'
            name='state'
            class='form__element form__element--half form__element--half-even'
          />
        </ValidationProvider>
        <ValidationProvider
          name='country'
          rules='required|min:2'
          v-slot='{ errors }'
          slim
        >
          <SfSelect
            v-model='form.country'
            label='Country'
            name='country'
            class='form__element form__element--half form__select sf-select--underlined'
            required
            :valid='!errors[0]'
            :errorMessage='errors[0]'
          >
            <SfSelectOption
              v-for='countryOption in countries'
              :key='countryOption.key'
              :value='countryOption.key'
            >
              {{ countryOption.label }}
            </SfSelectOption>
          </SfSelect>
        </ValidationProvider>
        <ValidationProvider
          name='zipCode'
          rules='required|min:2'
          v-slot='{ errors }'
          slim
        >
          <SfInput
            v-model='form.postalCode'
            label='Zip-code'
            name='zipCode'
            class='form__element form__element--half form__element--half-even'
            required
            :valid='!errors[0]'
            :errorMessage='errors[0]'
          />
        </ValidationProvider>
        <ValidationProvider
          name='phone'
          rules='required|digits:9'
          v-slot='{ errors }'
          slim
        >
          <SfInput
            v-model='form.phone'
            label='Phone number'
            name='phone'
            class='form__element form__element--half'
            required
            :valid='!errors[0]'
            :errorMessage='errors[0]'
          />
        </ValidationProvider>
      </div>
      <div class='form'>
        <div class='form__action'>
          <SfButton
            v-if='!isFormSubmitted'
            :disabled='loading'
            class='form__action-button'
            type='submit'
          >
            {{ $t('Select shipping method') }}
          </SfButton>
        </div>
      </div>
      <VsfShippingProvider
        v-if='isFormSubmitted'
        @submit="$router.push('/checkout/billing')"
      />
    </form>
  </ValidationObserver>
</template>

<script>
import {
  SfHeading,
  SfInput,
  SfButton,
  SfSelect
} from '@storefront-ui/vue';
import { ref } from '@vue/composition-api';
import { onSSR, useVSFContext } from '@vue-storefront/core';
import { useShipping, useCountry, useUser } from '@vue-storefront/spree';
import { required, min, digits } from 'vee-validate/dist/rules';
import { ValidationProvider, ValidationObserver, extend } from 'vee-validate';

extend('required', {
  ...required,
  message: 'This field is required'
});
extend('min', {
  ...min,
  message: 'The field should have at least {length} characters'
});
extend('digits', {
  ...digits,
  message: 'Please provide a valid phone number'
});

export default {
  name: 'Shipping',
  components: {
    SfHeading,
    SfInput,
    SfButton,
    SfSelect,
    ValidationProvider,
    ValidationObserver,
    VsfShippingProvider: () => import('~/components/Checkout/VsfShippingProvider')
  },
  setup() {
    const isFormSubmitted = ref(false);
    const {
      shipping,
      load,
      save,
      loading
    } = useShipping();
    const {
      countries,
      load: loadCountries
    } = useCountry();
    const { isAuthenticated } = useUser();
    const { $spree } = useVSFContext();

    const form = ref({
      email: '',
      firstName: '',
      lastName: '',
      streetName: '',
      apartment: '',
      city: '',
      state: '',
      country: '',
      postalCode: '',
      phone: null
    });
    const handleFormSubmit = async () => {
      if (!isAuthenticated.value) await $spree.api.saveGuestCheckoutEmail(form.value.email);
      await save({ shippingDetails: form.value });
      isFormSubmitted.value = true;
    };

    onSSR(async () => {
      await load();
      await loadCountries();
      if (shipping !== undefined) {
        form.firstName = shipping.value.firstName;
      }
    });

    return {
      shipping,
      loading,
      isFormSubmitted,
      isAuthenticated,
      form,
      countries,
      handleFormSubmit
    };
  }
};
</script>


Solution 1:[1]

onSSR(async () => {
      await load();
      await loadCountries();
      if (shipping.value !== undefined) {
        form.firstName = shipping.value.firstName;
      }
    });

You missed the reactivity by vue, there was a missing .value in the shipping variable.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1