feat(runtime-dom): useCssVars
This commit is contained in:
parent
18c537d3c2
commit
9f706a9f5e
@ -65,8 +65,6 @@ export {
|
|||||||
} from './components/BaseTransition'
|
} from './components/BaseTransition'
|
||||||
// For using custom directives
|
// For using custom directives
|
||||||
export { withDirectives } from './directives'
|
export { withDirectives } from './directives'
|
||||||
// SFC CSS Modules
|
|
||||||
export { useCSSModule } from './helpers/useCssModule'
|
|
||||||
// SSR context
|
// SSR context
|
||||||
export { useSSRContext, ssrContextKey } from './helpers/useSsrContext'
|
export { useSSRContext, ssrContextKey } from './helpers/useSsrContext'
|
||||||
|
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
import { getCurrentInstance } from '../component'
|
import { warn, getCurrentInstance } from '@vue/runtime-core'
|
||||||
import { EMPTY_OBJ } from '@vue/shared'
|
import { EMPTY_OBJ } from '@vue/shared'
|
||||||
import { warn } from '../warning'
|
|
||||||
|
|
||||||
export const useCSSModule = (name = '$style'): Record<string, string> => {
|
export function useCSSModule(name = '$style'): Record<string, string> {
|
||||||
if (!__GLOBAL__) {
|
if (!__GLOBAL__) {
|
||||||
const instance = getCurrentInstance()!
|
const instance = getCurrentInstance()!
|
||||||
if (!instance) {
|
if (!instance) {
|
41
packages/runtime-dom/src/helpers/useCssVars.ts
Normal file
41
packages/runtime-dom/src/helpers/useCssVars.ts
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import {
|
||||||
|
ComponentPublicInstance,
|
||||||
|
getCurrentInstance,
|
||||||
|
onMounted,
|
||||||
|
watchEffect,
|
||||||
|
warn,
|
||||||
|
VNode,
|
||||||
|
Fragment
|
||||||
|
} from '@vue/runtime-core'
|
||||||
|
import { ShapeFlags } from '@vue/shared/src'
|
||||||
|
|
||||||
|
export function useCSSVars(
|
||||||
|
getter: (ctx: ComponentPublicInstance) => Record<string, string>
|
||||||
|
) {
|
||||||
|
const instance = getCurrentInstance()
|
||||||
|
if (!instance) {
|
||||||
|
__DEV__ &&
|
||||||
|
warn(`useCssVars is called without current active component instance.`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
onMounted(() => {
|
||||||
|
watchEffect(() => {
|
||||||
|
setVarsOnVNode(instance.vnode, getter(instance.proxy!))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function setVarsOnVNode(vnode: VNode, vars: Record<string, string>) {
|
||||||
|
// drill down HOCs until it's a non-component vnode
|
||||||
|
while (vnode.component) {
|
||||||
|
vnode = vnode.component.subTree
|
||||||
|
}
|
||||||
|
if (vnode.shapeFlag & ShapeFlags.ELEMENT && vnode.el) {
|
||||||
|
const style = vnode.el.style
|
||||||
|
for (const key in vars) {
|
||||||
|
style.setProperty(`--${key}`, vars[key])
|
||||||
|
}
|
||||||
|
} else if (vnode.type === Fragment) {
|
||||||
|
;(vnode.children as VNode[]).forEach(c => setVarsOnVNode(c, vars))
|
||||||
|
}
|
||||||
|
}
|
@ -113,6 +113,10 @@ function normalizeContainer(container: Element | string): Element | null {
|
|||||||
return container
|
return container
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SFC CSS utilities
|
||||||
|
export { useCSSModule } from './helpers/useCssModule'
|
||||||
|
export { useCSSVars } from './helpers/useCssVars'
|
||||||
|
|
||||||
// DOM-only components
|
// DOM-only components
|
||||||
export { Transition, TransitionProps } from './components/Transition'
|
export { Transition, TransitionProps } from './components/Transition'
|
||||||
export {
|
export {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user