Skip to content
全部文档

Json

#[Json] 属性将操作标记为 JSON 端点,直接向 JavaScript 返回数据。验证错误会以结构化错误数据触发 promise 拒绝。这非常适合由 JavaScript 消费、而非在 Blade 中渲染的操作。

基本用法

#[Json] 属性应用到任何向 JavaScript 返回数据的操作方法上:

php
<?php // resources/views/components/⚡search.blade.php

use Livewire\Attributes\Json;
use Livewire\Component;
use App\Models\Post;

new class extends Component {
    #[Json] // [tl! highlight]
    public function search($query)
    {
        return Post::where('title', 'like', "%{$query}%")
            ->limit(10)
            ->get();
    }
};
blade
<div x-data="{ query: '', posts: [] }">
    <input
        type="text"
        x-model="query"
        x-on:input.debounce="$wire.search(query).then(data => posts = data)"
    >

    <ul>
        <template x-for="post in posts">
            <li x-text="post.title"></li>
        </template>
    </ul>
</div>

search() 方法直接将文章返回给 Alpine,存储在 posts 数组中并在客户端渲染。

处理响应

JSON 方法在成功时以返回值 resolve,在验证失败时 reject:

成功时:

js
let data = await $wire.search('query')
// data = [ { id: 1, title: '...' }, ...]

验证失败时:

js
try {
    let data = await $wire.save()
} catch (e) {
    // e.status = 422
    // e.errors = { name: ['The name field is required.'] }
}

或使用 .catch()

js
$wire.save()
    .then(data => {
        // Handle success
        console.log(data)
    })
    .catch(e => {
        if (e.status === 422) {
            // Handle validation errors
            console.log(e.errors)
        }
    })

错误拒绝结构

promise 被拒绝时,错误对象具有如下结构:

js
{
    status: 422,    // HTTP status code (422 for validation errors)
    body: null,     // Raw response body (null for validation errors)
    json: null,     // Parsed JSON (null for validation errors)
    errors: {...}   // Validation errors object
}

对于 HTTP 错误(500 等),结构相同,但包含实际的响应数据:

js
{
    status: 500,
    body: '<html>...</html>',
    json: null,
    errors: null
}

行为

#[Json] 属性会自动应用两种行为:

  1. 跳过渲染 - 操作完成后组件不会重新渲染,因为响应由 JavaScript 消费
  2. 异步运行 - 操作并行执行,不阻塞其他请求

这些行为与 API 风格端点的预期一致。

何时使用

在以下情况使用 #[Json]

  • 构建动态搜索/自动完成 - 为下拉菜单或建议列表获取结果
  • 将数据加载到 JavaScript - 填充图表、地图或其他 JS 驱动的 UI
  • 由 JS 处理表单提交 - 希望在 JavaScript 中处理成功/错误状态时
  • 与第三方库集成 - 向自行管理渲染的库提供数据

WARNING

验证错误是隔离的

JSON 方法的验证错误仅通过 promise 拒绝返回。它们不会出现在 $wire.$errors 或组件的错误包中。这是有意为之——JSON 方法是自包含的,不影响组件的已渲染状态。

另请参阅