• Vue中的动态组件和缓存组件


    动态组件

    这里我们要学习一个新的标签component,写在template模板中。它有一个属性is,is的属性值是字符串,值为我们想要显示组件。

    写法:

    之前我们学v-if和v-show的时候,利用这个指令实现了tab栏切换。主要利用了排他思想,过程比较繁杂,这里学习了动态组件我们也可以利用它实现。

    实现思路:创建三个子组件对应三个页面,导入父组件注册,当我们点击对应的按钮时将对应的组件名传入component标签的is属性中,实现对应组件在页面的渲染。

    父组件实现代码:

    1. <script>
    2. import Box1 from "@/components/box1.vue"
    3. import Box2 from "@/components/box2.vue"
    4. import Box3 from "@/components/box3.vue"
    5. export default {
    6. data() {
    7. return {
    8. pagevalue:["box1","box2","box3"],
    9. arr:["按钮1","按钮2","按钮3"],
    10. msg:"0"
    11. }
    12. },
    13. methods: {
    14. fn(index){
    15. this.msg=index
    16. }
    17. },
    18. components:{
    19. Box1,
    20. Box2,
    21. Box3
    22. },
    23. }
    24. script>
    25. <style>
    26. .app{
    27. position: relative;
    28. width: 200px;
    29. }
    30. .app1{
    31. position: relative;
    32. top: 20px;
    33. background-color: aquamarine;
    34. display: inline-block;
    35. width: 65px;
    36. height: 30px;
    37. text-align: center;
    38. line-height: 30px;
    39. cursor: pointer;
    40. caret-color: transparent;
    41. }
    42. style>

    页面效果:点击按钮2时

     即导航栏切换的功能就实现了。

    缓存组件

    通过这个案例我们来引入我们的缓存组件,首先我们要明白为什么要引入缓存组件,我们在通过动态组件时切换组件时,被切换掉的组件会被销毁掉,如果我们之前在这个页面还有数据也会被丢失,很明显这在实际产品中是不被允许的。

    如何检测切换时组件是否被销毁,我们可以在box1组件中添加beforedestroy和created函数检验。

    box1的script标签中添加代码:

    页面初次渲染时会打印一次“box1被创建”,当我们点击box2切换就会打印“box1被销毁”,再点击切回box1时又会打印“box1被创建”

    控制台情况:

     因此如果我们在box1有一个input标签,我们在输入值以后切换了页面后数据也会被删掉。

    box1添加input标签如:

    1. <script>
    2. export default{
    3. data() {
    4. return {
    5. msg:""
    6. }
    7. },
    8. created() {
    9. console.log("box1被创建");
    10. },
    11. beforeDestroy() {
    12. console.log("box1被销毁");
    13. },
    14. }
    15. script>
    16. <style>
    17. .box1{
    18. width: 200px;
    19. height: 200px;
    20. background-color: aqua;
    21. margin-top: 0;
    22. }
    23. style>

    我们想要保留input的值,我们就需要利用组件缓存keep-alive标签,将要缓存的组件放在keep-alive标签内。在这里我们就是就是component标签放入其中。

    会默认把全部加载过的组件都会缓存起来。

    如果想要改变,就需要用到它的三个属性之一

    1、include 选择缓存哪些组件  可以写组件名字符串 也可以写正则;

    2、exinclude 选择哪些组件不缓存;

    3、max 最缓存几个,一旦设定的数值达到了,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉。

    这里我们就用include选择只缓存box1,修改父组件代码套上keep-alive标签:

    1. "box1">
    2. <component :is="pagevalue[msg]">component>

    这个时候无论怎么切换box组件,box1标签内的value值都会被保存。

    最后再介绍两个有关组件缓存的钩子函数activated和deactivated。

    activated:只有当组件使用了组件缓存时,在该组件中activated钩子函数才会被调用,否则是无效的。首次加载组件时,运行在mounted页面挂载之后,但是当再次切回该组件页面时,created和mounted不会再执行,只会再执行actived。

    我们在box1组件中测试一下就知道了,

    box1添加代码:

    1. created() {
    2. console.log("created执行");
    3. },
    4. mounted() {
    5. console.log("mounted执行");
    6. },
    7. activated() {
    8. console.log("activated执行");
    9. },

    执行结果: 

     因此:我们运用了组件缓存时,如果想每次切换都发送一次请求的话,需要把请求函数写在activated中,而写在created或mounted中其只会在首次加载该组件的时候起作用。

     deactivated:被 keep-alive 缓存的组件失活时调用。

  • 相关阅读:
    【前端】“局部页面跳转”的作用与缺陷
    极兔赴港:一家生而全球化的快递公司
    树状数组及扩展
    基于GeoToolkit/INT实现二维等值线图绘制示例
    前端使用Apache ECharts时,常用的配置项介绍
    小美的排列构造
    2022“易观之星”年度奖项启动征集,发现卓越数智力量
    导致MySQL索引失效的场景(随时补充)
    BSN-DDC 合约研究02---计费合约
    SpringBoot SpringBoot 原理篇 1 自动配置 1.15 自动配置原理【1】
  • 原文地址:https://blog.csdn.net/m0_59345890/article/details/126773656