Skip to content

Commit 9d567bf

Browse files
authored
Merge pull request #2163 from didi/feat-nativecomponent-style
Feat RN原生组件标签支持使用class/style
2 parents ba2be25 + d3a91e5 commit 9d567bf

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { isObject, isArray, dash2hump, cached, isEmptyObject } from '@mpxjs/utils'
1+
import { isObject, isArray, dash2hump, cached, isEmptyObject, hasOwn } from '@mpxjs/utils'
22
import { Dimensions, StyleSheet } from 'react-native'
33
import 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+
179187
export 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
}

packages/webpack-plugin/lib/template-compiler/compiler.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2737,8 +2737,8 @@ function processElement (el, root, options, meta) {
27372737
processIf(el)
27382738
processFor(el)
27392739
processRefReact(el, meta)
2740+
processStyleReact(el, options)
27402741
if (!pass) {
2741-
processStyleReact(el, options)
27422742
processEventReact(el, options)
27432743
processComponentGenerics(el, meta)
27442744
processComponentIs(el, options)

0 commit comments

Comments
 (0)