We want to hear from you!Take our 2021 Community Survey!
このサイトの更新は終了しました。ja.react.dev へ

Refs Must Have Owner Warning

「ref にはオーナーが必要である」の警告。

このページを閲覧しているのはおそらく以下のエラーメッセージの 1 つが出力されたからでしょう。

React 16.0.0+

警告:

ref 要素が文字列 (myRefName) として指定されましたが、オーナーが設定されていませんでした。React の複数のコピーがロードされている可能性があります(詳細:https://fb.me/react-refs-must-have-owner)。

より古いバージョンの React

Warning:

addComponentAsRefTo(…): ReactOwner だけが ref を持つことができます。コンポーネントの render メソッド内で作成されていないコンポーネントに ref を指定したか、React のコピーを複数ロードしているかもしれません。

これは通常、以下の 3 つのいずれかを意味します:

  • ref を関数コンポーネントに使用しようとしている
  • コンポーネントの render() 関数の外部で作成されている要素に ref を使用しようとしている
  • React の複数の(競合する)コピーがロードされている(例えば npm 依存関係の設定ミスによって)

関数コンポーネントの ref

<Foo> が関数コンポーネントである場合には、ref を指定することはできません。

// Doesn't work if Foo is a function!
<Foo ref={foo} />

コンポーネントに ref を指定する必要がある場合は、クラスコンポーネントに変換するか、あるいは ref を使わない方法を検討してください。ref が本当に必要になることは滅多にありません。

render メソッド外での文字列 ref の使用

これは通常、オーナーを持たない(つまり、他のコンポーネントの render メソッド内で作成されなかった)コンポーネントへ ref を追加しようとしているということです。例えば、以下はうまく動作しません。

// Doesn't work!
ReactDOM.render(<App ref="app" />, el);

この ref を保持する新しいトップレベルのコンポーネントの中で当該のコンポーネントをレンダーしてみてください。あるいは、コールバック ref を使えるかもしれません。

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

このようなアプローチを採用する前に、本当に ref が必要かどうかを検討してください。

React の複数のコピー

Bower は依存関係の重複を上手く排除しますが、npm はそうではありません。ref に対して特別なことを何もしていないなら、原因は ref ではなく、複数の React のコピーがプロジェクトにロードされているからである可能性が高いでしょう。サードパーティ製のモジュールを npm 経由で追加した場合、依存ライブラリの重複したコピーがたまに問題を引き起こす可能性があります。

npm を使用している場合、npm lsnpm ls react の実行が、問題の原因を探す役に立つかもしれません。

Is this page useful?このページを編集する