-
-
Notifications
You must be signed in to change notification settings - Fork 8.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Hydration not updating DOM of img-src and v-html with new client-side values #9033
Comments
The issue title is a bit misleading. The values don't change after hydration - rather, there's a hydration mismatch because the SSR state that's reflected in the server's HTML was different from the client-side state when hydration is being performed. So the problem here is that during hydration, when when the mismatch is found, the render does not update the DOM with the client-side values. |
I think with the introduce of data-allow-mismatch feature this problem becomes more important because But because of this issue it is still not possible to intentially have hydration mistmatch, if the mismatched value is happened to be an attribute. This makes Vue even explicitly says "The DOM will not be rectified" in the console's warning message:
I think this phrase means that the DOM will be kept in the server-rendered state (so, mismatched attributes during the hydration will be ignored). Am I right or I understand this warning message incorrectly? So, I wonder what is the purpose of Context: In my case, the mismatch happens because server doesn't know the screen size, so server can't decide what size it should set for a rendered image. Only client knows it. So, server uses the default size, but then client properly uses I think this problem can be solved without introducing a hydration mistmatch (e.g. using const breakpoints = useBreakpoints(breakpointsTailwind)
const imageSize = ref<'md' | 'lg'>('md')
onMounted(() => {
const unwatch = watchEffect(() => {
imageSize.value = breakpoints.sm.value ? 'lg' : 'md'
})
onUnmounted(() => unwatch())
}) To this: const breakpoints = useBreakpoints(breakpointsTailwind)
const imageSize = computed(() => (breakpoints.sm.value ? 'lg' : 'md')) |
Vue version
3.3.4
Link to minimal reproduction
https://stackblitz.com/edit/github-vxyebj-admpj8?file=src%2FApp.vue
Steps to reproduce
i was stumbling on problems with certain stuff not getting updated to new values after hydration using pregenerated sites with Nuxt 3. (see issue with reproduction here: nuxt/nuxt#22784)
after looking at it, Daniel concluded, it was a a vue-related problem, visible in the reproduction provided in this here issue. here is the code:
What is expected?
That the contents of the
img
src
attribute andv-html
get updated with the new value of thetimestamp
ref after hydration.What is actually happening?
The server-generated
img
src
attribute andv-html
stay the same - not getting updated to the new value.System Info
System: OS: Linux 5.0 undefined CPU: (8) x64 Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz Memory: 0 Bytes / 0 Bytes Shell: 1.0 - /bin/jsh Binaries: Node: 16.20.0 - /usr/local/bin/node Yarn: 1.22.19 - /usr/local/bin/yarn npm: 9.4.2 - /usr/local/bin/npm pnpm: 8.6.10 - /usr/local/bin/pnpm npmPackages: vue: ^3.3.4 => 3.3.4
Any additional comments?
No response
The text was updated successfully, but these errors were encountered: