鉴于您无法控制 classes 函数,一种方法是使用您自己的函数来包装该操作:
import classes from '....'
function classesWrap(node, useDefault = true) {
useDefault && classes(node);
return {
update(useDefault) {
useDefault && classes(node);
}
}
}
然后改用此操作:<div use:classesWrap={originalClasses}>
这很有效,当originalClasses 为假时,它不会设置默认值,而当它为真时,它将设置它们。当它开始为假并变为真时,它也会应用它们(感谢update)但是似乎一旦附加了一个动作,它就不能再次删除(这是合乎逻辑的,因为动作应该是在安装元素时运行)。这意味着从 true 变为 false 不会改变任何东西,它会保留默认类。
有两种(非常糟糕的)解决方法:
- 在更新函数中添加一些额外的代码来自己删除类:
update(useDefault) {
useDefault && classes(node);
!useDefault && node.classList.remove(...node.classList);
}
(但这会删除所有类,以及您可能自己添加的类)
- 第二种选择是使用基于
originalClasses 的{#key} 块包装元素,这将在它发生变化时强制重新渲染。
{#key originalClasses}
<div use:classesWrap={originalClasses}>...</div>
{/key}
但是如果这个 div 有很多内容,这可能会非常昂贵,也许对于单行元素来说可能没问题。
(注意:您不再需要 update 功能)
当然,这是假设 originalClasses 可以并且将会改变,如果您 100% 确定它永远不会改变,只需使用没有更新或关键块的包装器。