Svelte:当组件更改数据时存储数据不响应,反之亦然

Posted

技术标签:

【中文标题】Svelte:当组件更改数据时存储数据不响应,反之亦然【英文标题】:Svelte: Store Data Not Being Reactive When Component Changes Data and Vice Versa 【发布时间】:2022-01-24 04:18:07 【问题描述】:

我确信这是一个超级简单的解决方法,但我在设置可写存储时遇到了问题,它主要是反应性的,除非组件更改数据时,应用程序文件中的反应性不会火,反之亦然。代码如下:

App.svelte:

<script>
    import  data  from './store.js'
    import Component from './Component.svelte'
    let localData
    data.subscribe((value) => 
        localData = value;
    );
</script>

<h2>In App.svelte</h2>

<p>Hello localData.name!</p>

<input name="name" type="text" bind:value=localData.name>

<p>
    localData.details.number
</p>

<h2>In Component.svelte</h2>

<Component />

Component.svelte:

<script>
    import  data  from './store.js'
    let localData
    data.subscribe((value) => 
        localData = value;
    );
</script>

<input type="number" bind:value=localData.details.number>

<p>Hello localData.name!</p>
<p>localData.details.number</p>

store.js:

import  writable  from 'svelte/store'

export let data = writable(
    name: 'Bob Smith',
    details: 
            dob: '1982/03/12',
            favoriteFoods: ['apples', 'pears', 'bourbon'],
            number: 1
        ,
)

如果你想在 Svelte REP 中使用它:https://svelte.dev/repl/164227336d6c4cc29f7ea0a15e89c584?version=3.44.3

【问题讨论】:

【参考方案1】:

您正在订阅数据并将其放入局部变量,然后绑定到该变量。这意味着商店不知道任何更改并且不会传播更新。两种选择:

第一个选项:您摆脱双向绑定并像这样显式更新商店:

<script>
    import  data  from './store.js'
    import Component from './Component.svelte'
    let localData
    data.subscribe((value) => 
        localData = value;
    );

    function updateName(evt) 
        const newName = evt.target.value;
        data.update(value => (...value, name: newName ));
    
</script>

<h2>In App.svelte</h2>

<p>Hello localData.name!</p>

<input name="name" type="text" value=localData.name on:input=updateName>

<p>
    localData.details.number
</p>

<h2>In Component.svelte</h2>

<Component />

这是非常明确的,但也有点样板。我们有 Svelte 方便的自动订阅功能,所以让我们改用它。第二个也是首选:

<script>
    import  data  from './store.js'
    import Component from './Component.svelte'
</script>

<h2>In App.svelte</h2>

<p>Hello $data.name!</p>

<input name="name" type="text" bind:value=$data.name>

<p>
    $data.details.number
</p>

<h2>In Component.svelte</h2>

<Component />

请注意我们如何摆脱所有订阅样板。 $data 访问存储的当前状态,由于它是可写存储,因此您也可以通过这种方式回写它。您可以在文档中阅读有关商店的更多信息:https://svelte.dev/docs#component-format-script-4-prefix-stores-with-$-to-access-their-values

【讨论】:

看,我知道这很简单!非常感谢您快速而有帮助的回复。

以上是关于Svelte:当组件更改数据时存储数据不响应,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript 创建的 Svelte 组件不接收响应式更新

数据对象未在 Svelte 组件中呈现

如何触发/强制更新 Svelte 组件

如何从 Svelte 组件中导出更改组件中的值的函数?

苗条的组件不刷新

Svelte/Sapper.js - 如何使用 localStorage 数据初始化存储?