parent
							
								
									f6afe7000e
								
							
						
					
					
						commit
						0cd98c3040
					
				@ -74,6 +74,7 @@ describe(`runtime-dom: style patching`, () => {
 | 
				
			|||||||
    const store: any = {}
 | 
					    const store: any = {}
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      style: {
 | 
					      style: {
 | 
				
			||||||
 | 
					        display: '',
 | 
				
			||||||
        WebkitTransition: '',
 | 
					        WebkitTransition: '',
 | 
				
			||||||
        setProperty(key: string, val: string) {
 | 
					        setProperty(key: string, val: string) {
 | 
				
			||||||
          store[key] = val
 | 
					          store[key] = val
 | 
				
			||||||
@ -96,4 +97,15 @@ describe(`runtime-dom: style patching`, () => {
 | 
				
			|||||||
    patchProp(el as any, 'style', {}, { transition: 'all 1s' })
 | 
					    patchProp(el as any, 'style', {}, { transition: 'all 1s' })
 | 
				
			||||||
    expect(el.style.WebkitTransition).toBe('all 1s')
 | 
					    expect(el.style.WebkitTransition).toBe('all 1s')
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('multiple values', () => {
 | 
				
			||||||
 | 
					    const el = mockElementWithStyle()
 | 
				
			||||||
 | 
					    patchProp(
 | 
				
			||||||
 | 
					      el as any,
 | 
				
			||||||
 | 
					      'style',
 | 
				
			||||||
 | 
					      {},
 | 
				
			||||||
 | 
					      { display: ['-webkit-box', '-ms-flexbox', 'flex'] }
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    expect(el.style.display).toBe('flex')
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { isString, hyphenate, capitalize } from '@vue/shared'
 | 
					import { isString, hyphenate, capitalize, isArray } from '@vue/shared'
 | 
				
			||||||
import { camelize } from '@vue/runtime-core'
 | 
					import { camelize } from '@vue/runtime-core'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Style = string | Partial<CSSStyleDeclaration> | null
 | 
					type Style = string | Record<string, string | string[]> | null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function patchStyle(el: Element, prev: Style, next: Style) {
 | 
					export function patchStyle(el: Element, prev: Style, next: Style) {
 | 
				
			||||||
  const style = (el as HTMLElement).style
 | 
					  const style = (el as HTMLElement).style
 | 
				
			||||||
@ -13,7 +13,7 @@ export function patchStyle(el: Element, prev: Style, next: Style) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    for (const key in next) {
 | 
					    for (const key in next) {
 | 
				
			||||||
      setStyle(style, key, next[key] as string)
 | 
					      setStyle(style, key, next[key])
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (prev && !isString(prev)) {
 | 
					    if (prev && !isString(prev)) {
 | 
				
			||||||
      for (const key in prev) {
 | 
					      for (const key in prev) {
 | 
				
			||||||
@ -27,21 +27,29 @@ export function patchStyle(el: Element, prev: Style, next: Style) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const importantRE = /\s*!important$/
 | 
					const importantRE = /\s*!important$/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function setStyle(style: CSSStyleDeclaration, name: string, val: string) {
 | 
					function setStyle(
 | 
				
			||||||
  if (name.startsWith('--')) {
 | 
					  style: CSSStyleDeclaration,
 | 
				
			||||||
    // custom property definition
 | 
					  name: string,
 | 
				
			||||||
    style.setProperty(name, val)
 | 
					  val: string | string[]
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  if (isArray(val)) {
 | 
				
			||||||
 | 
					    val.forEach(v => setStyle(style, name, v))
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    const prefixed = autoPrefix(style, name)
 | 
					    if (name.startsWith('--')) {
 | 
				
			||||||
    if (importantRE.test(val)) {
 | 
					      // custom property definition
 | 
				
			||||||
      // !important
 | 
					      style.setProperty(name, val)
 | 
				
			||||||
      style.setProperty(
 | 
					 | 
				
			||||||
        hyphenate(prefixed),
 | 
					 | 
				
			||||||
        val.replace(importantRE, ''),
 | 
					 | 
				
			||||||
        'important'
 | 
					 | 
				
			||||||
      )
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      style[prefixed as any] = val
 | 
					      const prefixed = autoPrefix(style, name)
 | 
				
			||||||
 | 
					      if (importantRE.test(val)) {
 | 
				
			||||||
 | 
					        // !important
 | 
				
			||||||
 | 
					        style.setProperty(
 | 
				
			||||||
 | 
					          hyphenate(prefixed),
 | 
				
			||||||
 | 
					          val.replace(importantRE, ''),
 | 
				
			||||||
 | 
					          'important'
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        style[prefixed as any] = val
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user