为社区建设略尽绵薄之力!参与 2021 社区问卷调查!
此站点不再更新。了解新站点的更多信息!

警告:Refs 属性必须有所有者

你能到这个页面很可能是因为你看到了以下错误信息:

React 16.0.0+

Warning:

Element ref was specified as a string (myRefName) but no owner was set. You may have multiple copies of React loaded. (details: https://fb.me/react-refs-must-have-owner).

早期版本的 React

Warning:

addComponentAsRefTo(…): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component’s render method, or you have multiple copies of React loaded.

这通常意味着以下三种原因之一:

  • 你试图给一个函数组件添加 ref
  • 你试图把 ref 添加到一个在 render() 函数之外生成的元素上;
  • 你加载了多个不同的(冲突的) React 副本(比方说是由配置错误的 npm 依赖所引起)。

函数组件上的 Refs

如果 <Foo> 是一个函数组件,那么你不能给它添加 ref:

// 如果 Foo 是一个函数,那么这样将不起作用!
<Foo ref={foo} />

如果你需要为一个组件添加 ref,首先将组件转换为 class,或者考虑不要使用 refs,因为它们 是非必要的

在 Render 方法外的字符串型 Refs

这通常意味着你试图将 ref 添加到没有所有者的组件上(即,不是在某个组件的 render 方法中创建的)。举个例子,下述代码是不起作用的:

// 不起作用!
ReactDOM.render(<App ref="app" />, el);

试试在顶层组件内渲染该组件,由该组件保存 ref。或者,你可以用回调函数作为 ref:

let app;
ReactDOM.render(
  <App ref={inst => {
    app = inst;
  }} />,
  el
);

在使用这种实现方式之前,请考虑你是否 真的需要 ref

多个 React 副本

Bower 在消除重复依赖方面做得不错,但 npm 不行。如果你没有用 refs 做任何(花哨的)事情,那么很可能不是你编写的 refs 的原因,而是由于你的项目加载了多个 React 副本所引起。有时候,当你通过 npm 拉取一个第三方模块时,你会得到重复的依赖库副本,这可能会产生问题。

如果你用的是 npm,npm lsnpm ls react 命令将有助于发现问题。

Is this page useful?编辑此页面