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

Laravel项目中React前端如何遍历Controller传递的数组?

嘿,刚好有过类似的实践,给你两个实用的方案,看你需求选就行:

方案一:直接在Blade中传递JSON数据(快速改造)

这个方案不用动后端逻辑,直接把Blade里的$items转成React能识别的JSON数据,适合快速改造现有页面:

  1. 在Blade视图中传递数据并挂载React容器
    修改你的shopCart.blade.php,把Laravel的数组转成JSON,同时准备好React的挂载容器:
<!-- 引入编译后的React脚本(Laravel 9+默认用Vite,就用@vite指令;老版本用Mix的话是mix('js/app.js')) -->
@vite('resources/js/app.js')

<!-- 把Laravel的$items转成JSON,挂载到全局变量 -->
<script>
    window.cartItems = @json($items);
</script>

<!-- React组件要挂载的容器 -->
<div id="cart-container"></div>
  1. 写React组件遍历数据
    在你的React文件(比如resources/js/components/Cart.jsx)里,直接读取全局变量,然后遍历渲染:
import React from 'react';
import { createRoot } from 'react-dom/client';

const Cart = () => {
    // 从全局拿到传递过来的购物车数据
    const items = window.cartItems;

    return (
        <ul>
            {/* 遍历数组,注意一定要加key(用item的唯一ID,别用索引) */}
            {items.map(item => (
                <li key={item.id}>
                    <input type="checkbox" name="" />
                    <span>{item.Name}</span>
                    <span></span>
                    <span>{item.Cost}</span>
                </li>
            ))}
        </ul>
    );
};

// 把组件挂载到容器上
const container = document.getElementById('cart-container');
const root = createRoot(container);
root.render(<Cart />);

这个方案的好处是零后端改动,几分钟就能把现有Blade的循环改成React的动态渲染,适合局部改造的场景。

方案二:通过API接口获取数据(前后端解耦)

如果以后想做前后端分离,或者需要动态更新购物车数据(比如用户添加商品后实时刷新),这个方案更规范:

  1. 添加API路由
    在routes/api.php里新增一个获取购物车数据的路由:
use App\Http\Controllers\CartController;

Route::get('/cart/items', [CartController::class, 'getCartItems']);
  1. 在Controller中写API逻辑
    修改你的Controller,新增一个返回JSON的方法:
public function getCartItems()
{
    // 这里复用你之前获取$it数组的逻辑
    $items = // 你的购物车数据获取代码(比如从Session、数据库读取)
    
    // 返回JSON格式的数据
    return response()->json($items);
}
  1. React组件中请求API并渲染
    在React组件里用fetch或者axios请求API,拿到数据后渲染:
import React, { useState, useEffect } from 'react';
import { createRoot } from 'react-dom/client';

const Cart = () => {
    const [items, setItems] = useState([]);

    // 组件挂载时请求API
    useEffect(() => {
        fetch('/api/cart/items')
            .then(res => res.json())
            .then(data => setItems(data))
            .catch(err => console.error('获取购物车数据失败:', err));
    }, []);

    return (
        <ul>
            {items.map(item => (
                <li key={item.id}>
                    <input type="checkbox" name="" />
                    <span>{item.Name}</span>
                    <span></span>
                    <span>{item.Cost}</span>
                </li>
            ))}
        </ul>
    );
};

// 挂载组件
const container = document.getElementById('cart-container');
const root = createRoot(container);
root.render(<Cart />);

这个方案的优势是前后端完全解耦,以后前端可以独立部署,而且方便做数据的动态更新(比如加个按钮触发重新请求)。

几个注意点

  • React遍历列表时,必须给每个子元素加唯一的key属性,建议用商品的ID,别用数组索引,避免渲染性能问题和错误。
  • 如果用Laravel的Vite编译React,确保vite.config.js里的入口配置正确,比如把resources/js/app.js作为入口,并且在Blade里用@vite指令引入。
  • 方案一里的@json是Laravel Blade的内置指令,会自动处理转义和XSS防护,比手动用json_encode更安全。

内容的提问来源于stack exchange,提问作者Barbell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:35:52