Можем ли мы использовать метод expose для возврата других реактивных переменных и вычисляемых свойств, таких как методы в vue 3?

Я меняю свое приложение с vue 2 на vue 3. Используя составной API, я изменил свою предыдущую функцию рендеринга в этом установочном хуке. Проверив некоторую документацию, я узнал, что могу раскрывать методы с помощью context.expose({}).

Теперь мои вопросы:

  1. Как заменить созданный метод в API композиции vue 3? (Как мы знаем, хук установки происходит перед созданием хука, но мы не можем понять, как выполнять эти операции внутри хука установки?)
  2. Можем ли мы вернуть реактивные переменные и вычисляемые свойства с помощью context.expose?

Вот мой скрипт установки:

    <script>
import {h,ref,computed,provide} from 'vue';
export default {
 name: 'something',
 props: some props,
setup(props,context) {
      const currIdx = ref(0);
      const tabCnt = ref(0);
      const idxMap = ref(new Map());
      const idxs = ref([]);

      // other variables

      // computed properties
        const $_size = computed(() =>{
         // 1. check this.size
            if (props.size) {//'medium','small'
                if (props.size === 'medium') return 'medium'
                if (props.size === 'small' ) return 'small'
            }
            // 2. check flags
            if (props.medium) return 'medium'
            if (props.small ) return 'small'
            // 3. default value : 'medium'
            return 'medium';
        });
       // [COMPUTED] Props normalize : SHAPE
        const $_shape = computed(() =>{
            // 1. check this.shape
            if (props.shape) { // 'border','underline','none'
                if (props.shape === 'border'   ) return 'border'
                if (props.shape === 'underline') return 'underline'
                if (props.shape === 'none'     ) return 'none'
            }
            // 2. check flags
            if (props.border   ) return 'border'
            if (props.underline) return 'underline'
            // x. default value : 'border'
            return 'border';
        });


      // [COMPUTED] - [END REGION]
      const getLabelNode = (props) => {
            var label = props.label, idx = props.idx, disabled = !!(props.disabled || props.disable)
            return h('vu-tab-label',{props:{idx, disabled}},[label]);
        };

      
          
          // 2. make window area -> label + navi(?)
        var labelWindow = [];
        labelWindow.push(h("div",{"class":"vu-tab__label-wrapper","ref":"scroll"}, labels));
        if (props.navigation || props.addBtn) {
            labelWindow.push(h(tabNavi))
        }

        // 3. do something
        idxs.value = Array.from(idxMap.value.keys());

        // 4. make class
        let tabClass = [];
        tabClass.push("vu_tab-box");
        tabClass.push(`vu-tab-box--${this.$_shape}`);

        // methods
        const onAddClick =(e) => {
            context.emit('add-tab',e);
        };

        context.expose({
            onAddClick,
        });
  
        // x. return all nodes
        return h("div",{"class":tabClass},[
            h("div",{"class":"vu-tab__label-window","ref":"window"},labelWindow),
            h("div",{"class":"vu-tab__content-wrapper"},contents)
        ]);
    
    },
  }
</script>

Что касается вопроса 1, это созданный мной хук, и я хочу выполнять эти операции внутри установки.

created() {
    // 1. Check default index
    if ( (this.defaultIdx === 0) || this.defaultIdx ) {
        this.currIdx = this.defaultIdx;
        return;
    }
    // 2. check slots
    var slots = this.$slots['default']
    if (!!slots) {
        slots.find(vNode => {
            if (!vNode.componentOptions) { return false }
            var idx = vNode.componentOptions.propsData.idx;
            if (idx === undefined) { return false }
            this.currIdx = idx;
            return true;
        });
    }
},
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

created крючок в API композиции

Это просто, в API композиции нет хуков created или beforeCreate. Он полностью заменен на setup. Вы можете просто запустить свой код в функции setup напрямую или поместить его в функцию, которую вы вызываете из setup.

Являются ли свойства выставленными с помощью expose реактивного

Да. Хотя доступ к значениям дочерних компонентов с использованием ссылок на шаблоны на самом деле не является способом «Vue», это возможно, и переданные значения сохраняют свою реактивность. Я не смог найти никакой документации по этому вопросу, поэтому я быстро реализовал небольшую песочницу кода, чтобы попробовать. Посмотреть на себя.

https://codesandbox.io/s/falling-breeze-twetx3?file=/src/App.vue

(Если вы столкнулись с ошибкой, похожей на «Невозможно использовать импорт вне модуля», просто перезагрузите тестовую программную среду браузера в пределах, похоже, возникла проблема с шаблоном тестовой программной среды кода)

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

Похожие вопросы

Как получить первый элемент из итератора JavaScript, который удовлетворяет функции тестирования
Ошибка импорта PrismaClient в код, скомпилированный из машинописного текста :: экспорт «PrismaClient» не найден
Найдите время, чтобы написать число одной цифрой
Узел apple-signin-auth js реагирует на собственную ошибку: неверный идентификатор открытого ключа токена id
Обходной путь веб-работника модуля
Настройка счетчика в документе, а затем получение его с помощью Firestore: будет ли это нормально или будет слишком дорого?
Discord.js v13 — TypeError: невозможно прочитать свойства неопределенного (чтение «время безотказной работы»)
Не могу найти способ вернуть мои div к значениям по умолчанию (проект Etch a Sketch)
Несоответствие TypeScript - почему компилятор разрешает присвоение значения свойства объекта, но не присваивает возвращаемое значение метода?
Jquery прокручивается вниз только после перенаправления