【问题标题】:What does 'Only a ReactOwner can have refs.' mean?'Only a ReactOwner can have refs.' 是什么意思?意思是?
【发布时间】:2018-10-25 20:31:50
【问题描述】:

我有一个简单的react 组件,其中包含一个表单:

var AddAppts = React.createClass({
    handleClick: function() {
        var title = this.refs.title.getDOMNode().value;
        ....

        var appt = {
            heading: title
            ...
        }

        CalendarActions.addAppointment(appt);
    },

    render: function() {
        return (
            <div>
                <label>Description</label>
                <input ref="title"></input>
                ...
            </div>
        );
    }
});
module.exports = AddAppts;

我正在尝试在另一个react 组件中render 这个组件:

  var AddAppt = require('./AddAppts');

  render: function() {
    return (
      <div>
        <AddAppt />
      </div>
    );
  }

但我收到此错误:

 Uncaught Error: Invariant Violation: addComponentAsRefTo(...): Only a ReactOwner can have refs. This usually means that you're trying to add a ref to a component that doesn't have an owner (that is, was not created inside of another component's `render` method). Try rendering this component inside of a new top-level component which will hold the ref.

我已经用谷歌搜索了它,但无法弄清楚我需要做什么来解决这个问题。

【问题讨论】:

  • 这是 2 个不同的文件。当我导入文件时,我给它起了一个不同的名字。
  • 我试图复制我认为是您的设置。 this 很接近吗?
  • 您能否说明您使用的是哪个 React 版本?你找到问题所在了吗?
  • 你找到这个错误的含义了吗?
  • 与此同时,Facebook 已添加指向错误消息的链接:gist.github.com/jimfb/4faa6cbfb1ef476bd105。请务必查看 cmets 以获得可能的解决方案。

标签: reactjs


【解决方案1】:

对于使用 react 和 redux-devtools 并收到 OP 消息的人来说,这是仅供参考。你的结构看起来像

project
  client
  node_modules
    react
    redux-devtools
      node_modules
        react

client 中的代码将需要第一个 react 模块;在 redux-devtools 中需要其他反应。 react 模块保持状态并假设它具有所有状态。

您收到 OP 的消息,因为您的状态在 2 个反应模块之间拆分。我相信@asbjornenge 指的是这种情况。

我将客户端代码与 webpack 捆绑在一起,所以我用它来处理这个问题。您可以通过将以下内容添加到 webpack.config.js 来强制所有 require 和 import 始终使用第一个反应

module.exports = {
  ...
  resolve: {
    alias: {
      'react': path.join(__dirname, 'node_modules', 'react')
    },
    extensions: ['', '.js']
  },
  ...
);

如果在节点上运行非捆绑代码时发生这种情况,我还没有研究我需要做什么。

【讨论】:

  • 考虑到 JS 开发社区的碎片化和混乱程度,我见过的最简单的解决方案
  • 你应该得到奖牌!一个糟糕的问题,真的 - 理智又回来了。
  • 为什么需要extensions 属性以及resolve.alias?
  • 仅供参考 - 我个人不得不使用 process.cwd() 而不是 dirname,但这确实有效并且非常有用。干杯
  • 这一切都取决于你的 webpack.config 文件位于@netpoetica 的位置。 process.cwd() 可能比 __dirname 更正确。
【解决方案2】:

当我使用的组件模块安装了它自己的 react 依赖项时,我遇到了这个错误。所以我使用了多个版本的 React。

确保不要在您的package.json 中的dependencies 下列出反应。
这就是为什么我们有peerDependencies ;-)

【讨论】:

  • 啊!谢谢你。我在测试中不小心编译了两个版本的 React 并出现了这个错误。我永远不会自己找到它。菜鸟失误!
  • NPM 3.0 中没有删除对等依赖项吗?然后呢?
  • 我的问题是加载脚本的顺序。我在 react-dom.js 之前加载 react-with-addons.js。问题出现了。我怀疑 react-with-addons.js 中有一些功能:)
  • @JohnSz peerDependencies 不会被删除,它们只会发出警告而不是自动安装。见github.com/npm/npm/issues/6565#issuecomment-74971689。
