当前位置: 首页 > 面试题库 >

使用this.refs的弃用警告

邢曦
2023-03-14
问题内容

我有一个React组件,我想在单击时切换一个CSS类。

所以我有这个:

export class myComponent extends React.Component {
  constructor() {
    super();
    this.state = { clicked: false };
    this.handleClick = this.handleClick.bind(this);
  }

  render() {
    return (
      <div>
        <div onClick={this.clicked}><span ref="btn" className="glyphicon">&nbsp;</span></div>
      </div>
    );
  }

  handleClick() {
    this.refs.btn.classList.toggle('active');
  }

  componentDidMount() {
    this.refs.btn.addEventListener('click', this.handleClick);
    this.setState({
      clicked: this.state.clicked = true,
    });
  }

  componentWillUnmount() {
    this.refs.btn.removeEventListener('click', this.handleClick);
    this.setState({
      clicked: this.state.clicked = false,
    });
  }
}

这个问题是ESLint不断告诉我“ this.refs”已贬值。

我该怎么办?我如何解决它而不使用折旧的代码


问题答案:

您要引用的Lint规则称为 no-string-refs, 并通过以下方式警告您:

"Using string literals in ref attributes is deprecated (react/no-string-refs)"

之所以收到此警告,是因为已实现了不赞成使用的使用方式refs(通过使用字符串)。根据您的React版本,您可以执行以下操作:

React 16.3及更高版本

constructor() {
  super();
  this.btnRef= React.createRef();
  this.state = { clicked: false };
  this.handleClick = this.handleClick.bind(this);
}

render() {
  return (
    <div>
      <div onClick={this.addVote}><span ref={this.btnRef} className="glyphicon">&nbsp;</span></div>
    </div>
  );
}

React 16.2及更早版本

constructor() {
  super();
  this.btnRef;  //not necessary to declare the variable here, but I like to make it more visible.
  this.state = { clicked: false };
  this.handleClick = this.handleClick.bind(this);
}

render() {
  return (
    <div>
      <div onClick={this.addVote}><span ref={(el) => this.btnRef = el} className="glyphicon">&nbsp;</span></div>
    </div>
  );
}

为了获得更好的可读性,您还可以执行以下操作:

render() {
  let myRef = (el) => this.btnRef = el;
  return (
    <div>
      <div onClick={this.addVote}><span ref={myRef} className="glyphicon">&nbsp;</span></div>
    </div>
  );
}

看一下官方文档中关于 Refs和DOM的内容 ,特别是本节内容:

旧版API:字符串引用

如果您之前使用过React,那么您可能会熟悉一个较旧的API,该API的ref属性是一个字符串,例如
"textInput",并且DOM节点的访问方式是this.refs.textInput。我们建议不要这样做,因为字符串引用存在一些问题,被认为是旧问题,并且
很可能会在将来的发行版中删除 。如果您当前正在使用this.refs.textInput访问引用,则建议使用回调模式。



 类似资料:
  • 我看到了许多在API上使用弃用注释的示例,以便将它们标记为“需要尽快更换”。 然而,在几乎所有这些情况下,代码开发人员不仅继续使用弃用的API,而且还抑制了弃用警告。 API开发人员的最佳意图似乎最终会创建更多与已实现的业务逻辑无关的代码——如果API已弃用但不断使用并抑制相关警告,则看起来充其量是代码的退化,并且在最坏的情况下替换弃用的库时是潜在的应用程序断点IMHO。 这个问题有没有切实可行的

  • 问题内容: 我刚刚更新到Django v1.8,并在更新项目之前测试了本地设置,并且发出了弃用警告,这是我从未见过的,对我也没有任何意义。我可能只是忽略了某些内容或误解了文档。 现在,这对我提出了3个问题。 根据文档,Options.app_label除非模型不在应用程序模块之外,否则不是必需的,在我看来,不是这样。其次,无论如何,此行为在1.7中已被弃用,那么为什么它甚至成为问题? 这些应用程序

  • 我不明白gradle为什么不建造?我使用的是Android Studio,Gradle 1.12。 建筑格拉德尔 当我将gradle与project同步时,它会发出警告: 信息:Gradle tasks[:app:generateDebugSources]警告:按需配置是一项酝酿中的功能。警告:依赖打包来定义主工件的扩展已被弃用,并计划在Gradle 2.0中删除警告:测试。testReportD

  • 我的项目正在迁移到视图绑定,但与此同时,在查看构建日志时,此警告会分散注意力 警告:“kotlin android extensions”Gradle插件已弃用。请使用本迁移指南(https://goo.gle/kotlin-android-extensions-deprecation)开始使用视图绑定的步骤(https://developer.android.com/topic/librarie

  • 问题内容: 有人知道如何避免以下代码的下一个警告吗? 问题答案: 如消息所示,请改用命名参数。

  • 我刚刚更新到rails 4.0.2,我收到了这个警告: [已弃用]我18n.enforce_available_locales将来会默认为true。如果您真的想跳过区域设置的验证,您可以设置I18n.enforce_available_locales=false以避免此消息。 将其设置为false是否存在任何安全问题?