* 查找 React 组件实例 * @author 油小猴 * @description 支持 Fiber 架构遍历,可指定向上查找层级 * @param {HTMLElement} dom - 起始 DOM 元素 * @param {Number} [traverseUp=0] - 向上遍历层级 * @returns {Object|null} React 组件实例或 `null`
(dom, traverseUp = 0)
| 1882 | * @returns {Object|null} React 组件实例或 `null` |
| 1883 | */ |
| 1884 | findReact(dom, traverseUp = 0) { |
| 1885 | let key = Object.keys(dom).find(key => { |
| 1886 | return key.startsWith("__reactFiber$") |
| 1887 | || key.startsWith("__reactInternalInstance$"); |
| 1888 | }); |
| 1889 | let domFiber = dom[key]; |
| 1890 | if (domFiber == null) return null; |
| 1891 | if (domFiber._currentElement) { |
| 1892 | let compFiber = domFiber._currentElement._owner; |
| 1893 | for (let i = 0; i < traverseUp; i++) { |
| 1894 | compFiber = compFiber._currentElement._owner; |
| 1895 | } |
| 1896 | return compFiber._instance; |
| 1897 | } |
| 1898 | let GetCompFiber = fiber => { |
| 1899 | let parentFiber = fiber.return; |
| 1900 | while (base.isType(parentFiber.type) == "string") { |
| 1901 | parentFiber = parentFiber.return; |
| 1902 | } |
| 1903 | return parentFiber; |
| 1904 | }; |
| 1905 | let compFiber = GetCompFiber(domFiber); |
| 1906 | for (let i = 0; i < traverseUp; i++) { |
| 1907 | compFiber = GetCompFiber(compFiber); |
| 1908 | } |
| 1909 | return compFiber.stateNode || compFiber; |
| 1910 | }, |
| 1911 | |
| 1912 | /** |
| 1913 | * 深拷贝 |
nothing calls this directly
no test coverage detected