【解决方案3】:

以防万一。请注意您使用的 React 模块名称(区分大小写)。当我碰巧尝试在两个单独的模块中使用不同名称的 require React 依赖项时,我遇到了同样的错误。

//module1.js
var React = require('react');
...

//module2.js
var React = require('React');
....

它可以工作,甚至可以渲染一些东西,但是 Only a ReactOwner can have refs... 出现错误。

【讨论】:

  • 你救救我吧!我已经疯狂地挖了20分钟。我读了这篇文章,低头看着我的编辑。果然,一个大的“require('React')”正盯着我。
【解决方案4】:

重新排列脚本解决了这个问题。

错误。

<script src="./lib/react.js"></script>
<script src="./lib/react-dom.js"></script>
<script src="./lib/react-with-addons.js"></script>

正确

<script src="./lib/react.js"></script>
<script src="./lib/react-with-addons.js"></script>
<script src="./lib/react-dom.js"></script>

参考https://github.com/gcanti/tcomb-form/issues/107#issuecomment-150891680

【讨论】:

  • 是否需要同时包含react 和react-with-addons?后者不包括前者的所有代码吗?
【解决方案5】:

我在开发使用npm link 链接到测试项目的反应模块时看到了这个错误。切换到常规依赖项解决了这个问题。

React 好像不喜欢npm link。

【讨论】:

  • “切换到常规依赖”是什么意思?
  • npm link 是一种使用目录(通过符号链接)代替npm 安装的依赖项的方法。删除符号链接并重新启动 npm install 即可解决问题。
【解决方案6】:

还有另一种情况。

我在 webpack.config.js 中将 React 设置为外部库,并从 cdnjs 导入 react.js。

externals: {
  'react': 'React'
}

当我使用依赖于 React 的 ui 库时,例如 material-ui,react-bootstrap,出现此问题。

【讨论】:

    【解决方案7】:

    我正在用我的旧笔写字。确保在您的项目根 package.json 中尽早移动 react 依赖项。你还有问题吗? & 如果你正在使用 npm 模块和 grunt 任务,你可以在下面添加 clean 任务来移除内部组件 react(duplicates)。

    clean: { react : ['node_modules/**/react','!node_modules/react'] },

    【讨论】:

      【解决方案8】:

      我在将package.json 文件上移一级后看到了这个错误,因此我的项目中有 2 个node_modules 目录(一个在./node_modules 中,另一个在./web/node_modules 中)。删除旧目录解决了问题。

      【讨论】:

        【解决方案9】:

        对我来说,同样问题的原因是我已将 ReactDom 全局导入为窗口对象的属性,如下所示:

        import ReactDOM from 'react-dom'
        window.ReactDOM = ReactDOM
        

        删除window.ReactDOM = ReactDOM 解决了这个问题。

        【讨论】:

          【解决方案10】:

          与this answer 类似,我在使用一个单独的模块时看到了这个错误,该模块是我使用yarn link 在单独的目录中开发的。

          解决方案是在我的项目工作目录中运行yarn unlink module-name。然后我删除了node_modules 并运行了yarn upgrade module-name 和yarn 以获得良好的衡量标准。

          【讨论】:

            【解决方案11】:

            代替

            <input ref="title"></input>
            

            试试这个

            <input ref={(title) => this.title = title}></input>
            

            【讨论】:

              【解决方案12】:

              没有一个给定的解决方案对我有用,尽管它们确实帮助我向我展示了在哪里寻找。

              由于某种原因,我的项目有两个 node_modules 文件夹 - 一个在根目录中,一个在上一级。我是 React 新手,所以我不知道这是正常的还是什么。当我开始一个新项目时,我只是使用 Visual Studio 给我的东西。

              无论如何,我知道是哪个模块导致了问题,而且它恰好只存在于 一个 node_modules 文件夹中。

              我将问题模块移至另一个 node_modules 文件夹。问题解决了。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-02-15
                • 2017-05-09
                • 2014-01-16
                • 2017-05-25
                • 2018-05-12
                • 1970-01-01
                • 2015-01-03
                • 2020-09-18
                相关资源
                最近更新 更多