useMergedState.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = useMergedState;
  6. var _vue = require("vue");
  7. function useMergedState(defaultStateValue, option) {
  8. const {
  9. defaultValue,
  10. value = (0, _vue.ref)()
  11. } = option || {};
  12. let initValue = typeof defaultStateValue === 'function' ? defaultStateValue() : defaultStateValue;
  13. if (value.value !== undefined) {
  14. initValue = (0, _vue.unref)(value);
  15. }
  16. if (defaultValue !== undefined) {
  17. initValue = typeof defaultValue === 'function' ? defaultValue() : defaultValue;
  18. }
  19. const innerValue = (0, _vue.ref)(initValue);
  20. const mergedValue = (0, _vue.ref)(initValue);
  21. (0, _vue.watchEffect)(() => {
  22. let val = value.value !== undefined ? value.value : innerValue.value;
  23. if (option.postState) {
  24. val = option.postState(val);
  25. }
  26. mergedValue.value = val;
  27. });
  28. function triggerChange(newValue) {
  29. const preVal = mergedValue.value;
  30. innerValue.value = newValue;
  31. if ((0, _vue.toRaw)(mergedValue.value) !== newValue && option.onChange) {
  32. option.onChange(newValue, preVal);
  33. }
  34. }
  35. // Effect of reset value to `undefined`
  36. (0, _vue.watch)(value, () => {
  37. innerValue.value = value.value;
  38. });
  39. return [mergedValue, triggerChange];
  40. }