【发布时间】:2020-01-20 22:21:38
【问题描述】:
基本上,它说的是什么。 <keep-alive> 有什么意义?这可能听起来很傻,但我认为其目的是缓存与当前未在 DOM 中呈现的组件关联的数据。根据this bug/issue 的说法,<keep-alive> 专门被设计为在从页面中删除元素时删除它所持有的缓存。那我错过了什么?
我为什么要将<keep-alive> 与v-show 一起使用? v-show 的重点不是该元素仍然存在于页面上,只是将 CSS 设置为隐藏它?默认情况下,使用v-show 隐藏元素时会丢失数据吗?
需要明确的是,以下示例显然应该不起作用(根据我链接的已关闭错误/问题):
<div v-if="lazyLoaded && userClickedToShow">
<h2>{{someLazyLoadedData.title}}</h2>
<div id="otherStuff">
...
</div>
<keep-alive>
<some-child-component :prop="someLazyLoadedData"></some-child-component>
</keep-alive>
</div>
所以我本来希望<keep-alive> 在这种情况下会在加载后缓存与<some-child-component> 关联的数据,如果用户点击显示(也许这是我不想要的很多数据出于性能原因在 DOM 中,除非用户专门单击以显示它,或者其他什么)它会切换显示,但保留搜索词或组件中发生的任何事情。
有没有办法重写它以适应<keep-alive> 的功能?我是否必须在<component> 上绑定到is,如果我现在不希望它渲染,只需将其设置为空?像这样?
<keep-alive>
<component :is="lazyLoaded && userClickedToShow ? 'SomeChildComponent' : ''" :prop="lazyLoaded && someLazyLoadedData"></component>
<keep-alive>
这似乎混淆了那里实际发生的事情,如果它甚至有效的话。还假设SomeChildComponent 的道具可以采用false,它可能无法做到。我不喜欢那个选项。我想稍微好一点的方法是将整个东西包装在一个 if 块中,也许?
<div v-if="lazyLoaded">
<keep-alive>
<component :is="userClickedToShow ? : 'SomeChildComponent' : ''" :prop="someLazyLoadedData"></component>
<keep-alive>
</div>
当然,这假定<keep-alive> 在v-if 块中起作用,但它可能不会。此外,它仍然不如第一种方式清晰(这不起作用)。我不喜欢将is 设置为'',除非那真的是唯一的方法。当然,这些选项都不允许条件控制更大的块,只有元素保持活动状态。
刚刚花了两天的大部分时间试图弄清楚为什么<keep-alive> 无法让任何东西保持活力!希望我只是缺少一些简单的东西!
编辑:更新初始示例以更好地反映我的用例。
【问题讨论】:
标签: javascript vue.js vuejs2 preprocessor-directive