我有一个简单的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;
我正在尝试在另一个render
组件中react
此组件:
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.
我用谷歌搜索过,但无法弄清楚我需要做些什么才能解决这个问题。
答案 0 :(得分:54)
这是使用react和redux-devtools获得OP消息的人的FYI。你的结构看起来像
project
client
node_modules
react
redux-devtools
node_modules
react
客户端中的代码需要第一个反应模块;在redux-devtools中需要另一个反应。 react模块保持状态并假定它具有所有状态。
您收到OP的消息,因为您的状态在两个反应模块之间分配。这种情况是我认为@asbjornenge所指的。
我正在使用webpack捆绑客户端代码,所以我用它来处理这个问题。您可以强制所有require
和import
始终使用第一个反应,方法是将以下内容添加到webpack.config.js
module.exports = {
...
resolve: {
alias: {
'react': path.join(__dirname, 'node_modules', 'react')
},
extensions: ['', '.js']
},
...
);
如果在节点上运行非捆绑代码时出现这种情况,我还没有考虑过我需要做什么。
答案 1 :(得分:42)
当我使用的组件模块安装了自己的反应依赖项时,我遇到了这个错误。所以我使用的是React的多个版本。
请确保不在dependencies
的{{1}}下列出反应
这就是为什么我们有package.json
; - )
答案 2 :(得分:16)
以防万一。请注意您正在使用的React模块名称(区分大小写)。我巧妙地尝试require
在两个独立的模块中使用不同的名称来反应依赖。我有同样的错误。
//module1.js
var React = require('react');
...
//module2.js
var React = require('React');
....
它可以工作,甚至渲染一些东西,但只有一个ReactOwner可以有引用... 错误出现。
答案 3 :(得分:3)
重新排列脚本解决了问题。
<强>错误。强>
<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
答案 4 :(得分:2)
我在开发使用npm link
链接到测试项目的react模块时看到了这个错误。切换到常规依赖关系解决了这个问题。
似乎React不喜欢npm link
。
答案 5 :(得分:1)
还有另一种情况。
我将React设置为webpack.config.js中的外部库,并从cdnjs导入react.js。
externals: {
'react': 'React'
}
当我使用ui库依赖于React时,例如material-ui,react-bootstrap,就会出现这个问题。
答案 6 :(得分:0)
clean: {
react : ['node_modules/**/react','!node_modules/react']
},
答案 7 :(得分:0)
我将package.json
文件移到某个级别后看到此错误,因此我的项目中有2个node_modules
目录(./node_modules
中的一个目录和./web/node_modules
中的另一个目录)。删除旧目录修复了问题。
答案 8 :(得分:0)
对我来说,同样问题的原因是我全局导入ReactDom
作为窗口对象的属性,如下所示:
import ReactDOM from 'react-dom'
window.ReactDOM = ReactDOM
删除window.ReactDOM = ReactDOM
解决了问题。
答案 9 :(得分:0)
与this answer类似,我在使用我使用yarn link
在单独目录中开发的单独模块时看到此错误。
解决方案是在项目的工作目录中运行yarn unlink module-name
。然后我删除了node_modules
并运行yarn upgrade module-name
和yarn
以获得良好的衡量标准。
答案 10 :(得分:0)
而不是
<input ref="title"></input>
试试这个
<input ref={(title) => this.title = title}></input>
答案 11 :(得分:0)
给定的解决方案都无法为我工作,尽管它们确实可以帮助我了解如何查找。
由于某种原因,我的项目有两个node_modules
文件夹-一个在根目录中,一个在更高级别。我是React的新手,所以我不知道这是否正常还是什么。当我开始一个新项目时,我只是使用Visual Studio给我的东西。
无论如何,我知道是哪个模块导致了问题,而且它恰好只存在于node_modules
文件夹的一个中。
我将问题模块移至另一个node_modules
文件夹。问题解决了。