Fix astro-static-slot
hydration mismatch error (#7196)
This commit is contained in:
parent
6c7df28ab3
commit
1c77779dd6
6 changed files with 46 additions and 4 deletions
7
.changeset/eleven-walls-explain.md
Normal file
7
.changeset/eleven-walls-explain.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
'@astrojs/preact': patch
|
||||||
|
'@astrojs/react': patch
|
||||||
|
'@astrojs/vue': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Fix `astro-static-slot` hydration mismatch error
|
|
@ -14,6 +14,22 @@ test.afterAll(async () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
test.describe('Nested Frameworks in React', () => {
|
test.describe('Nested Frameworks in React', () => {
|
||||||
|
test('No hydration mismatch', async ({ page, astro }) => {
|
||||||
|
// Get browser logs
|
||||||
|
const logs = [];
|
||||||
|
page.on('console', (msg) => logs.push(msg.text()));
|
||||||
|
|
||||||
|
await page.goto(astro.resolveUrl('/'));
|
||||||
|
|
||||||
|
// wait for root island to hydrate
|
||||||
|
const counter = page.locator('#react-counter');
|
||||||
|
await waitForHydrate(page, counter);
|
||||||
|
|
||||||
|
for (const log of logs) {
|
||||||
|
expect(log, 'React hydration mismatch').not.toMatch('An error occurred during hydration');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
test('React counter', async ({ astro, page }) => {
|
test('React counter', async ({ astro, page }) => {
|
||||||
await page.goto(astro.resolveUrl('/'));
|
await page.goto(astro.resolveUrl('/'));
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,22 @@ test.afterAll(async () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
test.describe('Nested Frameworks in Vue', () => {
|
test.describe('Nested Frameworks in Vue', () => {
|
||||||
|
test('no hydration mismatch', async ({ page, astro }) => {
|
||||||
|
// Get browser logs
|
||||||
|
const logs = [];
|
||||||
|
page.on('console', (msg) => logs.push(msg.text()));
|
||||||
|
|
||||||
|
await page.goto(astro.resolveUrl('/'));
|
||||||
|
|
||||||
|
// wait for root island to hydrate
|
||||||
|
const counter = page.locator('#vue-counter');
|
||||||
|
await waitForHydrate(page, counter);
|
||||||
|
|
||||||
|
for (const log of logs) {
|
||||||
|
expect(log, 'Vue hydration mismatch').not.toMatch('Hydration node mismatch');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
test('React counter', async ({ astro, page }) => {
|
test('React counter', async ({ astro, page }) => {
|
||||||
await page.goto(astro.resolveUrl('/'));
|
await page.goto(astro.resolveUrl('/'));
|
||||||
|
|
||||||
|
|
|
@ -13,9 +13,9 @@ type Props = {
|
||||||
* As a bonus, we can signal to Preact that this subtree is
|
* As a bonus, we can signal to Preact that this subtree is
|
||||||
* entirely static and will never change via `shouldComponentUpdate`.
|
* entirely static and will never change via `shouldComponentUpdate`.
|
||||||
*/
|
*/
|
||||||
const StaticHtml = ({ value, name, hydrate }: Props) => {
|
const StaticHtml = ({ value, name, hydrate = true }: Props) => {
|
||||||
if (!value) return null;
|
if (!value) return null;
|
||||||
const tagName = hydrate === false ? 'astro-static-slot' : 'astro-slot';
|
const tagName = hydrate ? 'astro-slot' : 'astro-static-slot';
|
||||||
return h(tagName, { name, dangerouslySetInnerHTML: { __html: value } });
|
return h(tagName, { name, dangerouslySetInnerHTML: { __html: value } });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ import { createElement as h } from 'react';
|
||||||
* As a bonus, we can signal to React that this subtree is
|
* As a bonus, we can signal to React that this subtree is
|
||||||
* entirely static and will never change via `shouldComponentUpdate`.
|
* entirely static and will never change via `shouldComponentUpdate`.
|
||||||
*/
|
*/
|
||||||
const StaticHtml = ({ value, name, hydrate }) => {
|
const StaticHtml = ({ value, name, hydrate = true }) => {
|
||||||
if (!value) return null;
|
if (!value) return null;
|
||||||
const tagName = hydrate ? 'astro-slot' : 'astro-static-slot';
|
const tagName = hydrate ? 'astro-slot' : 'astro-static-slot';
|
||||||
return h(tagName, {
|
return h(tagName, {
|
||||||
|
|
|
@ -10,7 +10,10 @@ const StaticHtml = defineComponent({
|
||||||
props: {
|
props: {
|
||||||
value: String,
|
value: String,
|
||||||
name: String,
|
name: String,
|
||||||
hydrate: Boolean,
|
hydrate: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
setup({ name, value, hydrate }) {
|
setup({ name, value, hydrate }) {
|
||||||
if (!value) return () => null;
|
if (!value) return () => null;
|
||||||
|
|
Loading…
Reference in a new issue