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

Laravel Livewire动态切换问题异常:仅前3个问题生效的修复

问题分析

你的代码核心问题是跳转逻辑硬编码,answerChoice方法里固定点击Yes跳ID=2、No跳ID=3,完全没有根据当前问题的选择动态匹配后续分支,自然无法处理200+问题的复杂跳转。

解决方案

要实现动态分支,需要先给问题表添加存储后续跳转ID的字段,再修改Livewire逻辑根据当前问题的选择获取对应下一个问题。

1. 数据库表修改

给questions表添加两个字段,分别存储点击Yes/No后要跳转的问题ID:

ALTER TABLE questions ADD COLUMN yes_next_id INT NULL;
ALTER TABLE questions ADD COLUMN no_next_id INT NULL;

之后在后台给每个问题设置对应的yes_next_id和no_next_id(比如ID=2的问题,Yes设为12,No设为5)。

2. 更新Livewire控制器

use App\Models\Question;
use Livewire\Component;

class Pain extends Component
{
    public $currentQuestion; // 单个问题对象,无需集合

    public function mount()
    {
        // 初始加载ID=1的问题,用first()获取单个对象
        $this->currentQuestion = Question::find(1);
    }

    public function answerChoice($choice)
    {
        // 根据当前问题的选择,获取下一个问题ID
        $nextQuestionId = $choice == '1' ? $this->currentQuestion->yes_next_id : $this->currentQuestion->no_next_id;
        
        // 如果有下一个问题,更新当前问题
        if ($nextQuestionId) {
            $this->currentQuestion = Question::find($nextQuestionId);
        }
        // 可添加无后续问题的处理逻辑(比如显示问卷结束提示)
    }

    public function render()
    {
        return view('livewire.quiz.man.eyes.pain');
    }
}

3. 优化Blade视图

因为currentQuestion是单个对象,无需foreach循环:

<div class="container">
    <div>
        <h3>{{ $currentQuestion->question_explanation }}</h3>
    </div>
    <div class="align-content-center">
        <div>
            <button wire:click="answerChoice('1')" class="btn btn-outline-success">Yes</button>
        </div>
        <div>
            <button wire:click="answerChoice('0')" class="btn btn-outline-danger">No</button>
        </div>
    </div>
</div>
额外优化建议
  • 给yes_next_id和no_next_id添加外键约束,关联questions.id,保证数据合法性
  • 补充无后续问题的处理(比如隐藏按钮、显示"问卷结束"提示)
  • 用findOrFail()替代find(),便于调试不存在的问题ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:10:48