Vue3: как смешивать api композиции и api параметров для пространств имён composable/mixin

Добрый день!

Скажем, я хочу использовать Vue с опциями api, но также не хочу использовать миксины, поскольку они вызывают много проблем. Я хочу использовать составные элементы в качестве миксинов, чтобы задать пространство имен для миксинов / составных компонентов.

Итак, моим «решением» было объединить api параметров и api композиции.

Скажем, у меня есть такой миксин:

      export default {
  data() {
    return {
      person: {
        first_name: 'first name',
        last_name: 'last name',
      },
      gender: 'gender'
    }
}

Поэтому я решил преобразовать его в составной объект следующим образом:

      export default () => {
  const person = reactive({first_name: 'fn', last_name: 'ln'});
  const gender = ref('gender');
  
  return {
    person,
    gender,
  }
}

Итак, в моем файле .vue я могу импортировать составной:

      <script lang="ts">
import useDataComposable from './dataMixin';
...

export default defineComponent({
  ...
  setup() {
    const dataComposable = useDataComposable();
    dataComposable.gender.value = 'gender2';
    dataComposable.person.first_name = 'first name2';

    return {dataComposable};
  },
  created() {
    // I want to use data and methods inside the composable as namespace.attribute
    // eg:
    console.log(this.dataComposable.person.first_name) // => returns 'first name2'
 
    // However,
    console.log(this.dataComposable.gender // does not return 'gender2';
      // but returns Ref object.
...

Я знаю, что могу деструктурировать составной объект в функции настройки и вернуть его:

      <script lang="ts">
import useDataComposable from './dataMixin';
...

export default defineComponent({
  ...
  setup() {
    const {person, gender}= useDataComposable();

    return {
      person, gender,
    };
  },
  created() {
    console.log(this.person.first_name) // => returns 'first name2'
 
    // However,
    console.log(this.gender // returns 'gender2';
...

Однако в этом нет никакого смысла, так как это все равно будет смешано с состоянием компонента.

Кроме того, я мог бы просто использовать миксины только с одним объектом, но я не уверен в этом.

      export default {
  data() {
    return {
      state: {
        person: {
          first_name: 'first name',
          last_name: 'last name',
        },
        gender: 'gender',
        
        myMethod: function() {...},
        computed: function() {...}
      },
      
      created() {...},
      onMounted() {...},
      watch: {
        gender(value) {...}.
      },
    }
}

Мне любопытно, можно ли делать то, что я хочу.

Есть ли способ использовать объект с реактивными элементами и элементами ref из composable в коде параметров api vue?

Заранее спасибо!

1 ответ

Вы можете: деструктурировать и добавить return { namespace: { person, gender} } Изменить компонуемый объект, чтобы он возвращал реактивный объект, содержащий и человека, и пол.

Другие вопросы по тегам