You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Svelte 5:使用图片条件渲染时表单在页面加载时短暂显示后消失

Svelte 5:使用图片条件渲染时表单在页面加载时短暂显示后消失

嘿,我来帮你排查这个奇怪的问题!仔细看了你的代码和描述,我发现了几个关键的问题点,咱们一步步理清楚:

核心元凶:组件内直接使用 <body> 标签

在Svelte组件里,绝对不能直接写<body>标签哦!Svelte组件是要挂载到页面已存在的DOM元素(比如页面原生<body>里的某个容器)中的,如果组件内部再定义<body>,会和页面的原生<body>产生DOM结构冲突,进而引发渲染异常——这大概率就是你看到表单短暂显示后消失的根本原因。

浏览器在解析DOM时,会自动处理重复的<body>标签,这个过程会导致原本已经渲染出来的表单被意外“覆盖”或“重置”,就出现了闪一下就没的现象。

辅助触发点:响应式状态的初始化渲染叠加

你的name是用$state('')声明的响应式变量,结合前面的<body>标签冲突,响应式状态的初始化重渲染会进一步放大这个DOM异常,让问题表现得更明显。而你测试时“同时去掉{#if}和bind:value就正常”,其实只是因为这时候响应式触发减少,DOM冲突的表现被弱化了,但核心问题还是<body>标签的错误使用。

修复方案

咱们先解决<body>的问题,再调整代码逻辑让它更规范:

<script>
    let name = $state('');
    // 把name2也改为响应式变量,保持逻辑一致性(可选,但更符合Svelte 5的写法)
    let name2 = $state('test');
</script>

<!-- 移除组件内的<body>标签,直接保留核心容器 -->
<div class="container">
    {#if name.toLowerCase() === name2.toLowerCase()}
        <img src="example" alt="fantasma" class="fantasma" />
    {/if}
    <div class="box">
        <form class="form-group" action="">
            <label for="name" class="pergunta">Seu nome completo</label>
            <input type="text" id="name" class="input" bind:value={name} />
            <label for="date" class="pergunta">data de nascimento</label>
            <input type="date" id="data" class="input" />
        </form>
    </div>
</div>

<style>
    .fantasma {
        width: 24%;
        height: auto;
    }
    .container {
        display: flex;
        justify-content: center;
        align-items: center;
        height: 100vh;
        flex-direction: column;
        background-color: #f0f0f0;
        margin: 0;
    }
    .form-group {
        display: flex;
        flex-direction: column;
        align-items: center;
    }
    .pergunta {
        margin-bottom: 7px;
    }
    .input {
        width: 300px;
        margin-bottom: 20px;
    }

    .box {
        width: 370px;
        height: 180px;
        margin: 40px;
        align-items: center;
        display: flex;
        flex-direction: column;
        justify-content: center;
        border-radius: 10px;
        background-color: red;
        border: 2.13px solid #ccc;
        box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
    }
</style>

你可以先尝试只移除组件内的<body>标签,问题应该就能解决了。之后再验证条件渲染和表单绑定的逻辑,应该就能正常工作啦。

备注:内容来源于stack exchange,提问作者Leonardo Cavalcante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:25:27