【发布时间】:2021-10-07 05:41:52
【问题描述】:
在以下组件(称为“注释屏幕”)中,组件DocPicker 让用户设置变量selectedDoc,该变量又应该更新两个组件:Form 和SearchResultView。
<script lang="ts">
import type { AppScreen, QuestionGouv } from '../../types.js';
import Screen from '../../Screen.svelte';
import DocPicker from './DocPicker/DocPicker.svelte';
import SearchResultView from '../../SearchResultView.svelte';
import Form from './Form.svelte';
export let screen: AppScreen;
let selectedDoc: QuestionGouv;
let isPickerOpen: boolean;
</script>
<Screen bind:screen>
<svelte:fragment slot="sidebar">
<DocPicker bind:picked={selectedDoc} bind:isOpen={isPickerOpen}/>
{#if selectedDoc}
<Form doc={selectedDoc}/>
{/if}
</svelte:fragment>
<svelte:fragment slot="content">
{#if selectedDoc}
<SearchResultView doc={selectedDoc} on:close={() => {selectedDoc = undefined}}/>
{/if}
</svelte:fragment>
</Screen>
问题是Form 组件在selectedDoc 更改时没有更新。第一次selectedDoc 从undefined 变为某个值时,组件Form 以正确的值出现,但如果后来selectedDoc 发生变化(因为用户使用了DocPicker),组件Form 保持与前一个价值。
SearchResultView 每次都会更新,就像一个魅力,所以我虽然问题来自 Form 组件,但如果我复制行 <Form doc={selectedDoc}/> 就在 SearchResultView 的位置旁边(即也就是说,在<svelte:fragment slot="content">) 中,Form 的这个实例可以正常工作!同样,如果我将另一个SearchResultView 实例放在<svelte:fragment slot="sidebar"> 中,这个SearchResultView 实例不会更新。
所以它似乎与在哪里组件插入有关,即Screen组件的哪个插槽。但是Screen 组件非常琐碎,归结为:
<Sidebar>
<div class="screen-sidebar">
<slot name="sidebar"></slot>
</div>
</Sidebar>
<slot name="content"></slot>
Sidebar 组件也很简单:
<div class="sidebar">
<slot></slot>
</div>
【问题讨论】:
-
您能否在REPL 中重现此行为。