vue keep-alive组件的使用以及原理介绍


本文摘自PHP中文网,作者不言,侵删。

本篇文章给大家带来的内容是关于vue keep-alive组件的使用以及原理介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

keep-alive

keep-alive是vue.js的内置组件,它能够把不活动的组件的实例保存在内存中,而不是直接的销毁,它是一个抽象组件,不会被渲染到真实DOM中,也不会出现在父组件链中。
它提供了exclude和include两个属性,允许组件有条件的缓存。

使用

1

2

3

<keep-alive>

    <comment></comment>

</keep-alive>

上面的comment组件会被缓存起来。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<keep-alive>

    <coma v-if="test"></coma>

    <comb v-else></comb>

</keep-alive>

<button @click="abc"></button>

 

export default{

    data(){

        reurn{

            test:true

        }

    },

    methods:{

        abc(){

            this.test=!this.test;

        }

    }

}

点击button的时候coma组件和comb组件会发生切换,但这时候两个组件的状态会被缓存起来,假如说a和b组件中都有一个input标签,这时切换input标签的值不会改变。

props

keep-alive组件提供了include和exclude两个属性来进行有条件的缓存,二者都可以用逗号分隔字符串、正则表达式或则数组表示。

1

2

3

4

5

6

7

8

9

<keep-alive include="a">

    <component></component>

</keep-alive>

//name名为a的组件会被缓存起来

 

<keep-alive exclude="a">

    <component></component>

</keep-alive>

//name名为a的组件将不会被缓存。

生命钩子

keep-alive提供了两个生命钩子,actived与deactived。
因为keep-alive会把组件保存到内存中,并不会销毁或则重新构建,所以不会调用组件的creted等方法,需要使用actived和deactived两个钩子判断组件是否处于活动状态。

深入keep-alive组件的实现

created和destroyed钩子
created钩子会创建一个cache对象,用来作为缓存容器,保存Vnode节点。

1

2

3

created{

    this.cache=Object.create(null);

}

destroyed钩子则在组件销毁的时候清除cache缓存中的所有组件实例。

1

2

3

4

5

6

/* destroyed钩子中销毁所有cache中的组件实例 */

destroyed () {

    for (const key in this.cache) {

        pruneCacheEntry(this.cache[key])

    }

},

接下来是render函数。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

render () {

    /* 得到slot插槽中的第一个组件 */

    const vnode: VNode = getFirstComponentChild(this.$slots.default)

 

    const componentOptions: ?VNodeComponentOptions = vnode && vnode.componentOptions

    if (componentOptions) {

        // check pattern

        /* 获取组件名称,优先获取组件的name字段,否则是组件的tag */

        const name: ?string = getComponentName(componentOptions)

        /* name不在inlcude中或者在exlude中则直接返回vnode(没有取缓存) */

        if (name && (

        (this.include && !matches(this.include, name)) ||

        (this.exclude && matches(this.exclude, name))

        )) {

            return vnode

        }

        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

        /* 如果已经做过缓存了则直接从缓存中获取组件实例给vnode,还未缓存过则进行缓存 */

        if (this.cache[key]) {

            vnode.componentInstance = this.cache[key].componentInstance

        } else {

            this.cache[key] = vnode

        }

        /* keepAlive标记位 */

        vnode.data.keepAlive = true

    }

    return vnode

}

首先通过getFirstComponentChild获取第一个子组件,获取该组件的name(存在组件名则直接使用组件名,否则会使用tag)。接下来会将这个name通过include与exclude属性进行匹配,匹配不成功(说明不需要进行缓存)则不进行任何操作直接返回vnode。

阅读剩余部分

相关阅读 >>

node批量下载文件到本地的方法介绍(附代码)

javascript是什么类型的语言

javascript未知错误怎么查

ajax和javascript的区别是什么

javascript中判断变量是否为数字的3种方法(附代码)

array中 foreach() 和 map() 的区别

web程序员必备 console 对象里的九个方法

javascript怎么获取请求参数

javascript向php传递中文乱码怎么办

详解javascript中动态合并两个对象的属性

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...