4

显示我的 Rails 结构以进行反应的图像

我有很多反应组件,并希望简单地保持它们更好地组织。所以我会切入正题,问。是否可以将我的反应组件放在目录中,如果可以,我如何在视图和其他反应组件中选择它们?

我已经尝试了一些变体,例如下面的变体,但没有成功,并且担心这根本不可能?也找不到任何关于此的文档。

<%= react_component('OutfitCreate.Images') %>

编辑:为了澄清,我想明确表示我使用的是典型的 rails 项目结构,并且对于 react 我正在使用 react-rails gem 来处理我的组件以及生成它们。

Edit2:为了进一步澄清,我正在寻找一种按目录定位反应组件的方法,如下所示:

<%= react_component('<directory>/<classname>') %>

其中每个目录将是“组件”的子目录。

4

3 回答 3

2

我知道这是一个老问题,但也许它可以帮助任何人。你可以这样做:

<%= react_component "ComponentFolder/ComponentClassName" %>

它适用于 rails-react 和 webpacker。

于 2017-12-20T09:49:17.273 回答
0

我最近使用了react-rails gem并且有很好的体验。它负责访问您在 Rails 模板中的组件并做一些其他的好事。

要具体回答您的问题,只要您遵循 gem 文档,您就可以将组件放在任意数量的目录中。gem 提供了一个视图助手,允许您渲染特定组件,并将数据作为道具传递给它(助手获取成为组件道具的散列)。

编辑——我不确定你是否已经在使用 gem,你使用的辅助方法看起来像它,但你没有特别提到它。gem 安装和/或设置可能存在问题。您需要编辑application.js并运行生成器任务:rails g react:install

编辑——为了确保您可以访问组件子目录中的组件,您应该执行以下操作:

*运行生成器:rails g react:install

*确保生成的 components.js 文件包含://= require_tree ./components

*确保您的 application.js 文件包含:

//= require react //= require react_ujs //= require components

于 2016-05-04T01:56:01.707 回答
0

React 组件将被认为是全局的,因为所有.js将被压缩到一个大的.js文件中。因此,您将不得不考虑一些因素。


首先,在你的 sprockets 文件(通常是application.js)中,你需要告诉 Rails 提供你想要的React 组件。简单的方法是要求组件文件夹中的所有文件夹和文件,因为您的所有组件都将在那里,但组织在子文件夹中。这是添加下一行:

// File: app/assets/javascripts/application.js
//= require_tree ./components

其次,如果你想使用名为Images的React 组件,它可以定义在 中,你可以像往常一样在Rails View中使用帮助器。../components/folder/images.jsreact_component('Images')

如果 Images 组件与您在某些服务的.js中定义的Images 组件匹配,React 将找到该组件(但理智的人会期望您在某些images.js中定义了Image 组件),因为这个名称Images是全局的(还记得吗?一个很大的 .js 文件)。 js 文件将被提供)。

使用这种方法,客户端将只下载一个包含所有 React 组件的大 .js 文件。对下载速度不利,但可以缓存。

因此,在这里,您必须小心为所有组件命名,每个组件都使用不同的名称。


现在,例如,如果您有一个名为Foo的组件内部../components/folder/doesnt_matter.js和另一个具有相同名称的组件Foo,但 inside ../components/another_folder/this_neither.js,您将必须告诉 Rails 您要为要渲染的特定视图提供哪个文件以规避冲突名称问题.

这意味着,您可以让客户端只下载渲染页面所需的 js 代码(和所需的 React 组件)。它将为每个页面下载 .js 文件,失去缓存的可能性。

一种中间方法是为同一控制器中的所有视图提供一个中等大小的 .js 文件。

为此,您可以组织您的 js(或 jsx,或...),以便为公共组件(用于两个或多个控制器)提供一个位置,并为每个具有特定 React 的控制器提供一个特定文件夹里面的组件。

首先,您必须将之前添加//require_tree ./componentsapplication.js替换//require ./components/common/为只为所有视图提供常见的 React 组件。

其次,在您的布局中,您可以提供两个js 文件;一个application.js和一个#{controller_name}.js(这意味着每个控制器一个特定的 .js 文件)。

第三,对于每个控制器,您将拥有一个同名的.js文件。因此,假设您有一个名为home_controller的控制器,那么您将需要一个home.js(布局视图中的控制器名称助手将使 rails 来查找此文件)并在其中再次使用 sprockets,您将提供特定的 React 组件和//require ./components/home/

通过这种方式,您将不得不照顾您的组织,并且 React 组件名称需要与内部的不同.../components/common/


如果您还想更具体一点,您可以在布局中结合使用相同的技术controller_nameaction_name助手。或者,您可以使用content_for请求具有视图所需的 React 组件的特定 .js 文件。

但是,您需要小心,因为我不知道资产管道会对您不利。专门使用content_for.

于 2017-07-15T00:09:36.513 回答