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

UseState不保存用户输入[重复]

公良云
2023-03-14

我正在使用useState处理一个待办事项,我试图保存用户输入,然后在他们点击提交后将其推送到listArray,稍后显示它...我认为我在updateArray函数中做错了什么,但我似乎可以理解什么。

import React, { useState } from "react";

function App() {
  const listArray = [""];

  const [list, updateList] = useState("");

  function handleChange(event) {
    const { name, value } = event.target;

    updateList(value);
    //console.log(list);
  }
  
  function updateArray() {
    console.log(list);

    listArray.push(list);
    console.log(listArray);
  }

  return (
    <div className="container">
      <div className="heading">
        <h1>To-Do List</h1>
      </div>
      <div className="form">
        <input name="entry" onChange={handleChange} type="text" />
        <button>
          <span onSubmit={updateArray}>Add</span>
        </button>
      </div>
      <div>
        <ul>
          <li>{listArray[0]}</li>
        </ul>
      </div>
    </div>
  );
}

export default App;

共有3个答案

羊新翰
2023-03-14

listary在每次重新加载时都会被清除。您应该将数据存储在状态中。所以

const[listArray, setListArray]=useState([])

updateArray应该如下所示:

function updateArray() {
    setListArray([...listArray, list]);
}

我想,在updateArray函数中应该有一些逻辑来清除列表

林昱
2023-03-14

将当前值保存到状态中,并将列表保持在状态中,以便在每个渲染周期中不会清除该列表。

import React, { useState } from "react";

function App() {
  const [list, updateList] = useState([]);
  const [currentValue, setCurrentValue] = useState()

  function handleChange(event) {
    setCurrentValue(event.target.value)
  }

  function handleClick() {
    updateList([...list, currentValue])
  }

  return (
    <div className="container">
      <div className="heading">
        <h1>To-Do List</h1>
      </div>
      <div className="form">
        <input name="entry" onChange={handleChange} type="text" />
        <button type="button" onClick={handleClick}>
          <span>Add</span>
        </button>
      </div>
      <div>
        <ul>
          {list.map((res) => (
            <li key={res}>{res}</li>
          ))}
        </ul>
      </div>
    </div>
  );
}

export default App;

此外,将onClick移动到按钮在语义上(甚至对于用户体验)更有意义,但这取决于您。

夏侯俊美
2023-03-14

您当前的代码有几个问题,我将简要描述并提供解决方案来解决这些问题。

  1. 您的函数运行良好,并且符合预期,但是在React应用程序中,很少有方法可以重新呈现页面或组件,并且更改局部变量不是其中之一。因此,您需要使用本地状态而不是本地listArray变量。既然已经有一种状态,你应该定义另一种状态,或者把你的当前状态作为一个对象,把你的组件相关状态放在一个地方,我将采用第二种方法,因为它更优雅、更干净。
const [state, setState] = useState({ list: [], input: "" });
setState((prev) => ({ ...prev, input: value })); // immediate return "({})" of an object with iterating through the previous values "...prev" and updating input "input: value"

注意:您可以在此处阅读有关扩展运算符()的更多信息。

因此,您的句柄updateArray函数如下所示:

function handleChange(event) {
  const { value } = event.target;
  setState((prev) => ({ ...prev, input: value }));
}

function updateArray() {
  setState((prev) => ({ ...prev, list: [...state.list, state.input] }));
}
<button onClick={updateArray}> <!-- It's better to assign onclick action to an element with a function or arrow function to prevent it from running in the first render "(event) => updateArray(event)" -->
  <span>Add</span> 
</button>
<ul>
  {state.list.map((item, index) => (
      <li key={index}>{item}</li>
  ))}
</ul>

工作演示:

 类似资料:
  • 问题内容: 我正在尝试找出如何创建输入验证的方法,在该方法中,您不能两次输入相同的数字,而且不能在数字范围内输入,除非它是整数,否则无法输入任何内容。我目前正在创建彩票程序,不确定如何执行此操作。任何帮助将非常感激。我的数字范围验证有效,而其他两个验证无效。我尝试了非重复号码验证,但我不确定如何执行仅数字验证。有人可以告诉我如何构建此结构。 此方法在我的Player类中 问题答案: 如下进行: 运

  • 下面是我正在编写的代码。基本上我需要一个盒子来打开,让用户在相应的文本字段中输入数据。一切都很好。当我从actionPerformed方法打印它时,一切都输出正确,但是当我从main调用gui.displayPersonInfo方法时,它将所有的值显示为null。在盒子打开之前,它首先执行displayPersonInfo方法,尽管我在之后调用了该方法。有人知道我的代码有什么问题吗?(输出如下)

  • 我正在尝试创建一个文字游戏,它可以对一个单词进行加密,并根据用户输入的内容将字符移位一定的数字,解密加密,并检查该单词是否为回文。问题是我不知道如何保持输入,所以在我加密或检查它是否为回文后,程序结束,因此我无法解密加密的内容。 例如,如果用户输入单词“hello”并选择加密该单词,密钥为3,则应显示“khoor”。然后,我希望能够通过将“khor”解密回“hello”来继续,但程序结束。 此外,

  • 让我明确一点--我试图使用Twilio STUDIO来实现这一点--而不是编码。我有一个完整的IVR构建和工作,但我不知道如何保存呼叫者输入的选择(DTMF)。是否有一个简单的插件或addon可以节省用户输入?

  • 这个问题我已经有一段时间了。我有3个inputEditTexts,要求用户输入他们的名字、姓氏和ID。我想把这些信息保存到googlefirestore中。我已经设置了所有依赖项,我知道我已经将其正确连接到googlefirebase。我发现的问题是,关于这个主题的每一个教程都是不同的,而且我所能找到的每个教程都不能100%发挥作用。有没有一种方法可以将这3个值保存到googlefirestore

  • 我正在使用Java的扫描仪读取用户输入。如果我只使用nextLine一次,它可以正常工作。对于两个nextLine,第一个不等待用户输入字符串(第二个)。 输出: X:Y:(等待输入) 我的代码 你知道为什么会发生这种事吗?谢谢