[英]In Rails how do I access a server-side rendered React component as HTML
我正在尝试将 React 组件转换为 PNG,以便可以将其附加到 Rails 邮件程序中的 email。 该组件是一个饼图Rechart 。
我想在 Rails 中完成这一切,而不是使用 Node.js 服务器解决方案,它使用repng之类的东西将组件转换为 PNG。
Rechart 将图表组件加载为 SVG,因此我可以访问 SVG 并使用Mini-Magic 之类的东西将其转换为 PNG。
如何在服务器端将 React 组件加载为 HTML 以访问 SVG 进行转换。
要在 Rails 中加载服务器端组件,我们可以执行react-rails 建议的操作:
在视图中
<%= react_component('HelloMessage', {name: 'John'}, {prerender: true}) %>
或在 controller
class TodoController < ApplicationController
def index
@todos = Todo.all
render component: 'TodoList', props: { todos: @todos }, tag: 'span', class: 'todo'
end
end
我想做一些类似这篇文章在使用ReactDOMServer 时所建议的事情。
// Renders our Hello component into an HTML string
const html = ReactDOMServer.renderToString(<Hello />);
我需要在 Rails 邮件程序中的 Ruby 中执行等效操作。 如何以 HTML 的形式访问服务器端渲染组件?
编辑:
sig 的答案是正确的,因为它允许您访问 controller 实例的 HTML,这对我有用:
controller_instance = ComponentsController.new()
html_string = controller_instance.render_to_string(:action => "index", :layout => false)
但是, html_string
output 是:
"<div data-react-class=\"personnel/TrainingStatusChart\" data-react-props=\"{"metaData":{"currentPage":1,"scopedCount":23,"statusGreyCount":15,"statusHighCount":5,"statusLowCount":2,"statusMediumCount":1,"totalCount":23,"totalPages":1,"unscopedCount":23},"prerender":true}\"></div>\n"
它是包含所有道具的 React 组件。 预渲染 React 组件不会将其编译为服务器端的 HTML。 因此,无法在 React 组件中访问 SVG 以转换为 PNG。 这篇文章是这样说的:
此预渲染过程无权访问 window 或文档,因此它不会加载运行时 JavaScript 或 CSS。
我仍然坚信这一定是可能的。 也许以某种方式使用 Capybara 和 Headless Chrome 来渲染 React 组件。 但是,我还没有找到一个示例实现。
您可以尝试使用 controller 的render_to_string
方法:
controller_instance = ActionController::Base.new()
#or
controller_instance = ApplicationController.new()
html_string = controller_instance.render_to_string template: 'path_to_file'
它接受与render
相同的参数。 更多信息https://apidock.com/rails/ActionController/Base/render_to_string
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.