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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:40:22