当前位置: 首页 > 知识库问答 >
问题:

更新状态数组,同时避免在React中重新渲染

房冥夜
2023-03-14

我正在用反应原生构建一个项目。我有一个动态的玩家列表,我希望用户能够编辑。

const [players, setPlayers] = useState(['']);

function addPlayer() {
  setPlayers([...players, '']);
}

...

<List>
  { players.map(player => (
    <MyInput ...>
  )}
</List>

我想实现的是:

  1. 用户输入名称
  2. 用户按enter键
  3. 我们称之为addPlayer,它添加一个播放器
  4. 新的输入出现并得到关注(通过其他功能)

我得到的是:

    < li >用户输入姓名 < li >用户按enter键 < li >我们调用addPlayer来添加播放器 < li >键盘开始关闭一会儿,然后在新输入出现时重新打开。

我已经在输入中将blurOnSubmit设置为false。在我看来,所发生的是列表被重新呈现,导致键盘自行消失。然后,当setPlayers完成执行时(它是异步的),focus函数被调用

useEffect(() => {
  if (lastRef.current) {
    lastRef.current.focus();
  }
}, [players]);

阻止列表重新呈现以使键盘可以始终保持打开状态的最佳方法是什么?谢谢!

共有1个答案

子车超英
2023-03-14

最后,我作弊了,我添加了一个输入,它就在列表的外面。我可以控制它是否显示,它的内容,以及它与其他状态变量的颜色。这样,当一个播放器被添加时,列表会重新呈现,但不会影响我的输入,我的键盘也不会移动。从用户的视点来看,它看起来和以前完全一样,就好像他直接在列表中编辑项目一样。

 类似资料:
  • 我正在学习如何应对,我整天都在试图找到解决问题的办法,但都没有成功。然后决定在这里提出我的第一个问题。 我有子组件,包括React-Datepicker组件和单独的“第二天”和“前一天”按钮来更改选定的日期。 SelectedDate存储在父组件的状态中。 我试图从子组件更新父组件的状态,当状态更新时,子组件应该重新呈现,因为该状态作为道具传递给同一个子组件。 我已设法从child更改父状态,但子

  • 问题内容: 我正在尝试仅更新数组状态中的一个元素,但不确定如何执行此操作。 State 设定状态 如果我想更改标记的第四个元素中的键,该怎么做? 谢谢 问题答案: 重要的一点是,我们不应该直接更改状态数组,而要始终在新数组中进行更改,然后使用setState更新状态值。 如 Doc 建议: 切勿直接更改this.state,将this.state视为不可变。 更新状态数组的基本流程是: 1- 首先

  • 我有一个基于url的react组件,它应该导入一些数据,然后在另一个子组件中显示。当页面首次加载时,它将初始数据作为组件状态加载到中。至于进一步的url更改,它们将在export default class Info()中处理。组成部分{ 我的问题是,尽管switch语句中有状态更新,但组件不会重新渲染。我不知道我的方法有什么问题。有人能帮我吗?谢谢 编辑:这是使用而不是的代码:

  • 我正在学习React钩子,这意味着我将不得不从类转移到函数组件。以前,在类中,我可以拥有与状态无关的类变量,我可以在不重新呈现组件的情况下更新这些变量。现在我试图用钩子重新创建一个组件作为函数组件,我遇到了这样一个问题:我不能(就我所知)为该函数创建变量,因此存储数据的唯一方法是通过钩子。然而,这意味着每当该状态更新时,我的组件将重新呈现。 我已经在下面的示例中说明了这一点,我试图将类组件重新创建

  • 我有一个带有两组按钮(功能和目标)的界面。当我点击一个按钮时,我希望它从一个团队转到另一个团队。我正在用react和redux实现这一点。我唯一的问题是,当状态更新并且我成功地记录了更新的状态时,除非我使用forceUpdate(),否则组件不会更新。我不明白的是,既然状态更新成功,组件不应该自动重新渲染吗? 一些js 正如您所看到的,当我单击一个按钮时,我触发updateLists函数,该函数将

  • 问题内容: 我正在尝试将表示性组件与容器组件分开。我有一个和一个。容器负责触发redux操作,以根据当前用户获取适当的网站。 问题是在最初呈现容器组件之后,异步获取了当前用户。这意味着容器组件不知道它需要重新执行其函数中的代码,该代码将更新数据以发送到。我认为我需要在其props(user)之一更改时重新渲染容器组件。如何正确执行此操作? 问题答案: 您必须在方法中添加条件。 该示例用于比较对象。