首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >索引为1的todos数组总是被更改,并且数组不会进一步移动- React-Typescript

索引为1的todos数组总是被更改,并且数组不会进一步移动- React-Typescript
EN

Stack Overflow用户
提问于 2021-03-21 20:47:41
回答 2查看 24关注 0票数 0

我正在使用typescript-react创建一个待办事项列表,但我的代码似乎无法工作。

App.tsx:

代码语言:javascript
复制
import { useState } from "react";
import "./App.css";

export default function App() {
  let id = 0;
  const [todoInput, setTodoInput] = useState("");

  let todos: string[] = ["Arbit"];

  const handleSubmit = (e: any) => {
    e.preventDefault();
    todos.push(todoInput);
    console.log(todos)
    setTodoInput("");
    id += 1;
    // console.log(todos);
    // console.log(todos[id])
    // console.log(e.target[0].value);
    // todos.push(e.target[0].value);
    // console.log(e)
  };
  return (
    <div className='App'>
      <form onSubmit={handleSubmit}>
        <input
          type='text'
          value={todoInput}
          onChange={(e) => setTodoInput(e.target.value)}
        />
        <button>Submit</button>
      </form>

      <ul>
        {todos.map((todo) => (
          <li key={id}>{todo}</li>
        ))}
      </ul>
    </div>
  );
}

待办事项数组不会推送todoInput。相反,它省略了todos1。我在一个文件中创建我的应用程序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-21 21:16:45

在react函数中,您必须使用钩子,以便在重新呈现时保留状态。在这种情况下,您需要将todos数组转换为const [todos, setTodos] = React.useState(),并使用setTodos函数以函数式方式更新它。

代码语言:javascript
复制
  const [todos, setTodos] = React.useState([]);
  // also use useState for ids
  const [id, setId] = React.useState(0);
  const handleSubmit = (e: any) => {
    e.preventDefault();
    setTodos([...todos, todoInput]);
    console.log(todos)
    setTodoInput("");
    setId(id + 1);
  };
票数 0
EN

Stack Overflow用户

发布于 2021-03-21 20:52:50

我不确定,但我认为您也需要将数组设置为状态:

代码语言:javascript
复制
import { useState } from "react";
import "./App.css";

export default function App() {
  let id = 0;
  const [todoInput, setTodoInput] = useState("");

  const [todos, setTodos] = useState(["Arbit"]);

  const handleSubmit = (e: any) => {
    e.preventDefault();
    todos.push(todoInput);
    console.log(todos)
    setTodoInput("");
    setTodos(todos);
    id += 1;
    // console.log(todos);
    // console.log(todos[id])
    // console.log(e.target[0].value);
    // todos.push(e.target[0].value);
    // console.log(e)
  };
  return (
    <div className='App'>
      <form onSubmit={handleSubmit}>
        <input
          type='text'
          value={todoInput}
          onChange={(e) => setTodoInput(e.target.value)}
        />
        <button>Submit</button>
      </form>

      <ul>
        {todos.map((todo) => (
          <li key={id}>{todo}</li>
        ))}
      </ul>
    </div>
  );
}

如果它不起作用,我很抱歉。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66732460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档