useList.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import XEUtils from "xe-utils";
  2. type CodeType<T> = keyof T & string | ((item: T) => string);
  3. export default function useList<T = any>(opt: {
  4. value: T[];
  5. key: CodeType<T>;
  6. errMsg: ((item: T) => string) | string
  7. } | T[]) {
  8. let trackProxy = () => {
  9. }
  10. let triggerProxy = () => {
  11. }
  12. let list = []
  13. if (XEUtils.isArray(opt)) {
  14. list = opt
  15. }
  16. if (XEUtils.isObject(opt)) {
  17. if (Array.isArray(opt.value)) {
  18. list = value
  19. }
  20. }
  21. const proxy = new Proxy(list, {
  22. get(target, key) {
  23. trackProxy()
  24. return target[key];
  25. },
  26. set(target: any[], p: string | symbol, newValue: any, receiver: any): boolean {
  27. target[p] = newValue;
  28. triggerProxy()
  29. return true;
  30. }
  31. });
  32. return customRef((track, trigger) => {
  33. trackProxy = track;
  34. triggerProxy = XEUtils.debounce(trigger);
  35. return {
  36. get() {
  37. track()
  38. return proxy
  39. },
  40. set(value) {
  41. proxy.length = 0;
  42. proxy.push(...value)
  43. trigger()
  44. }
  45. }
  46. });
  47. }