Извлечение реквизитов для отдельного модуля в Vue composition API в typescript

#javascript #typescript #vue.js #vuejs3 #vue-composition-api

#javascript #typescript #vue.js #vuejs3 #vue-composition-api

Вопрос:

Я пытаюсь перенести какой-то старый код из Vue options API JS в Vue composition API TS, и у меня получается следующее сочетание:

 export default {
  props: {
    time: {
      default: 1,
      type: String | Number,
    },
    iterations: {
      default: 1,
      type: String | Number,
    },
  },
  data: () => ({
    animation: '',
  }),
  methods: {
    animate() {
      this.animation = `move ${this.time}s ease-in-out ${this.iterations} forwards`
    },
  },
}
 

Теперь у меня возникли некоторые проблемы с поиском правильного способа ввода реквизита при одновременном сохранении значений по умолчанию и реактивности. В этом, например, значения по умолчанию теряются:

 export default (props: {
  time: string | number
  iterations: string | number
}) => {
  const animation = ref('')
  const animate = () => {
    animation.value = `move ${props.time}s ease-in-out ${props.iterations} forwards`
  }
  return {
    animation,
    animate,
  }
}
 

Тогда как здесь я теряю реактивность, поскольку я разрушаю параметр реквизита:

 export default ({
  time = 1,
  iterations = 1,
}: {
  time: string | number
  iterations: string | number
}) => {
  const animation = ref('')
  const animate = () => {
    animation.value = `move ${time}s ease-in-out ${iterations} forwards`
  }
  return {
    animation,
    animate,
  }
}
 

Как я могу это исправить?

Ответ №1:

Я выберу второе решение и добавлю экспорт для объекта props

 export const moduleProps {
  time: {
    default: 1,
    type: [String, Number],
  },
  iterations: {
    default: 1,
    type: [String, Number],
  },
}
 

Немного избыточно, но это работает