如何将 PHP 变量传递给 Laravel blade 中的 Vue 组件实例?

How to pass a PHP variable to Vue component instance in Laravel blade?

如何将 PHP 变量的值传递给 Laravel blade 文件中的 Vue 组件?

在我的示例中,我有一个内联模板客户端详细信息,我从 Laravel 获得了这个视图,所以现在我想传递 url 附带的 id /client/1 到我的 Vue 实例。

我的组件由 Laravel 加载,看起来像:

<client-details inline-template>
    <div id="client-details" class="">
          My HTML stuff
    </div>
</client-details>

安装者:

Vue.component('client-details', {
    data(){
        return {
            clientId: null
        }
    },
);

我已经试过了

:clientId="{{ $client->id }"

但它不起作用。

您必须使用 Vue 的 props 才能通过标记将属性传递给 Vue 的组件。看看下面的例子:

<client-details inline-template client-id="{{ $client->id }}">
    <div id="client-details" class="">
          My HTML stuff
    </div>
</client-details>

在你的 Vue 组件中:

Vue.component('client-details', {
    props: [
        {
            name: 'clientId',
            default:0,
        }
    ]
});

现在在你的 Vue 组件的其他部分,你可以访问这个值作为 this.clientId

问题详情

请注意,在 HTML 中,我们将属性名称写入 kebab-case,但在 Vue 端,我们将其写入 camelCase. official docs here.

中的更多信息

此外,您在 :clientId="{{ $client->id }}" 中使用 Vue 的 v-bind shorthand 这意味着 Vue 会将双引号内的任何内容作为 JavaScript 表达式处理,因此您可能会得到在那种情况下也是错误的。相反,您应该使用不带冒号的格式 clientId="{{ $client->id }}

我刚做了这个,对我来说效果很好。使用 Laravel 5.4 和 Vue 2.x.

在我的组件中,为 object:

声明一个 属性 (props)

props: ['currentUser'],

在我实例化组件的 blade 页面上:

<my-component v-bind:current-user='{!! Auth::user()->toJson() !!}'></my-component>

请注意,在组件中,我对 currentUser 使用了驼峰式命名法,但由于 html 是 case-insensitive,您必须使用 kebab-case(因此,'current-user').

另请注意,如果您使用 blade 语法 {{ }},则之间的数据为 运行 到 php htmlspecialchars。如果你想要未编码的数据(在这种情况下你会),然后使用 {!! !!}

我必须将一些服务器数据传递到我的 Vue 组件,我最终在控制器中创建了一个 $server_data 变量并将其传递到 json 脚本标记中。

在控制器中:

$server_data = json_encode([
    "some-data" => SomeObject::all()
]);

return View::make('myview', compact('server_data'));

在模板中:

<script type="application/json" name="server-data">
    {{ $server_data }}
</script>
<!-- Inserts server data into window.server_data -->
<script>
    var json = document.getElementsByName("server-data")[0].innerHTML;
    var server_data = JSON.parse(json);
</script>

在vue初始化中,我放了一个计算的属性:

computed: {
    'server_data': function(){
        return window.server_data;
    }
}

然后,可以使用 server_data.some_object 在组件模板中访问数据。

这允许在不需要许多 html 属性的情况下传递大量结构化数据。另一个好处是数据通过 json 编码转义。这避免了包含双引号 (") 的变量的潜在错误,这会弄乱 dom.

对于遇到此线程但仍然出现错误的任何人,Mustafa Ehsan 在上面给出了正确的答案,但没有解释。反复试验帮助我看到了它。

我的组件在 newuser.blade.php

<access-request
       firstname="{{ $newuser->firstname }}"
       lastname="{{ $newuser->lastname }}"
       accessid="{{ $newuser->id }}"
>
</access-request>

注意使用的绑定方法非常重要。在上面的组件上,我只写了数据绑定的名称(如 React props),然后将其注册到组件 props 上(见下文)。这就是 Mustafa 在他的回答中写他的绑定的方式,并且工作正常。另一种传递 props 的更 Vue 方式是使用 v-bind: 或 :,但你必须确保同时使用双引号和单引号:

:firstname="'{{ $newuser->firstname }}'"

没有两个引号,您会收到 Vue 警告。

AccessRequest.vue:

<template>
   <div class="component">
        <h3 class="">{{ firstname }} {{ lastname }}</h3>
        <p>Access ID: {{ accessid }}</p>
        <label for="administrator">Grant Administrator Priviledges:</label>
        <input name="administrator" type="checkbox" value="True" class="mb-5"><br>
        <button type="submit" class="btn btn-success">Add</button>
        <button type="submit" class="btn btn-danger">Delete</button>
        <hr>
   </div>
</template>

<script>
  export default {
    name: "AccessRequest",
    props: ['firstname', 'lastname', 'accessid'],
  }
</script>

通常将 php 变量传递给 vue 我会这样做

<component-name :prop-name='@json($variable)'></component-name>