MapSyncProps

mapSyncProps - помогает удобно работать с синхронными пропами, избавляя от boilerplate типа

export default {
  props: {
    foo: Boolean,
  },

  computed: {
    compFoo: {
      get() {
        return this.foo;
      },
      set(newVal) {
        this.$emit('update:foo', newVal);
      },
    },
  },
};

Хелпер поддерживает 3 набора аргументов: Object, Array, Composition

Object syntax (Options api)

Объектный синтаксис используется в случаях где нужно управлять названием computed свойств

Ключи объекта являются ключами новых computed свойств, значения названиями пропов

Typing

type MapSyncResult<MapKeys extends Record<string, string>> = {
  [K in keyof MapKeys]: GetSet<any>;
}

function mapSyncProps<MapKeys extends Record<string, string>>(arrOrObject: MapKeys): MapSyncResult<MapKeys>;

Новые свойства создаются с верными именами, но имеют тип any

Example

import mapSyncProps, { mapSyncObject } from 'shared-front/lib/utils/map-sync-props';

export default {
  props: {
    foo: Boolean,
    bar: Boolean,
  },

  computed: {
    ...mapSyncProps({
      compFoo: 'foo',
      compSomeBar: 'bar',
    }),
  },
}

Array syntax (Options api)

Синтаксис через массив строк, является небольшим упрощением над объектным, добавляет ко всем ключам префикс comp и делает первый символ заглавными 'foo' -> 'compFoo'

Typing

type MapSyncResult<MapKeys extends Record<string, string>> = {
  [K in keyof MapKeys]: GetSet<any>;
}

function mapSyncProps<Keys extends readonly string[]>(arrOrObject: Keys): MapSyncResult<CompMapKeys<Keys>>;

Новые свойства создаются с верными именами, но имеют тип any

Example

import mapSyncProps, { mapSyncArray } from 'shared-front/lib/utils/map-sync-props';

export default {
  props: {
    foo: Boolean,
    bar: Boolean,
  },

  computed: {
    ...mapSyncProps(['foo', 'bar']),

    // Identical
    // ...mapSyncProps({
    //  compFoo: 'foo',
    //  compBar: 'bar',
    // }),
  },
}

Composition syntax (Composition api)

Синтаксис для использования в Composition API

Первым аргументом принимает функцию emit, вторым пропы в сыром или toRefs виде

Возвращает ToRefs подобный объект

Typing

type UseMapSyncResult<MapValues extends Record<string, any>> = {
  [K in keyof MapValues]: WritableComputedRef<UnwrapRef<MapValues[K]>>
}

function mapSyncProps<MapValues extends Record<string, any>>
  (arrOrObject: SetupContext['emit'], props: MapValues | UnwrapNestedRefs<MapValues>): UseMapSyncResult<MapValues>

Типы полностью сохранены без изменения названий пропов

Examples

import mapSyncProps, { useMapSync } from 'shared-front/lib/utils/map-sync-props';

export default defineComponent({
  props: {
    foo: Boolean,
    bar: Boolean,
  },

  setup(props, context) {
    const {
      foo: compFoo,
      bar: compBar,
    } = mapSyncProps(context.emit, props);

    const baz = computed(() => compFoo.value);

    return {
      compFoo,
      compBar,
      baz,
    };
  },
});
<template>
  <input v-model="modelValue">
</template>

<script setup lang="ts">
import { defineProps, defineEmits } from 'vue';

import mapSyncProps, { useMapSync } from 'shared-front/lib/utils/map-sync-props';


const props = defineProps({ modelValue: String });
const emit = defineEmits(['update:modelValue']);


const { modelValue } = mapSyncProps(emit, props);
</script>