svelte - 使用选择框的奇怪 Svelte react 行为

标签 svelte

我试图理解我在这里做错了什么。 我有一个简单的子组件,它从父组件接收对象列表,并使用它们的 name 属性作为选择框中的选项。我将所选选项存储在局部变量中。 我正在使用 $: onChange(props) 方法从外部监视 props 列表的更改,当它更改时,我想将局部变量设置为 props 数组中的第一个元素。就像这样:

<script>
    export let parameters = [];
    
    let selectedParameter;

    function onChange(_){
    selectedParameter = parameters[0];
    }

    $: onChange(parameters);
</script>

<select bind:value={selectedParameter} >
  {#each parameters as param}
    <option value={param}>{param.name}</option>
  {/each}
</select>

但是,现在选择已损坏,我无法更改选择,因为当我尝试选择另一个选项时,它会触发我的 Prop react 监听器,尽管 Prop 没有改变。 更改 select 中的选项是否会修改 props?

请帮助我了解它是如何工作的。如何防止这种行为?

这是父组件:

<script>
    import Select from "./Select.svelte"
    
        let parameters;

    let params1 = [{name: "1-1"}, {name: "1-2"}];
    let params2 = [{name: "2-1"}, {name: "2-2"}];
</script>

<button on:click={()=> parameters=params1}>load parameters 1</button>
<button on:click={()=> parameters=params2}>load parameters 2</button>

<Select {parameters} />

REPL

最佳答案

Svelte 目前似乎 invalidate too much when using bind:value on a <select> ;生成这段代码:

function select_change_handler() {
    selectedParameter = select_value(this);
    $$invalidate(1, selectedParameter);
    $$invalidate(0, parameters); // <-- this is the problem
}

有多种解决方法,其中一种是不使用绑定(bind)。但是你不能使用对象作为选项 value (除非您访问内部属性 __value ), native 选择 value始终是一个字符串。

例如

<!-- Split bind:value into input-only value and on:change -->
<select
    value={selectedParameter}
    on:change={e => selectedParameter = e.target.value}>
    {#each parameters as param}
        <option value={param.name}> <!-- Use a primitive value here -->
            {param.name}
        </option>
    {/each}
</select>

REPL

关于svelte - 使用选择框的奇怪 Svelte react 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77264741/

相关文章:

svelte - Svelte 是否支持复选框绑定(bind)?

svelte - 如何在本地运行的 Svelte REPL 站点中使用本地构建的 Svelte 3 编译器?

javascript - 在 Svelte 中向下传递 Prop

javascript - Svelte Electron y Metro UI CSS

javascript - 为什么我们需要在 Svelte 中通过 'detail' 对象访问自定义事件数据?

socket.io - 如何让 Socket.io 与 Svelte 一起工作?

browser-cache - 如何强制客户端不缓存 svelte/rollup bundle.js?

sendgrid - 提交表单后通过 SendGrid 发送电子邮件

async-await - slim {#await}..{ :then} block duplicating html with new data

Webpack devServer 代理不适用于 Sapper