&引用;意外标识符“;试图用转义单引号解析JSON时Javascript出错

&引用;意外标识符“;试图用转义单引号解析JSON时Javascript出错,javascript,php,json,laravel,vue.js,Javascript,Php,Json,Laravel,Vue.js,在我的Laravel应用程序中,我将JSON对象传递给Vue组件: <search v-bind:library="'{{ json_encode(language_library()) }}'"></search> 如您所见,字符串中的单引号被转义。但是,Vue会引发以下错误: [Vue warn]: Error compiling template: invalid expression: Unexpected identifier in

在我的Laravel应用程序中,我将JSON对象传递给Vue组件:

<search v-bind:library="'{{ json_encode(language_library()) }}'"></search>
如您所见,字符串中的单引号被转义。但是,Vue会引发以下错误:

[Vue warn]: Error compiling template:

invalid expression: Unexpected identifier in

    '{"you_dont_have_subscription":"You don\\'t have an active subscription right now."}'

  Raw expression: v-bind:library="'{"you_dont_have_subscription":"You don\\'t have an active subscription right now."}'"
我不明白为什么会发生这个问题。它是双引号中的一个单引号,并且也是转义的(在PHP后端使用
addslashes()
)。如果不是这样的话,我怎么能有一个在JSON中包含引号的字符串呢

如果,我不使用AddSlaes,而是手动执行类似的操作

str_replace("'", "\'", $string)

…我仍然会遇到同样的错误,JSON中的引号前面有两个反斜杠。

这是常见的错误。这与引用无关,双引号会导致此错误。为什么?请参阅您的输入以获取道具

v-bind:library="'{"you_dont_have_subscription":"You don\\'t have an active subscription right now."}'"
这意味着js不知道为什么library prop以
v-bind:library=“”{“
结尾,所以使用引号代替dbl引号。如下所示:

<search :library='@json(language_library())'></search>
<search v-bind:library="{{ json_encode(language_library(), JSON_HEX_QUOT | JSON_HEX_APOS) }}"></search>
// or you could declare a variable and assign `json_encode` to it
<?php $json = json_encode(language_library(), JSON_HEX_QUOT | JSON_HEX_APOS); ?>
<search v-bind:library="{{ $json }}"></search>

您只需编写
搜索
标记,如下例所示:

<search v-bind:library="'{{ json_encode(language_library(), JSON_HEX_QUOT | JSON_HEX_APOS) }}'"></search>

  • JSON\u HEX\u APOS:All'被转换为\u0027
  • JSON\u HEX:All”被转换为\u0022
编辑

根据的示例,您应该删除单引号

<option {{ $isSelected($value) ? 'selected="selected"' : '' }} value="{{ $value }}">
    {{ $label }}
</option>

{{$label}}
因此,您的搜索标签将如下所示:

<search :library='@json(language_library())'></search>
<search v-bind:library="{{ json_encode(language_library(), JSON_HEX_QUOT | JSON_HEX_APOS) }}"></search>
// or you could declare a variable and assign `json_encode` to it
<?php $json = json_encode(language_library(), JSON_HEX_QUOT | JSON_HEX_APOS); ?>
<search v-bind:library="{{ $json }}"></search>

//或者,您可以声明一个变量并为其指定`json_encode`

试试看,可能会有用,我也会遇到同样的事情

我使用
{!!$value!!}}


回答:你不需要额外的
'

说明: 记住
json_encode
将返回
{}
,laravel将在
{{}}
中回显它,然后作为对象本身
{}
传递并编译到javascript中

编辑:

使用额外的
将被javascript视为结束字符串

您的编码示例

<search v-bind:library="{{ json_encode(language_library()) }}"></search>


我不明白你在说什么。什么不能逃避什么?你背反斜杠反斜杠单引号…它逃避了第二个反斜杠,而不是单引号…你有一个太背反斜杠了…也就是说,
\'
逃避了第二个
\
而不是
'
(最后写出来:p-该死的反斜杠)这是PHP内置addslashes函数的输出…我不是手动添加斜杠。我不明白为什么它会添加两个斜杠而不是一个斜杠,如果这样会产生反效果?顺便说一句,如果我根本不使用addslashes,我会遇到同样的错误-然后只有一个没有斜杠的单引号。
这是PHP内置addslashes函数的输出tion
-然后PHP addslashes函数不是生成SyntaxError所需的函数:
在Blade中使用@JSON()指令在JSON中的位置1使用意外标记o
是一个好主意。但是,它需要一个常规PHP变量,因此
语言库()
必须返回一个PHP数组,例如
[“您没有订阅”=>”您现在没有活动订阅。“]
。我手头没有代码,但我强烈怀疑对包含json的字符串使用
@json()
会对json进行重新编码,您现在可能不需要双重编码。但是
语言库()
确实返回了一个常规数组,我确信这一点。现在的错误是
避免使用JavaScript关键字作为属性名:“for”“
-即使JSON中没有属性的。有时会发生这种情况,因为您的对象可能包含编译为javascript结束字符串的”,请阅读我的回答,当我删除额外的,将原始刀片回显到您的javascript时,您不需要额外的”,我在位置1得到JSON中的
意外标记o