如何在 Svelte 3 中有条件地添加和删除`use:`属性?

Posted

技术标签:

【中文标题】如何在 Svelte 3 中有条件地添加和删除`use:`属性?【英文标题】:How to conditional add and remove `use:` property in Svelte 3? 【发布时间】:2021-06-26 15:13:20 【问题描述】:

有没有办法在 Svelte 3 中优雅地有条件地添加和删除 use: 属性?

例子:

<script>
    import classes from "./functions.js"

    export let originalClasses
</script>

<button use:classes>Button</button>

如果originalClasses 为真,有没有办法添加或删除use:classes

【问题讨论】:

【参考方案1】:

鉴于您无法控制 classes 函数,一种方法是使用您自己的函数来包装该操作:

import classes from '....'
function classesWrap(node, useDefault = true) 
  useDefault && classes(node);
  
  return 
    update(useDefault) 
      useDefault && classes(node);
    
  

然后改用此操作:&lt;div use:classesWrap=originalClasses&gt;

这很有效,当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% 确定它永远不会改变,只需使用没有更新或关键块的包装器。

【讨论】:

【参考方案2】:

这是你想要做的吗?

REPL

//functions.js
export default function classes(node,options)
    if(options)
    node.className="myClass";
    
        console.log(node);

【讨论】:

【参考方案3】:

Svelte 中的动作可以接收一个参数,您可以使用该参数来启用或禁用效果:

https://svelte.dev/docs#use_action

【讨论】:

以上是关于如何在 Svelte 3 中有条件地添加和删除`use:`属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Svelte 3 中进行条件自动对焦

有条件地添加/删除 fxLayout 和 fxLayoutAlign 属性

如何在 Vue 中有条件地添加一个类?

如何在反应中有条件地添加样式? [复制]

如何将 Sapper 添加到现有的 Svelte 项目中?

如何在 Angular 2 中有条件地添加动画