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

Laravel 10+Livewire 3懒加载生效但数据库数据无法显示求助

Laravel 10 + Livewire 3 懒加载后数据无法显示的解决方案

问题描述

我正在使用Laravel 10和Livewire 3实现懒加载功能,懒加载已正常触发(能看到Loading提示),但加载完成后数据库表中的服务数据无法显示,求解决办法。

组件代码(ServiceSlider.php)

<?php

namespace App\Livewire\Service;

use Livewire\Component;
use App\Models\Service;
use Illuminate\Support\Facades\DB; // 未使用,可移除

class ServiceSlider extends Component
{
    public $services; // 声明服务数据属性

    public function mount()
    {
        $this->services = Service::all();
    }

    public function placeholder()
    {
        return <<<'HTML'
        <div>
            <p style="color:black">Loading...</p>
        </div>
        HTML;
    }

    public function render()
    {
        sleep(3); // 模拟加载延迟
        return view('livewire.service.service-slider');
    }
}

视图代码(service-slider.blade.php)

<div class="service-slider owl-one owl-carousel owl-theme">
    @foreach($services as $service)
        <div class="item">
            <div class="service_icon">
                <img src="{{ asset('assets/uploads/' . $service->icon) }}" />
            </div>
            <div class="connector">
                <span></span>
            </div>
            <div class="service-card">
                <div class="service_detail">
                    <h5>
                        <a href="{{ url($service->slug) }}" title="" wire:navigate>{{ $service->name }}</a>
                    </h5>
                    <p>
                        <?php
                        $description = $service->short_description;
                        $words = str_word_count($description, 1);
                        $first_20_words = implode(' ', array_slice($words, 0, 20));
                        echo $first_20_words . '...';
                        ?>
                    </p>
                </div>
            </div>
        </div>
    @endforeach
</div>

组件调用代码

@livewire('service.service-slider' , ['lazy' => true] )

解决方案

1. 调整数据查询时机

Livewire 3懒加载组件中,mount方法的执行逻辑可能导致数据无法正确传递到视图。将数据查询移至render方法,确保组件加载时能获取并渲染数据:

<?php

namespace App\Livewire\Service;

use Livewire\Component;
use App\Models\Service;

class ServiceSlider extends Component
{
    public $services;

    public function placeholder()
    {
        return <<<'HTML'
        <div>
            <p style="color:black">Loading...</p>
        </div>
        HTML;
    }

    public function render()
    {
        sleep(3);
        // 移至render中查询数据
        $this->services = Service::all();
        return view('livewire.service.service-slider');
    }
}

2. 优化视图代码(可选)

用Laravel内置的Str::words辅助函数替换原生PHP代码,让视图更简洁易维护:

<div class="service-slider owl-one owl-carousel owl-theme">
    @foreach($services as $service)
        <div class="item">
            <div class="service_icon">
                <img src="{{ asset('assets/uploads/' . $service->icon) }}" />
            </div>
            <div class="connector">
                <span></span>
            </div>
            <div class="service-card">
                <div class="service_detail">
                    <h5>
                        <a href="{{ url($service->slug) }}" title="" wire:navigate>{{ $service->name }}</a>
                    </h5>
                    <p>
                        {{ Str::words($service->short_description, 20) }}...
                    </p>
                </div>
            </div>
        </div>
    @endforeach
</div>

3. 排查数据有效性

临时添加日志确认数据库中是否存在数据:

// 在render方法中添加
\Log::info('服务数据数量:' . Service::count());

查看storage/logs/laravel.log,如果数量为0,需检查模型配置(如表名、数据库连接)或数据库数据是否存在。


内容的提问来源于stack exchange,提问作者Tosh Kumar Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:01:25