UNPKG

@antdv/pro-utils

Version:

@antdv/pro-utils

55 lines (54 loc) 1.49 kB
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 };