Просмотр исходного кода

perf: only patch string style when value has changed (#1310)

fix #1309
underfin 5 лет назад
Родитель
Сommit
d4e9b19932

+ 16 - 0
packages/runtime-dom/__tests__/patchStyle.spec.ts

@@ -7,6 +7,22 @@ describe(`runtime-dom: style patching`, () => {
     expect(el.style.cssText.replace(/\s/g, '')).toBe('color:red;')
   })
 
+  // #1309
+  it('should not patch same string style', () => {
+    const el = document.createElement('div')
+    const fn = jest.fn()
+    const value = (el.style.cssText = 'color:red;')
+    Object.defineProperty(el.style, 'cssText', {
+      get(): any {
+        return value
+      },
+      set: fn
+    })
+    patchProp(el, 'style', value, value)
+    expect(el.style.cssText.replace(/\s/g, '')).toBe('color:red;')
+    expect(fn).not.toBeCalled()
+  })
+
   it('plain object', () => {
     const el = document.createElement('div')
     patchProp(el, 'style', {}, { color: 'red' })

+ 3 - 1
packages/runtime-dom/src/modules/style.ts

@@ -8,7 +8,9 @@ export function patchStyle(el: Element, prev: Style, next: Style) {
   if (!next) {
     el.removeAttribute('style')
   } else if (isString(next)) {
-    style.cssText = next
+    if (prev !== next) {
+      style.cssText = next
+    }
   } else {
     for (const key in next) {
       setStyle(style, key, next[key] as string)