【问题标题】:Laravel 5.5 render a React component in a blade view with data from the controllerLaravel 5.5 使用来自控制器的数据在刀片视图中渲染 React 组件
【发布时间】:2018-05-17 23:21:12
【问题描述】:

我的目标是能够在我的刀片视图中执行类似的操作。

<Example name="{{ $user->name }}" />

但这不会渲染任何东西。

当我这样做时:&lt;div id="example"&gt;&lt;/div&gt;it 渲染组件时没有正常的 props 值。

所以我试图将来自控制器的数据作为道具传递给我的 React 组件。

我不确定这是否可能。

这是我的 App.js:

require('./components/Example');

这是我的 Example.js 组件:

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

class Example extends Component {
    render() {
        return (
            <div className="container">
                <div className="row">
                    <div className="col-md-8 col-md-offset-2">
                        <div className="panel panel-default">
                            <div className="panel-heading">Example</div>

                            <div className="panel-body">
                                Hello, {this.props.name}
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        );
    }
}

if (document.getElementById('example')) {
    ReactDOM.render(<Example />, document.getElementById('example'));
}

【问题讨论】:

    标签: javascript laravel reactjs laravel-5


    【解决方案1】:

    我就是这样做的,例如。在 index.blade.php 中

    <div id="main" data-user_name="{{$user->name}}" />
    

    然后在 Main.js 中

    const Main = (props) => {
      return (
        <div>
          <Component {...props} />
       </div>
     );
    }
    
    if(document.getElementById('main')) {
      const el = document.getElementById('main')
      const props = Object.assign({}, el.dataset)
      ReactDOM.render(<Main {...props} />, el);
    }
    

    【讨论】:

    • 我们如何用整个用户对象初始化用户属性?
    【解决方案2】:

    这可能是比其他人建议的更清洁的解决方案。我们也不需要指定使用此方法传入的每个道具。

    在您的刀片文件中:

    <div id="react-component" data-foo='{{ $foo }}' data-bar='{{ $bar }}'>
    

    附带说明,如果 $foo 不是 JSON,例如 Laravel 集合或数组,我们可以应用其他方法:$foo-&gt;toJson()

    在您的组件中:

    if (document.getElementById('react-component')) {
    
        const component = document.getElementById('react-component');
        const props = Object.assign({}, component.dataset);
    
        ReactDOM.render(<ReactComponent {...props} />, component);
    }
    

    然后,您将可以使用 html 中的 data 属性访问您传入的所有道具。就像任何其他反应一样,您可以访问组件内部的道具,例如:this.props.foo

    【讨论】:

    • 您是否通过将用户指定为data-user 进行检查。我的意思是一个对象。我想我们需要 JSON.parse 字符串,然后再将 prop 分配给组件
    • @SachinKumar 您必须将用户对象转换为一个数组,然后对其进行 JSON 编码 json_encode($user-&gt;toArray())JSON.parse,正如您所说的那样才能使用 JS 进行访问。
    • 可以使用 Laravel 刀片系统提供的@json 函数吗?
    【解决方案3】:

    你可以这样做..

    @extends('layouts.app')
    
    @section('script')
        <script type="text/javascript">
            ReactDOM.render(<Example name="{{ $user->name }}"/>, document.getElementById('example'));
        </script>
    @endsection
    
    @section('content')
        <div id="example"></div>
    @endsection
    

    但更好的解决方案是向某些返回 json 数据的控制器发出 AJAX 请求。

    这个 laravel 包对你来说是最好的解决方案 laracasts/PHP-Vars-To-Js-Transformer

    【讨论】:

    • 如何在刀片视图或 React 组件中使用该 json 数据?
    • 将 PHP 变量传递给 JS 有两种选择。 1. 从 JS 加载控制器 url,它以某种格式(如 xml、json)返回数据并将它们解析为 js 变量 2. 将内联 javascript 插入刀片视图,其中包含来自 php &lt;script type="text/javascript"&gt; var awesomeString = "{{ $myString }}"; var prettyObject = JSON.parse("{{ json_encode($likedObject) }}"); &lt;/script&gt; 的所需数据
    • 如何将我的数据解析为 js 变量以及如何在 React 组件中使用该数据?
    • 您需要在刀片视图中的某处定义 js 变量。例如看这个 js 行var userName = "{{ $user-&gt;name }}";。该行定义带有用户名值的 js 变量。 PHP 只需将 {{ $user->name }} 替换为用户名。例如,结果将是 var userName = "John";。然后你可以在 javascript 的任何地方使用 userName 变量。您可以将该变量传递给您的反应组件或直接在任何组件中使用它。
    • 这个 laravel 包对于将 PHP 变量从控制器传递到 JS 非常有用。 https://github.com/laracasts/PHP-Vars-To-Js-Transformer
    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2017-09-03
    相关资源
    最近更新 更多