如何按要求重新渲染一个Svelte组件,特别是当我想再次运行一个函数道具时,如何重新渲染它?
昨天我遇到了这个问题:我正在使用一个Datepicker Svelte组件--它的2个实例。
为了给你提供更多的背景,我想设置一个开始日期,和一个结束日期。

当你点击起始日期时,日期选择器显示出来。

当你点击结束日期时,第二个日期选择器显示出来。

现在的问题是,基于起始日期,结束日期有一些约束。例如,一个逻辑上的限制是,你不能设置一个比起始日期早的结束日期。
日期选择器组件暴露了一个selectableCallback 函数道具,在组件第一次呈现时被调用,为日历中的所有日期运行,允许我在一些日期上返回false以禁用它们。
<script>
let endDateSelectableCallback = date => {
//TODO: decide if date is ok
}
</script>
<Datepicker
selectableCallback={endDateSelectableCallback
}>
听起来不错
只是这个函数只在组件第一次被渲染时运行。
我需要一种方法,在其他组件改变其值时重新运行该函数。因此,我可以删除所有选择的起始日期之前的日期。另外,由于用户可以改变想法,它必须多次运行。
所以......当在另一个组件上选择一个日期时,我使用on:dateSelected 事件来重新分配我分配给selectableCallback 的函数,称为endDateSelectableCallback ,给自己。
<script>
let endDateSelectableCallback = date => {
//TODO: decide if date is ok
}
</script>
<!-- first date picker, start date -->
<Datepicker on:dateSelected={e => {
endDateSelectableCallback=endDateSelectableCallback;
}}>
selectableCallback={endDateSelectableCallback
}>
<!-- second date picker, end date -->
<Datepicker selectableCallback={endDateSelectableCallback
}>
这可能不是最成文的Svelte代码,我可能可以添加一个refresh={refreshComponent} 来代替。 但也许这是很习惯的,因为Svelte文档中也提到当我们更新一个值时,添加一个多余的赋值来触发重新渲染。

我想这是一个非常特殊的模式,可能不是很常见。在我的印象中,我以前没有遇到过这个问题,所以到目前为止我对这个解决方案很满意--它很有效。