瀏覽代碼

fix(hydration): fix incorect mismatch warning for option with non-string value and inner text

close 10140
Evan You 2 年之前
父節點
當前提交
d16a2138a3
共有 2 個文件被更改,包括 14 次插入7 次删除
  1. 7 0
      packages/runtime-core/__tests__/hydration.spec.ts
  2. 7 7
      packages/runtime-core/src/hydration.ts

+ 7 - 0
packages/runtime-core/__tests__/hydration.spec.ts

@@ -1531,5 +1531,12 @@ describe('SSR hydration', () => {
       mountWithHydration(`<button />`, () => h('button', { href: undefined }))
       expect(`Hydration attribute mismatch`).not.toHaveBeenWarned()
     })
+
+    test('should not warn on non-renderable option values', () => {
+      mountWithHydration(`<select><option>hello</option></select>`, () =>
+        h('select', [h('option', { value: ['foo'] }, 'hello')]),
+      )
+      expect(`Hydration attribute mismatch`).not.toHaveBeenWarned()
+    })
   })
 })

+ 7 - 7
packages/runtime-core/src/hydration.ts

@@ -764,16 +764,16 @@ function propHasMismatch(
     } else {
       if (el.hasAttribute(key)) {
         actual = el.getAttribute(key)
+      } else if (key === 'value' && el.tagName === 'TEXTAREA') {
+        // #10000 textarea.value can't be retrieved by `hasAttribute`
+        actual = (el as HTMLTextAreaElement).value
       } else {
-        // #10000 some attrs such as textarea.value can't be retrieved by `hasAttribute`
-        const serverValue = el[key as keyof typeof el]
-        actual =
-          isObject(serverValue) || serverValue == null
-            ? ''
-            : String(serverValue)
+        actual = false
       }
       expected =
-        isObject(clientValue) || clientValue == null ? '' : String(clientValue)
+        isObject(clientValue) || clientValue == null
+          ? false
+          : String(clientValue)
     }
     if (actual !== expected) {
       mismatchType = `attribute`