1- import { isObject , isArray , dash2hump , cached , isEmptyObject } from '@mpxjs/utils'
1+ import { isObject , isArray , dash2hump , cached , isEmptyObject , hasOwn } from '@mpxjs/utils'
22import { Dimensions , StyleSheet } from 'react-native'
33import Mpx from '../../index'
44
@@ -176,14 +176,25 @@ function transformStyleObj (styleObj) {
176176 return transformed
177177}
178178
179+ function isNativeStyle ( style ) {
180+ return Array . isArray ( style ) || (
181+ typeof style === 'object' &&
182+ // Reanimated 的 animated style 通常会包含 viewDescriptors 或 _animations
183+ ( hasOwn ( style , 'viewDescriptors' ) || hasOwn ( style , '_animations' ) )
184+ )
185+ }
186+
179187export default function styleHelperMixin ( ) {
180188 return {
181189 methods : {
182190 __getClass ( staticClass , dynamicClass ) {
183191 return concat ( staticClass , stringifyDynamicClass ( dynamicClass ) )
184192 } ,
185193 __getStyle ( staticClass , dynamicClass , staticStyle , dynamicStyle , hide ) {
186- const result = { }
194+ const isNativeStaticStyle = staticStyle && isNativeStyle ( staticStyle )
195+ let result = isNativeStaticStyle ? [ ] : { }
196+ const mergeResult = isNativeStaticStyle ? ( o ) => result . push ( o ) : ( o ) => Object . assign ( result , o )
197+
187198 const classMap = this . __getClassMap ?. ( ) || { }
188199 const appClassMap = global . __getAppClassMap ?. ( ) || { }
189200
@@ -192,24 +203,34 @@ export default function styleHelperMixin () {
192203 const classString = mpEscape ( concat ( staticClass , stringifyDynamicClass ( dynamicClass ) ) )
193204 classString . split ( / \s + / ) . forEach ( ( className ) => {
194205 if ( classMap [ className ] ) {
195- Object . assign ( result , classMap [ className ] )
206+ mergeResult ( classMap [ className ] )
196207 } else if ( appClassMap [ className ] ) {
197208 // todo 全局样式在每个页面和组件中生效,以支持全局原子类,后续支持样式模块复用后可考虑移除
198- Object . assign ( result , appClassMap [ className ] )
209+ mergeResult ( appClassMap [ className ] )
199210 } else if ( isObject ( this . __props [ className ] ) ) {
200211 // externalClasses必定以对象形式传递下来
201- Object . assign ( result , this . __props [ className ] )
212+ mergeResult ( this . __props [ className ] )
202213 }
203214 } )
204215 }
205216
206217 if ( staticStyle || dynamicStyle ) {
207- const styleObj = Object . assign ( { } , parseStyleText ( staticStyle ) , normalizeDynamicStyle ( dynamicStyle ) )
208- Object . assign ( result , transformStyleObj ( styleObj ) )
218+ const styleObj = { }
219+ if ( isNativeStaticStyle ) {
220+ if ( Array . isArray ( staticStyle ) ) {
221+ result = result . concat ( staticStyle )
222+ } else {
223+ mergeResult ( staticStyle )
224+ }
225+ } else {
226+ Object . assign ( styleObj , parseStyleText ( staticStyle ) )
227+ }
228+ Object . assign ( styleObj , normalizeDynamicStyle ( dynamicStyle ) )
229+ mergeResult ( transformStyleObj ( styleObj ) )
209230 }
210231
211232 if ( hide ) {
212- Object . assign ( result , {
233+ mergeResult ( {
213234 // display: 'none'
214235 // RN下display:'none'容易引发未知异常问题,使用布局样式模拟
215236 flex : 0 ,
@@ -220,8 +241,8 @@ export default function styleHelperMixin () {
220241 overflow : 'hidden'
221242 } )
222243 }
223-
224- return isEmptyObject ( result ) ? empty : result
244+ const isEmpty = isNativeStaticStyle ? result . length > 0 : isEmptyObject ( result )
245+ return isEmpty ? empty : result
225246 }
226247 }
227248 }
0 commit comments