反应错误(只有ReactOwner可以有refs。)

我刚刚使用’React-rails’在我的rails项目中安装了一个新的反应,并在其上添加了searchkit。 但是我遇到了一些错误。

未捕获的不变违规:addComponentAsRefTo(…):只有ReactOwner可以有refs。 您可能正在向组件的render方法中未创建的组件添加ref,或者您已经加载了多个React副本。

应用程序/资产/ Java脚本/组件/ search.js.jsx

 const host = "http://demo.searchkit.co/api/movies" const sk = new Searchkit.SearchkitManager(host, {}) var Search = React.createClass({ render: function() { const SearchkitProvider = Searchkit.SearchkitProvider; const Searchbox = Searchkit.SearchBox; const Hits = Searchkit.Hits; const NoHits = Searchkit.NoHits; const HitsStats = Searchkit.HitsStats; const Layout = Searchkit.Layout; const LayoutBody = Searchkit.LayoutBody; const LayoutResults = Searchkit.LayoutResults; const SearchBox = Searchkit.SearchBox; const TopBar = Searchkit.TopBar; const SideBar = Searchkit.SideBar; const ActionBar = Searchkit.ActionBar; const ActionBarRow = Searchkit.ActionBarRow; const HierarchicalMenuFilter = Searchkit.HierarchicalMenuFilter; const RefinementListFilter = Searchkit.RefinementListFilter; const SelectedFilters = Searchkit.SelectedFilters; const ResetFilters = Searchkit.ResetFilters; const MovieHitsGridItem = Searchkit.MovieHitsGridItem; return (
); } });

React相当新,所以不太确定为什么会出现这些问题?

谢谢

好的,我刚刚浏览了这个searchkit库。 基于它是一个React组件并且你正在使用react-rails的事实,我几乎可以肯定你遇到了一次有两个React实例的问题。 react-rails缺点是难以将外部库与它集成。 它可以快速设置并开始使用,但只要你想安装其他反应库,你就会碰壁。

我以前遇到过这个问题,而我所做的就是使用https://github.com/netguru/react_webpack_rails 。 如果你想要更多的abit,那么看看https://github.com/shakacode/react_on_rails 。 这两个选项需要更多的设置工作,但如果您认真对待React及其生态系统,那么这个选项非常值得。

顺便说一句:Searchkit看起来很棒!

我似乎已经迟到了派对,但为了以防万一,有人可能会再次遇到这个问题,需要一个更直接的解决方案。

供你参考:

  • Rails 5.2.0
  • Ruby 2.5.1p57(2018-03-29 Revision 63029)[x86_64-darwin17]
  • React-rails(2.3.1)

我相信这可能发生在不同的rails和ruby版本上。

就像@kasperite所说的那样,我确信你错误地有两个React实例。 您要么'require react'两次,要么通过'require_tree .'进入双实例'require_tree .''application.js'文件中。

更具体地说,您应该检查'application.js'文件中的以下行:

 //= require react //= require react_ujs //= require components //= require_tree . 

问题是您首先通过require react指令加载React,然后使用require_tree .再次加载它require_tree . 指示。

参考: https : //guides.rubyonrails.org/asset_pipeline.html#manifest-files-and-directives

或直接引用官方指南,如上面的链接

require_tree指令告诉Sprockets以递归方式将指定目录中的所有JavaScript文件包含到输出中。 必须相对于清单文件指定这些路径。 您还可以使用require_directory指令,该指令仅包含指定目录中的所有JavaScript文件,而不进行递归。

要对问题进行排序,您只需要完全删除require_tree . 通过删除等号来指令或取消设置 – 转动//= require_tree .// require_tree .

希望这有帮助和欢呼。