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