export interface SFCInternalOptions {
__scopeId?: string
+ __cssModules?: Data
__hmrId?: string
__hmrUpdated?: boolean
}
// public $xxx properties & user-attached properties (sink)
const publicGetter = publicPropertiesMap[key]
- if (publicGetter !== undefined) {
+ let cssModule
+ if (publicGetter != null) {
if (__DEV__ && key === '$attrs') {
markAttrsAccessed()
}
return publicGetter(target)
+ } else if (
+ __BUNDLER__ &&
+ (cssModule = type.__cssModules) != null &&
+ (cssModule = cssModule[key])
+ ) {
+ return cssModule
} else if (hasOwn(sink, key)) {
return sink[key]
} else if (__DEV__ && currentRenderingInstance != null) {
--- /dev/null
+import { getCurrentInstance } from '../component'
+import { EMPTY_OBJ } from '@vue/shared'
+import { warn } from '../warning'
+
+export function useCSSModule(name = '$style'): Record<string, string> {
+ const instance = getCurrentInstance()!
+ if (!instance) {
+ __DEV__ && warn(`useCSSModule must be called inside setup()`)
+ return EMPTY_OBJ
+ }
+ const modules = instance.type.__cssModules
+ if (!modules) {
+ __DEV__ && warn(`Current instance does not have CSS modules injected.`)
+ return EMPTY_OBJ
+ }
+ const mod = modules[name]
+ if (!mod) {
+ __DEV__ &&
+ warn(`Current instance does not have CSS module named "${name}".`)
+ return EMPTY_OBJ
+ }
+ return mod as Record<string, string>
+}
return true
}
-function rerender(id: string, newRender: RenderFunction) {
+function rerender(id: string, newRender?: RenderFunction) {
map.get(id)!.instances.forEach(instance => {
- instance.render = newRender
+ if (newRender) {
+ instance.render = newRender
+ }
instance.renderCache = []
// this flag forces child components with slot content to update
instance.renderUpdated = true
BAIL: number
}
+// SFC CSS Modules
+export { useCSSModule } from './helpers/useCssModule'
+
// For custom renderers
export { createRenderer, RootRenderFunction } from './renderer'
export { warn } from './warning'