Laravel怎么在Blade中使用JSON数据_Laravel @json指令与Vue组件传值技巧【手册】

9次阅读

Blade 中应使用 @json 指令而非 json_encode() 输出 JSON,因其自动处理转义、类型校验和 xss 防御,输出合法 JSON 字符串vue 组件推荐通过 props 接收,如 。

Laravel怎么在Blade中使用JSON数据_Laravel @json指令与Vue组件传值技巧【手册】

Blade 中直接输出 JSON 数据用 @json,不是 json_encode() 手动转义

很多人在 Blade 里写 {{ json_encode($data) }},结果引号被 html 转义成 ",JS 解析失败。laravel 5.5+ 内置的 @json 指令会自动处理转义、类型校验和 XSS 防御,且输出是合法 JSON 字符串(带双引号包裹),可直接赋值给 JS 变量。

常见错误现象:{{ json_encode($user) }} 在页面源码中显示为 {"id":1,"name":"Tom"},JS 里 const user = {{ json_encode($user) }}; 会语法报错。

  • @json($user) 输出: {"id":1,"name":"Tom"}(安全、合法、可直接用)
  • 支持嵌套结构、NULL、布尔值、数字,不支持资源(如 Resource 对象需先 toArray()
  • 若变量可能为 null,建议加默认值:@json($user ?? [])

Vue 组件接收 Blade 传入的 JSON 数据,优先用 props 而非全局变量

@json 结果塞进 data- 属性再用 JS 读取,容易出竞态或类型丢失;更稳妥的方式是让 Vue 组件声明 props,Blade 渲染时直接绑定。

使用场景:初始化一个带用户信息的 UserProfile.vue 组件,数据来自服务端查询,无需额外 API 请求。

立即学习前端免费学习笔记(深入)”;

  • 组件定义需明确 prop 类型:
    export default {   props: {     initialUser: {       type: Object,       required: true,       default: () => ({})     }   } }
  • Blade 中调用:(注意冒号触发 Vue 的响应式绑定)
  • 避免写成 :initial-user="{{ json_encode($user) }}" —— 会因 HTML 转义导致解析失败
  • 如果用的是非 `` 方式(如普通 `
    `),可用 data 属性 + JSON.parse(),但必须确保属性值未被 HTML 编码

    const el = document.getElementById('app') const user = JSON.parse(el.dataset.initialUser)

    @jsonv-html 混用会破坏 JSON 安全性

    有人为了“动态插入”,把 @json 结果拼进字符串再用 v-html 渲染,比如:v-html="'var user = ' + @json($user)"。这不仅多余,还会绕过 Vue 的模板编译机制,导致 XSS 风险(尤其当 $user 含用户可控字段时)。

    • @json 本身已做 HTML 实体转义,但仅保障 JSON 字符串合法性;一旦用 v-html 插入脚本上下文,就失去保护
    • 所有服务端数据应走 propsdata 属性,由 Vue 自身解析,不拼接字符串
    • 若需动态生成 JS 代码(极少见),改用 Laravel Mix 的 webpack 提供环境变量或预编译配置,而非运行时拼接

    复杂嵌套对象传给 Vue 时,注意 Eloquent 关系加载与序列化控制

    直接传 @json($post) 看似简单,但如果 $post 带了未加载的关系(如 $post->author),序列化时会触发 N+1 查询;若用了 HiddenCasts,也可能和前端预期不符。

    • 显式加载所需关系:$post->load('author:id,name,avatar'),避免传整个模型实例
    • toArray()only() 显式筛选字段:@json($post->only(['id', 'title', 'content']))
    • 若模型有 $casts(如 'options' => 'array'),@json 会自动处理;但自定义 toArray() 方法必须返回纯数组,不能返回集合或对象
    • 时间字段默认转为字符串,无需额外格式化 —— 除非你覆盖了 serializeDate() 方法

    Vue 初始化时拿到的数据,是否真正“响应式”取决于你有没有在 data()setup() 中正确解构或引用它。直接把 @json 当字符串用没问题,但把它当成“已经响应式”的源头,就容易忽略 Vue 的响应式限制。

text=ZqhQzanResources