22
33import { cached , extend , toObject } from 'shared/util'
44
5- const parseStyleText = cached ( function ( cssText ) {
5+ export const parseStyleText = cached ( function ( cssText ) {
66 const rs = { }
77 if ( ! cssText ) {
88 return rs
@@ -20,17 +20,21 @@ const parseStyleText = cached(function (cssText) {
2020 return rs
2121} )
2222
23- function normalizeStyleData ( styleData : Object ) : Object {
24- const style = normalizeBindingStyle ( styleData . style )
25- const staticStyle = parseStyleText ( styleData . staticStyle )
26- return extend ( extend ( { } , staticStyle ) , style )
23+ // merge static and dynamic style data on the same vnode
24+ function normalizeStyleData ( data : VNodeData ) : ?Object {
25+ const style = normalizeStyleBinding ( data . style )
26+ // static style is pre-processed into an object during compilation
27+ // and is always a fresh object, so it's safe to merge into it
28+ return data . staticStyle
29+ ? extend ( data . staticStyle , style )
30+ : style
2731}
2832
29- export function normalizeBindingStyle ( bindingStyle : any ) : Object {
33+ // normalize possible array / string values into Object
34+ export function normalizeStyleBinding ( bindingStyle : any ) : ?Object {
3035 if ( Array . isArray ( bindingStyle ) ) {
3136 return toObject ( bindingStyle )
3237 }
33-
3438 if ( typeof bindingStyle === 'string' ) {
3539 return parseStyleText ( bindingStyle )
3640 }
@@ -42,25 +46,29 @@ export function normalizeBindingStyle (bindingStyle: any): Object {
4246 * so that parent component's style could override it
4347 */
4448export function getStyle ( vnode : VNode , checkChild : boolean ) : Object {
45- let data = vnode . data
46- let parentNode = vnode
47- let childNode = vnode
48-
49- data = normalizeStyleData ( data )
49+ const res = { }
50+ let styleData
5051
5152 if ( checkChild ) {
53+ let childNode = vnode
5254 while ( childNode . child ) {
5355 childNode = childNode . child . _vnode
54- if ( childNode . data ) {
55- data = extend ( normalizeStyleData ( childNode . data ) , data )
56+ if ( childNode . data && ( styleData = normalizeStyleData ( childNode . data ) ) ) {
57+ extend ( res , styleData )
5658 }
5759 }
5860 }
61+
62+ if ( ( styleData = normalizeStyleData ( vnode . data ) ) ) {
63+ extend ( res , styleData )
64+ }
65+
66+ let parentNode = vnode
5967 while ( ( parentNode = parentNode . parent ) ) {
60- if ( parentNode . data ) {
61- data = extend ( data , normalizeStyleData ( parentNode . data ) )
68+ if ( parentNode . data && ( styleData = normalizeStyleData ( parentNode . data ) ) ) {
69+ extend ( res , styleData )
6270 }
6371 }
64- return data
72+ return res
6573}
6674
0 commit comments