UNPKG

at-rn-android-kit

Version:

为 React Native 开发 提供的一些Android原生模块/组件 (react native, CoordinatorLayout, AppBarLayout, TabLayout, NestedScrollView, PopupWindow)

77 lines (60 loc) 2.02 kB
import React from 'react'; import {UIManager, findNodeHandle} from 'react-native'; import {ViewGroupProperties} from './types'; export default class Layout { static setChildrenLayoutParams( component: React.Component<ViewGroupProperties, any>, manager: any, defaultParams?: any): void { if (!component || !manager) { return; } let currentChildrelLayoutParams = (component).__currentChildLayoutParams; let nextChildrelLayoutParams: any[] = []; const hasDefaultParams = !!defaultParams; React.Children.map(component.props.children || [], (child: any, index: number) => { if (!child.props.layoutParams && !hasDefaultParams) { return; } nextChildrelLayoutParams.push(Object.assign( {}, defaultParams, child.props.layoutParams, {childIndex: index} )); }); if (!nextChildrelLayoutParams.length) { return; } if (layoutParamsIsEqualTo(currentChildrelLayoutParams, nextChildrelLayoutParams)) { return; } (component).__currentChildLayoutParams = nextChildrelLayoutParams; UIManager.dispatchViewManagerCommand( findNodeHandle(component), manager.Commands.setChildrenLayoutParams, [nextChildrelLayoutParams]); } } function layoutParamsIsEqualTo<T>(params1: T[], params2: T[]) { if (!params1 || !params2) { return false; } if (params1.length !== params2.length) { return false; } for (let i = 0, l = params1.length; i < l; i++) { if (!paramIsEqualTo(params1[i], params2[i])) { return false; } } return true; } function paramIsEqualTo(param1: any, param2: any) { for (let key of Object.keys(param1)) { if (param1[key] !== param2[key]) { return false; } } return true; }