2026-09-02 16:10:57 +08:00

105 lines
2.1 KiB
TypeScript

// @ts-nocheck
// #ifdef VUE3
export * from 'vue';
// #endif
// #ifndef VUE3
// #ifndef VUE2 && APP
export * from '@vue/composition-api';
// #endif
// #ifdef VUE2
export * from '@vue/composition-api';
import * as _vue from '@vue/composition-api';
export function toValue(source) {
// 处理函数
if (typeof source === 'function') {
return source();
}
// 处理 ref
if (_vue.isRef(source)) {
return source.value;
}
// reactive 对象直接返回
return source;
}
// #endif
// #ifdef VUE2 && APP
/**
* 在 Vue 2 中模拟 onScopeDispose
* 原理:利用组件的 beforeDestroy 钩子来执行清理函数
*/
// export function onScopeDispose(fn) {
// if(_vue.onScopeDispose) {
// _vue.onScopeDispose(fn)
// }
// }
// vue2 app computed无法响应
export function computed(getterOrOptions) {
const isGetter = typeof getterOrOptions === 'function';
const getter = isGetter ? getterOrOptions : getterOrOptions.get;
const setter = !isGetter ? getterOrOptions.set : undefined;
if (typeof getter !== 'function') {
throw new Error('computed 的 getter 必须是一个函数');
}
if (!isGetter) {
if (!getterOrOptions || typeof getterOrOptions !== 'object') {
throw new Error('computed 参数必须是函数或包含 get 方法的对象');
}
if (!getterOrOptions.get) {
throw new Error('computed 对象必须包含 get 方法');
}
if (setter !== undefined && typeof setter !== 'function') {
throw new Error('computed 的 setter 必须是函数');
}
}
const internalValue = _vue.ref(getter());
const result = _vue.customRef((track, trigger) => {
return {
get() {
track();
return internalValue.value;
},
set(newValue) {
internalValue.value = newValue
if (setter) {
setter(newValue)
}
trigger()
}
};
});
const stop = _vue.watchEffect(() => {
const newValue = getter();
internalValue.value = newValue
})
if(_vue.getCurrentScope()){
_vue.onScopeDispose(() => {
stop();
});
}
return result;
}
// #endif
// #ifdef APP-NVUE
import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)
// #endif
// #endif