aboutsummaryrefslogtreecommitdiff
path: root/node_modules/vue/src/core/components
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2018-11-08 00:38:48 +0800
committerruki <waruqi@gmail.com>2018-11-07 21:53:09 +0800
commit26105034da4fcce7ac883c899d781f016559310d (patch)
treec459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/vue/src/core/components
parent2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff)
downloadxmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz
xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip
switch to vuepress
Diffstat (limited to 'node_modules/vue/src/core/components')
-rw-r--r--node_modules/vue/src/core/components/index.js5
-rw-r--r--node_modules/vue/src/core/components/keep-alive.js124
2 files changed, 129 insertions, 0 deletions
diff --git a/node_modules/vue/src/core/components/index.js b/node_modules/vue/src/core/components/index.js
new file mode 100644
index 00000000..5461c763
--- /dev/null
+++ b/node_modules/vue/src/core/components/index.js
@@ -0,0 +1,5 @@
+import KeepAlive from './keep-alive'
+
+export default {
+ KeepAlive
+}
diff --git a/node_modules/vue/src/core/components/keep-alive.js b/node_modules/vue/src/core/components/keep-alive.js
new file mode 100644
index 00000000..fb4cf1e8
--- /dev/null
+++ b/node_modules/vue/src/core/components/keep-alive.js
@@ -0,0 +1,124 @@
+/* @flow */
+
+import { isRegExp, remove } from 'shared/util'
+import { getFirstComponentChild } from 'core/vdom/helpers/index'
+
+type VNodeCache = { [key: string]: ?VNode };
+
+function getComponentName (opts: ?VNodeComponentOptions): ?string {
+ return opts && (opts.Ctor.options.name || opts.tag)
+}
+
+function matches (pattern: string | RegExp | Array<string>, name: string): boolean {
+ if (Array.isArray(pattern)) {
+ return pattern.indexOf(name) > -1
+ } else if (typeof pattern === 'string') {
+ return pattern.split(',').indexOf(name) > -1
+ } else if (isRegExp(pattern)) {
+ return pattern.test(name)
+ }
+ /* istanbul ignore next */
+ return false
+}
+
+function pruneCache (keepAliveInstance: any, filter: Function) {
+ const { cache, keys, _vnode } = keepAliveInstance
+ for (const key in cache) {
+ const cachedNode: ?VNode = cache[key]
+ if (cachedNode) {
+ const name: ?string = getComponentName(cachedNode.componentOptions)
+ if (name && !filter(name)) {
+ pruneCacheEntry(cache, key, keys, _vnode)
+ }
+ }
+ }
+}
+
+function pruneCacheEntry (
+ cache: VNodeCache,
+ key: string,
+ keys: Array<string>,
+ current?: VNode
+) {
+ const cached = cache[key]
+ if (cached && (!current || cached.tag !== current.tag)) {
+ cached.componentInstance.$destroy()
+ }
+ cache[key] = null
+ remove(keys, key)
+}
+
+const patternTypes: Array<Function> = [String, RegExp, Array]
+
+export default {
+ name: 'keep-alive',
+ abstract: true,
+
+ props: {
+ include: patternTypes,
+ exclude: patternTypes,
+ max: [String, Number]
+ },
+
+ created () {
+ this.cache = Object.create(null)
+ this.keys = []
+ },
+
+ destroyed () {
+ for (const key in this.cache) {
+ pruneCacheEntry(this.cache, key, this.keys)
+ }
+ },
+
+ mounted () {
+ this.$watch('include', val => {
+ pruneCache(this, name => matches(val, name))
+ })
+ this.$watch('exclude', val => {
+ pruneCache(this, name => !matches(val, name))
+ })
+ },
+
+ render () {
+ const slot = this.$slots.default
+ const vnode: VNode = getFirstComponentChild(slot)
+ const componentOptions: ?VNodeComponentOptions = vnode && vnode.componentOptions
+ if (componentOptions) {
+ // check pattern
+ const name: ?string = getComponentName(componentOptions)
+ const { include, exclude } = this
+ if (
+ // not included
+ (include && (!name || !matches(include, name))) ||
+ // excluded
+ (exclude && name && matches(exclude, name))
+ ) {
+ return vnode
+ }
+
+ const { cache, keys } = this
+ const key: ?string = vnode.key == null
+ // same constructor may get registered as different local components
+ // so cid alone is not enough (#3269)
+ ? componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : '')
+ : vnode.key
+ if (cache[key]) {
+ vnode.componentInstance = cache[key].componentInstance
+ // make current key freshest
+ remove(keys, key)
+ keys.push(key)
+ } else {
+ cache[key] = vnode
+ keys.push(key)
+ // prune oldest entry
+ if (this.max && keys.length > parseInt(this.max)) {
+ pruneCacheEntry(cache, keys[0], keys, this._vnode)
+ }
+ }
+
+ vnode.data.keepAlive = true
+ }
+ return vnode || (slot && slot[0])
+ }
+}