Laravel向Vue.js传递含重音字符数组失败问题求助
看起来你遇到的问题大概率是带重音字符的字符串在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

