close #11189
@@ -3,6 +3,7 @@
*/
import {
+ type ObjectDirective,
Suspense,
Teleport,
Transition,
@@ -1695,5 +1696,24 @@ describe('SSR hydration', () => {
app.mount(container)
expect(`Hydration style mismatch`).not.toHaveBeenWarned()
})
+
+ // #11189
+ test('should not warn for directives that mutate DOM in created', () => {
+ const container = document.createElement('div')
+ container.innerHTML = `<div class="test red"></div>`
+ const vColor: ObjectDirective = {
+ created(el, binding) {
+ el.classList.add(binding.value)
+ },
+ }
+ const app = createSSRApp({
+ setup() {
+ return () =>
+ withDirectives(h('div', { class: 'test' }), [[vColor, 'red']])
+ })
+ app.mount(container)
+ expect(`Hydration style mismatch`).not.toHaveBeenWarned()
@@ -459,6 +459,9 @@ export function createHydrationFunctions(
// check hydration mismatch
if (
(__DEV__ || __FEATURE_PROD_HYDRATION_MISMATCH_DETAILS__) &&
+ // #11189 skip if this node has directives that have created hooks
+ // as it could have mutated the DOM in any possible way
+ !(dirs && dirs.some(d => d.dir.created)) &&
propHasMismatch(el, key, props[key], vnode, parentComponent)
) {
logMismatchError()