在 Laravel 刀片模板中调用 ReactJS 组件

Posted

技术标签:

【中文标题】在 Laravel 刀片模板中调用 ReactJS 组件【英文标题】:call to ReactJS component in Laravel blade templates 【发布时间】:2017-09-30 05:59:43 【问题描述】:

我使用 Laravel 5.4 和 React 15.5.4,代码是用 ES6 编写的。

我想替换 Vue 并使用 React,我做到了。但是我经常会在刀片模板的不同地方使用小组件,例如2。我不想使用一个应用组件。

我想使用类似的东西:

<span class="react">
<TestComponent property=true />
</span>

我不能自动完成。现在我用

<span data-component="TestComponent" data-props="property:true" />

在 app.js 中

_.each(document.querySelectorAll('[data-react]'), element => 
  let props =;
  Array.prototype.slice.call(element.attributes)
  .forEach(item => 
    props[item.name] = item.value;
    if(item.name !== 'data-react')
      element.removeAttribute(item.name);  
    

  );
  ReactDOM.render(React.createElement(reactComponents[element.getAttribute('data-react')],props),element);
);

它有效,但我需要使用将所有属性添加到一个反应组件属性,然后使用例如this.props.out.propery

我也想在刀片组件中设置普通组件标签

我尝试在 app.js 中使用

_.each(document.querySelectorAll('.react'), item =>   
  ReactDOM.render(item.children,item);
);

有人有办法解决这个问题吗?


编辑

我将解决方案更改为:

<span data-react="LoginForm" input="json(request()->old())" error="session('error')" errors="json($errors->getMessages())" /> 

<LoginForm data-react="LoginForm" input="json(request()->old())" error="session('error')" errors="json($errors->getMessages())" /> 

在刀片和resources/assets/js/app.js

var reactComponents = 
  LoginForm: require('./components/login').default,
;
_.each(document.querySelectorAll('[data-react]'), element => 
  let props =;
  Array.prototype.slice.call(element.attributes)
  .forEach(item => 
    props[item.name] = item.value;
  );
  ReactDOM.render(React.createElement(reactComponents[element.getAttribute('data-react')],props),element);
);

它工作正常。这不是超级明确的解决方案,但我认为这是合理的。 我可以在 html 代码中设置组件名称并添加几乎与 JSX 中相同的道具。

【问题讨论】:

【参考方案1】:

据我所知,您不能直接将 JSX 组件与 Blade 模板混合使用。目前唯一可用于 React 的服务器端渲染是 NodeJS。 你可以做些什么来改进你的架构是添加具有特定 id 的特定 HTML 标签并在其中呈现反应组件。所以在 Blade 中你可以这样做:

<div id="componentA"></div>

这将在您的 Blade 模板中充当该反应组件的占位符。然后你从你的 app.js 渲染你的 componentA ,如下所示:

React.render(<ComponentA prop1='valueX'/>, document.getElementById("componentA"))

请记住,在这种情况下,react 世界和 Blade 世界在不同时间运行。

【讨论】:

谢谢,我想自动调用组件名称并在 html 标签内设置道具。我在编辑我的帖子时添加了我的解决方案【参考方案2】:

您可以使用document.getElementsByTagName('LoginForm') 获取所有实例,然后迭代其属性。这是清晰的代码,但不是通用的,因为它只适用于 LoginForm 组件。

如果您想呈现任何标签名称,那么最好使用与 data-react 一起使用的某些属性。

getElementsByTagName 不受 old browsers 的超级支持,因此使用 jQuery 作为后备 $('LoginForm') 可能是个好主意

【讨论】:

以上是关于在 Laravel 刀片模板中调用 ReactJS 组件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:在刀片模板中调用静态函数

Laravel 5使用刀片模板在视图中调用函数时如何使用参数

Laravel 刀片模板不起作用 - 调用未定义的函数 Illuminate\View\Compilers\token_get_all()

Laravel 模板显示路线中的两个刀片模板

我可以在 symfony 中使用刀片模板引擎(laravel)吗?

Laravel 刀片模板中的图像路径问题