在严格模式树中找到了字符串引用“grid”

IT技术 javascript reactjs
2021-05-14 12:52:12

我在控制台中面临警告:

警告:在严格模式树中发现了字符串引用“grid”。字符串引用是潜在错误的来源,应该避免。我们建议改用 useRef() 或 createRef()。

这是我的代码行:

  render() {
    return (
      <div className="notes-app"> 
        <h2 className="app-header">NotesApp</h2> 
        <NoteSearch onSearch={text => this.handleSearch(text)} />
        <NoteEditor onNoteAdd={this.handleNoteAdd} />
        <NotesGrid
          notes={this.state.filteredNotes}
          onNoteDelete={this.handleNoteDelete}
        />
      </div>
    );
  }

字符串引用警告

代码编辑器的片段显示了警告指向的行 代码

NotesGrid 组件如下:

import Masonry from "masonry-layout";

import React from 'react';
import Note from "./Note";
export default class NotesGrid extends React.Component {
    componentDidMount() {
      var grid = this.refs.grid;
      this.msnry = new Masonry(grid, {
        itemSelector: ".note",
        columnWidth: 200,
        gutter: 10,
        isFitWidth: true
      });
    }

    componentDidUpdate(prevProps) {
      if (this.props.notes.length !== prevProps.notes.length) {
        this.msnry.reloadItems();
        this.msnry.layout();
      }
    }

    render() {
      var onNoteDelete = this.props.onNoteDelete;

      return (
        <div className="notes-grid" ref="grid"> //here I Have used the ref
          {this.props.notes.map(function(note) {
            return (
              <Note
                key={note.id}
                onDelete={onNoteDelete.bind(null, note)}
                color={note.color}
              >
                {note.text}
              </Note>
            );
          })}
        </div>
      );
    }
  }

解决它的最佳选择是什么?

2个回答

重写 NotesGrid 如下

import Masonry from "masonry-layout";
import React from 'react';

import Note from "./Note";

export default class NotesGrid extends React.Component {
  constructor(props) {
    super(props);
    this.gridRef = React.createRef();
  }

  componentDidMount() {
    this.msnry = new Masonry(this.gridRef.current, {
      itemSelector: ".note",
      columnWidth: 200,
      gutter: 10,
      isFitWidth: true
    });
  }

  componentDidUpdate(prevProps) {
    if (this.props.notes.length !== prevProps.notes.length) {
      this.msnry.reloadItems();
      this.msnry.layout();
    }
  }

  render() {
    var onNoteDelete = this.props.onNoteDelete;

    return (
      <div className="notes-grid" ref={this.gridRef}>
        {this.props.notes.map((note) => (
          <Note
            key={note.id}
            onDelete={onNoteDelete.bind(null, note)}
            color={note.color}
          >
            {note.text}
          </Note>
        ))}
      </div>
    );
  }
}

问题在于组件NotesGrid检查组件是否使用了'ref'。如果 ref 在该组件中使用。使用 React.createRef()(如果它是一个类组件)或使用 useRef(如果它是一个功能组件)创建ref