如何在Laravel 9中用JavaScript动态多次调用Blade组件?
实现点击按钮重复调用Laravel Blade组件
要实现点击按钮动态添加x-layouts.input组件实例,需要解决两个核心问题:保证每个组件的ID唯一(避免DOM冲突),以及将输入框的name设置为数组形式(方便后端接收多个值)。以下是具体实现方案:
1. 调整初始组件调用与容器结构
首先在Blade模板中定义存放组件的容器、初始组件和添加按钮,同时将name改为数组格式quantity[],并给ID加上序号保证唯一性:
<!-- 存放动态组件的容器 --> <div class="input-container"> <!-- 初始输入组件,默认至少显示一个 --> <x-layouts.input name="quantity[]" title="Quantity" type="number" id="quantity-0" :value="old('quantity.0')" /> </div> <!-- 添加按钮 --> <button type="button" id="add-quantity-btn">添加数量输入框</button>
2. 编写JavaScript动态添加逻辑
由于Blade组件是服务器端渲染,前端无法直接生成<x-...>标签,因此我们通过克隆已有组件DOM的方式来添加新实例,并修改关键属性:
<script> document.addEventListener('DOMContentLoaded', function() { const addBtn = document.getElementById('add-quantity-btn'); const container = document.querySelector('.input-container'); // 从1开始计数,初始组件序号为0 let inputIndex = 1; addBtn.addEventListener('click', function() { // 克隆第一个组件的DOM结构 const template = container.querySelector('.form-group').cloneNode(true); const input = template.querySelector('input'); const label = template.querySelector('label'); // 设置新的唯一ID和label的for属性 const newId = `quantity-${inputIndex}`; input.id = newId; label.setAttribute('for', newId); // 保持name为数组格式,确保后端能接收多个值 input.name = 'quantity[]'; // 清空新输入框的值(可根据需求设置默认值) input.value = ''; // 将新组件添加到容器中 container.appendChild(template); inputIndex++; }); }); </script>
3. 处理验证失败后的回显
如果表单验证失败,需要保留用户已添加的所有输入框及对应值。可以通过循环old('quantity')来渲染组件:
<div class="input-container"> @php // 如果没有旧值,默认显示一个空输入框 $quantities = old('quantity', [null]); @endphp @foreach($quantities as $index => $value) <x-layouts.input name="quantity[]" title="Quantity" type="number" id="quantity-{{ $index }}" :value="$value" /> @endforeach </div>
4. 后端接收数据
在控制器中,可以通过数组形式接收多个quantity值:
public function store(Request $request) { // 获取所有quantity值,自动转为数组 $quantities = $request->input('quantity'); // 可选:过滤空值 $quantities = array_filter($quantities, fn($val) => !empty($val)); // 后续业务逻辑,比如批量存储等 }
内容的提问来源于stack exchange,提问作者Rasula Makbul
相关产品推荐
相关产品推荐

