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
相关产品推荐
相关产品推荐

