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

Laravel向Vue.js传递含重音字符数组失败问题求助

解决Laravel向Vue传递含重音字符的对象数组问题

看起来你遇到的问题大概率是带重音字符的字符串在Blade模板输出时没有正确转义为合法JSON,导致Vue解析data时出错。法语里的月份(比如février)包含重音,直接输出可能破坏JSON语法,而英文无重音则不会触发这个问题。下面给你几种可靠的传递方式,以及优化当前代码的建议:

1. 使用Laravel的@json指令(最简便的修复方式)

如果你之前是在Blade里直接用{!! $data['projects'] !!}输出数组,这种方式没有做正确的JSON转义。换成Laravel内置的@json指令,它会自动把数组/对象转成合法的JSON字符串,并且正确处理Unicode字符(包括重音):

<script>
new Vue({
  data: {
    // 用@json替代直接输出,确保转义正确
    projects: @json($data['projects'])
  }
})
</script>

这个指令本质上是json_encode($value, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE)的语法糖,完美解决特殊字符的转义问题。

2. 通过API接口异步获取(最健壮的方式)

如果你的项目复杂度较高,推荐用异步请求的方式传递数据,完全避免模板渲染时的编码冲突:

第一步:新增API路由和控制器方法

在routes/api.php里添加路由:

Route::get('/projects/{userToken}', [YourDashboardController::class, 'getProjects']);

然后在控制器里新增处理方法:

public function getProjects($userToken)
{
    $projects = $this->user->listprojects($userToken);
    // 简化locale设置逻辑,指定UTF-8编码的locale
    $locale = App::isLocale('fr') ? 'fr_FR.UTF-8' : 'en_US.UTF-8';
    setlocale(LC_TIME, $locale);
    
    foreach ($projects as $project) {
        // 确保输出UTF-8编码的字符串
        $project->date = utf8_encode(strftime('%d %B...'));
    }
    
    // 返回JSON响应,Laravel会自动处理编码
    return response()->json($projects);
}

第二步:Vue里异步请求数据

用Axios或原生Fetch请求API:

<script>
import axios from 'axios';

new Vue({
  data() {
    return {
      projects: []
    }
  },
  mounted() {
    // 替换成你的userToken变量
    axios.get(`/api/projects/{{ $userToken }}`)
      .then(res => {
        this.projects = res.data;
      })
      .catch(err => {
        console.error('加载项目数据失败:', err);
      });
  }
})
</script>

这种方式完全分离后端数据逻辑和前端渲染,还能利用缓存、分页等API特性,适合中大型项目。

3. 通过HTML Data属性传递

把数据挂载到Vue根元素的data属性上,再在Vue里读取解析:

Blade模板:

<!-- 用@json把数据转成合法的JSON字符串,赋值给data属性 -->
<div id="app" data-projects="@json($data['projects'])"></div>

Vue代码:

<script>
new Vue({
  el: '#app',
  data() {
    return {
      // 解析data属性里的JSON字符串
      projects: JSON.parse(this.$el.dataset.projects)
    }
  }
})
</script>

额外优化:确保日期字符串编码正确

你的strftime输出可能存在编码问题(比如服务器locale是ISO-8859-1,而页面是UTF-8),导致重音字符乱码。可以用utf8_encode包裹结果:

$project->date = utf8_encode(strftime('%d %B...'));

同时确保服务器安装了对应的UTF-8 locale(比如fr_FR.UTF-8),避免setlocale失效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:29:30