]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat(custom-element): support css `:host` selector by applying css vars on host eleme...
author白雾三语 <32354856+baiwusanyu-c@users.noreply.github.com>
Tue, 6 Aug 2024 15:33:57 +0000 (23:33 +0800)
committerGitHub <noreply@github.com>
Tue, 6 Aug 2024 15:33:57 +0000 (23:33 +0800)
close #8826

packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts
packages/runtime-dom/src/helpers/useCssVars.ts

index 9f860a5e3c3bfe4712a28d472a6dd3dd59a32884..06b3e7141326a715a3434c7270c604eeb56b2da6 100644 (file)
@@ -4,6 +4,7 @@ import {
   Suspense,
   Teleport,
   createStaticVNode,
+  defineCustomElement,
   h,
   nextTick,
   reactive,
@@ -381,4 +382,26 @@ describe('useCssVars', () => {
       expect((c as HTMLElement).style.getPropertyValue(`--color`)).toBe('red')
     }
   })
+
+  // #8826
+  test('with custom element', async () => {
+    const state = reactive({ color: 'red' })
+    const container = document.createElement('div')
+    const App = defineCustomElement({
+      styles: [`div { color: red; }`],
+      setup() {
+        useCssVars(() => state)
+        return () => {
+          return h('div', 'hello')
+        }
+      },
+    })
+    customElements.define('css-vars-ce', App)
+    container.innerHTML = `<css-vars-ce></css-vars-ce>`
+    document.body.appendChild(container)
+    await nextTick()
+    expect(container.innerHTML).toBe(
+      `<css-vars-ce style="--color: red;"></css-vars-ce>`,
+    )
+  })
 })
index 286a4176076889d7ebacc8a97f0a7c64dff79514..8b47d55333c59056646545198d067ab3f2a7f25b 100644 (file)
@@ -38,7 +38,11 @@ export function useCssVars(getter: (ctx: any) => Record<string, string>) {
 
   const setVars = () => {
     const vars = getter(instance.proxy)
-    setVarsOnVNode(instance.subTree, vars)
+    if (instance.ce) {
+      setVarsOnNode(instance.ce as any, vars)
+    } else {
+      setVarsOnVNode(instance.subTree, vars)
+    }
     updateTeleports(vars)
   }