Livewire嵌套组件调用父类而非子类属性方法问题求助
问题根因
报错的核心原因是HTML嵌套规则限制导致Livewire子组件边界失效:
- BookField子组件的模板使用
<div>作为根元素,内部包裹<tr>标签 - 浏览器不允许
<div>直接作为<table>的子元素,渲染时会自动将非法嵌套的<div>移动到<table>标签外部 - 这一行为破坏了Livewire的子组件作用域绑定,所有
wire:model、wire:click指令都会向上匹配到父组件BookManager,因此抛出属性、方法不存在的错误。
修复方案
直接修改livewire/book-field.blade.php模板,移除外层多余的<div>,将<tr>作为子组件的唯一根元素:
// 修正后的 livewire/book-field.blade.php <tr> <td> {{$book->name}} </td> <td> <progress value="{{ ($book->pages_read / $book->pages_total) * 100 }}" max="100"></progress> </td> <td> <input class="form-control" type="number" wire:model.defer="pages_read" placeholder="{{$book->pages_read}}"> </td> <td> / {{$book->pages_total}} </td> <td width="15%"> <button class="btn btn-primary" type="button" wire:click="update()">Update</button> <button class="btn btn-success" type="button" wire:click="finish()">Finish</button> </td> </tr>
额外优化建议
- 父组件
book-manager.blade.php的<table>标签内补充<tbody>标签,将子组件循环放在<tbody>内部,符合HTML结构规范 - 操作按钮的
type属性从submit改为button,避免无表单包裹时意外触发页面提交
内容的提问来源于stack exchange,提问作者BGiezen
相关产品推荐
相关产品推荐

