useProxyImperativeHandle.js 972 B

12345678910111213141516171819202122232425262728293031323334
  1. // Proxy the dom ref with `{ nativeElement, otherFn }` type
  2. // ref: https://github.com/ant-design/ant-design/discussions/45242
  3. import { useImperativeHandle } from 'react';
  4. function fillProxy(element, handler) {
  5. element._antProxy = element._antProxy || {};
  6. Object.keys(handler).forEach(key => {
  7. if (!(key in element._antProxy)) {
  8. const ori = element[key];
  9. element._antProxy[key] = ori;
  10. element[key] = handler[key];
  11. }
  12. });
  13. return element;
  14. }
  15. export default function useProxyImperativeHandle(ref, init) {
  16. return useImperativeHandle(ref, () => {
  17. const refObj = init();
  18. const {
  19. nativeElement
  20. } = refObj;
  21. if (typeof Proxy !== 'undefined') {
  22. return new Proxy(nativeElement, {
  23. get(obj, prop) {
  24. if (refObj[prop]) {
  25. return refObj[prop];
  26. }
  27. return Reflect.get(obj, prop);
  28. }
  29. });
  30. }
  31. // Fallback of IE
  32. return fillProxy(nativeElement, refObj);
  33. });
  34. }