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

ReactJS无法使用event.persist()设置事件的状态

柯宜年
2023-03-14
问题内容

我需要设置一个从事件中获取的状态字段,但是当我将一个函数传递给它时,它不会被设置。组件和方法如下所示:

constructor(props: SomeProps, context: any) {
  super(props, context);
  this.state = {
    isFiltering: props.isFiltering,
    anchor: "",
  };
}

private toggleFilter = (event: any) => {
  event.persist()
  this.setState(prevState => ({
    isFiltering: !prevState.isFiltering,
    anchor: event.currentTarget // does not work, it's null
  }));
}

如果删除,event.persist()则会出现以下错误:

由于性能原因,此综合事件被重用。如果看到此消息,则说明正在currentTarget释放/无效化的合成事件上访问该方法。这是一项无操作功能。如果必须保留原始的合成事件,请使用event.persist()。有关更多信息,请参见https://facebook.github.io/react/docs/events.html#event-
pooling

由于某些原因,以下代码可以工作:

private toggleFilter = (event: any) => {
  this.setState({anchor:event.currentTarget}) // works fine
  this.setState(prevState => ({
    isFiltering: !prevState.isFiltering,
  }));
}

为什么以上方法有效,但在我使用时无效this.setState(prevState=> ...)


问题答案:

这是预期的行为 ,因为event.persist()这并不意味着currentTarget没有被取消,实际上应该是-与浏览器的本机实现兼容。

这意味着,如果要以异步方式访问currentTarget,则需要像在答案中一样将其缓存在变量中。

当事件冒泡时,currentTarget会发生变化–如果在接收事件的元素上有一个事件处理程序,而在其祖先上有其他事件处理程序,则它们将为currentTarget看到不同的值。IIRC消除它与本机事件发生的现象是一致的。如果没有,请告诉我,我们将在这里重新考虑我们的行为。

在官方的React仓库中查看讨论的源代码,以及Sophie提供的以下一些我感动的片段。

var savedEvent;

var savedTarget;



divb.addEventListener('click', function(e) {

  savedEvent = e;

  savedTarget = e.currentTarget;

  setTimeout(function() {

    console.log('b: currentTarget is now ' + e.currentTarget);

  }, 0);

}, false);



diva.addEventListener('click', function(e) {

  console.log('same event object? ' + (e === savedEvent));

  console.log('same target? ' + (savedTarget === e.currentTarget));

  setTimeout(function() {

    console.log('a: currentTarget is now ' + e.currentTarget);

  }, 0);

}, false);


div {

  padding: 50px;

  background: rgba(0,0,0,0.5);

  color: white;

}


<!DOCTYPE html>

<html>

<head>

  <meta charset="utf-8">

  <title>JS Bin</title>

</head>

<body>



  <div id="diva"><div id="divb"> Click me and see output! </div></div>



</body>

</html>


 类似资料:
  • 我已经开始学习ReactJS,有一个关于无状态和有状态组件的问题。一般来说,我遵循组件和容器的分离,如下所示。有状态函数在组件文件夹中,其他逻辑操作在容器文件夹下。文件夹结构 让我们思考材料UI下拉列表。 为了打开和关闭下拉菜单和方法更改打开状态,这意味着它是有状态组件。但没有其他变化(省略年龄设置)。它似乎是可重用的组件,但包括状态与非常简单的操作,如打开和关闭。我应该放入哪个文件夹?容器还是组

  • 是否有方法将defaultValue传递给状态?我也尝试了value={},但值根本不变。

  • 问题内容: 我有以下基于渲染下拉列表呈现用户的类。如果我选择“字母”,则将按字母顺序列出用户;当我选择“组”时,将按组顺序列出用户。 在组件中,我正在通过props.members中的函数设置组件状态对象。 当我选择“组”排序时,组件正在卸载并且正在DOM中安装。同样,当我切换回“字母”排序时,在组件中预先设置的状态变量(成员)将变为NULL,因为该组件已从DOM中删除。 重新渲染b’coz时道具

  • 问题内容: 我正在创建一个简单的聊天应用程序,在其中我通过axios对数据库进行api调用,该API返回了一系列消息对象。我可以在componentWillMount中进行axios调用时获取数据。然后,我试图设置状态以显示对话。这是代码: 我看过一些有关生命周期功能和设置状态的帖子,似乎我在做正确的事情。 再次强调,axios调用正常,设置状态不正常。我仍然看到一个空数组。提前致谢! 编辑:这是

  • 问题内容: 我有一个类似的反应成分 使用react-navigation我通常会通过说来应用导航选项 使用打字稿我得到了错误 我怎样才能解决这个问题? 我尝试编写一个界面 但是没有运气。 问题答案: 关键思想是为常量指定正确的类型。可能已经提供了该类型。但是,您也可以这样扩展内置接口:

  • 本文向大家介绍ReactJs设置css样式的方法,包括了ReactJs设置css样式的方法的使用技巧和注意事项,需要的朋友参考一下 前段时间看了React Native,但是感觉在安卓反面的开发并不成熟.有较多功能有待完善,而且自己在实际运用的过程中在一些模块上遇到了不晓得阻力,又苦于网上没有找到那么多资源.于是打算先放一段时间,还是回过头来看ReactJs吧. React颠覆了html的传统思维