内联组件适合无逻辑的纯结构/样式片段,匿名组件适合需php处理的场景;内联组件必须显式使用$slot和$attributes,不支持@props,属性需手动提取,嵌套无上下文共享,复杂逻辑应换匿名组件。

内联组件和匿名组件到底选哪个
内联组件适合无逻辑、纯结构/样式的片段,比如 <button></button>、<badge></badge>、<icon></icon>;匿名组件适合需要 PHP 层处理(如数据校验、默认值计算、状态派生)的场景。别硬套——没构造函数、不读请求、不调服务、不查缓存,就用内联。
resources/views/components/button.blade.php 怎么写才不踩坑
内联组件本质是 Blade 文件,但会被自动注入 $slot 和 $attributes,这两者必须显式使用,否则传入的内容会丢失。
-
$slot渲染子内容,比如<x-button>提交</x-button>中的 “提交” -
$attributes合并外部 HTML 属性,比如<x-button type="submit" class="btn-lg"></x-button>里的所有属性要靠{{ $attributes }}才能透传到<button></button>标签上 - 不要在文件里写
@props——那是匿名组件用的,内联组件不支持,写了也不生效 - 路径必须严格放在
resources/views/components/下,且文件名转 kebab-case 就是标签名:user-card.blade.php→<x-user-card></x-user-card>
为什么 <x-button variant="danger"></x-button> 里 variant 没生效
因为内联组件不解析属性,它只把原始 HTML 属性挂到 $attributes 对象上。你得手动提取或判断:
- 用
{{ $attributes->get('variant', 'primary') }}获取带默认值的属性值 - 或用
{{ $attributes->class(['btn', 'btn-' . ($attributes->get('variant') ?? 'primary')]) }}动态拼 class - 如果需要大量属性映射(比如
size→btn-sm、full-width→w-full),说明已超出内联组件能力边界,该切到匿名组件了
内联组件能嵌套或复用其他组件吗
能,但要注意渲染上下文。内联组件里调用 <x-icon name="check"></x-icon> 完全合法,但它内部的 $slot 和 $attributes 是独立作用域的,不会继承父级传进来的值。
- 想让子组件“感知”父组件状态?不行——内联组件之间没有上下文共享机制
- 想通过
@aware共享数据?也不行——@aware只对匿名组件有效 - 真正需要父子联动(比如表单组件 + 字段组件 + 提示组件协同变色),就得用匿名组件 +
@props+ 构造函数参数传递
@if 判断多个属性组合、或者需要从 config 或 request 读值,就该停手,换匿名组件。











