@antdv/pro-utils
Version:
@antdv/pro-utils
55 lines (54 loc) • 1.49 kB
JavaScript
import {
computed,
ref,
unref,
watch
} from "vue";
import { useState } from "../useState/index.mjs";
function hasValue(value) {
return value !== void 0;
}
function useMergedState(defaultStateValue, option) {
const { defaultValue, value = ref(), onChange, postState } = option || {};
const [innerValue, setInnerValue] = useState(() => {
if (hasValue(unref(value))) {
return unref(value);
} else if (hasValue(defaultValue)) {
return typeof defaultValue === "function" ? defaultValue() : defaultValue;
} else {
return typeof defaultStateValue === "function" ? defaultStateValue() : defaultStateValue;
}
});
const mergedValue = computed(() => unref(value) !== void 0 ? unref(value) : innerValue.value);
const postMergedValue = computed(() => {
return postState ? postState(mergedValue.value) : mergedValue.value;
});
const [prevValue, setPrevValue] = useState([mergedValue.value]);
watch(
prevValue,
() => {
const prev = prevValue.value[0];
if (innerValue !== prev) {
onChange == null ? void 0 : onChange(innerValue.value, prev);
}
},
{ flush: "post" }
);
watch(
value,
() => {
if (!hasValue(unref(value))) {
setInnerValue(unref(value));
}
},
{ flush: "post" }
);
const triggerChange = (updater) => {
setInnerValue(updater);
setPrevValue([mergedValue.value]);
};
return [postMergedValue, triggerChange];
}
export {
useMergedState
};