ruby-on-rails - 在多个 react_components 之间共享用户对象
问题描述
react_component
除了将用户对象挂在窗口之外,在多个用户之间共享用户对象的最佳方法是什么?
例如 -
<%= react_component("HelloWorld1", { user: @user }) %>
<%= react_component("HelloWorld2", { user: @user }) %>
解决方案
如果你在前端使用 React 和 HTML.ERB
如果你想结合 HTML.ERB 和 React,我认为你目前拥有的方式是最好的方式。
就像在处理纯 React 时不能一次将 prop 传递给两个组件一样,我认为在这种情况下你也不能这样做。
如果你只在前端使用 React
注意:我不确定以下内容会如何影响 SEO。
您可以将 Rails 应用程序用作 API,并使用单个 HTML 标记static_pages#root
(或类似标记)显示您的 React 应用程序。然后react-router-dom
用于前端的路由和更改页面。
这样您就不必保留html.erb
可以将实例变量传递给的渲染模板。您将使用 API 请求获取数据并对其进行修改。
额外细节
如果您选择执行第二种方法(使用react-router-dom
),则文件可能类似于以下内容:
routes.rb
Rails.application.routes.draw do
namespace :api, default: { format: :json } do
resources :users, only: [:index, :show, :create, :destroy]
# ...
end
root to: 'static_pages#root'
end
app/controllers/static_pages_controller.rb
class StaticPagesController < ApplicationController
def root
end
end
app/views/static_pages/root.html.erb
<main>
<%= react_component("App") %>
</main>
app/javascript/components/App.jsx
import React, { useState, useEffect } from 'react';
import {Switch, Route} from 'react-router-dom';
import { Auth } from './auth/Auth.jsx';
import { HelloWorld1 } from './hello/world1/HelloWorld1.jsx';
import { HelloWorld2 } from './hello/world1/HelloWorld2.jsx';
const App = () => {
const [user, setUser] = useState(null);
if (!user) {
return (
<Auth setUser={setUser} />
);
}
return (
<Switch>
<Route
exact
path="/hello/world1"
render={(props) => <HelloWorld1 user={user} {...props} />}
/>
<Route
exact
path="/hello/world2"
render={(props) => <HelloWorld2 user={user} {...props} />}
/>
{/* ... */}
</Switch>
};
export default App;
推荐阅读
- c++ - 如何估计 PXA27x 处理器上卷积的执行时间?
- android - 即使在使用 NDEF 跳过标志启用阅读器模式后也会发送 NDEF 选择命令
- selenium - 无法使用 Selenium 从自动完成列表中选择选项
- php - jquery 在不应该加载页面文件时加载
- c# - 没有私有集的只读属性;
- google-cloud-functions - 保护 HTTP 云功能
- vsix - 如何在 Visual Studio 2019 中异步加载 ModelingPackage(DSL 工具)?
- javascript - 将多个参数传递给 MongoDB 查询方法
- c# - 使用代码隐藏而不是 Web.Config 端点调用服务时出现不安全或安全错误错误
- django - Django 迁移:什么是 `elidable` 参数?