首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >set状态不更新状态

set状态不更新状态
EN

Stack Overflow用户
提问于 2019-07-13 13:12:36
回答 4查看 125关注 0票数 0

我试图在我的反应应用程序中使用状态钩子。

但是下面的setTodos似乎没有更新todos

链接到我的工作:https://kutt.it/oE2jPJ链接到github:https://github.com/who-know-cg/Todo-react

代码语言:javascript
复制
import React, { useState } from "react";

import Main from "./component/Main";

const Application = () => {
  const [todos, setTodos] = useState([]);

  // add todo to state(todos)
  const addTodos = message => {
    const newTodos = todos.concat(message);
    setTodos(newTodos);
  };

  return (
    <>
      <Main
        addTodos={message => addTodos(message)}
      />
    </>
  );
};

export default Application;

在我的main.js里

代码语言:javascript
复制
const Main = props => {
  const input = createRef();
  return (
    <>
      <input type="text" ref={input} />
      <button
        onClick={() => {
          props.addTodo(input.current.value);
          input.current.value = "";
        }}
      >
        Add message to state
      </button>
    </>
  );
};

我希望每次按下按钮时,都会执行setTodos()getTodos(),并将消息添加到todos数组中。

但事实证明,状态并没有改变。(仍然保留在默认的空白数组中)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-07-13 13:35:56

如果要更新父组件的状态,则应将函数从父组件传递给子组件。

这里是一个非常简单的例子,如何从子组件(主)更新状态。

在子组件按钮的帮助下,您可以更新父(应用程序)组件的状态。

代码语言:javascript
复制
const Application = () => {
  const [todos, setTodos] = useState([]);

  const addTodo = message => {
    let todosUpdated = [...todos, message];
    setTodos(todosUpdated);
  };
  return (
    <>
      <Main addTodo={addTodo} />
      <pre>{JSON.stringify(todos, null, 2)}</pre>
    </>
  );
};

const Main = props => {
  const input = createRef();
  return (
    <>
      <input type="text" ref={input} />
      <button
        onClick={() => {
          props.addTodo(input.current.value);
          input.current.value = "";
        }}
      >
        Add message to state
      </button>
    </>
  );
};

演示在这里:https://codesandbox.io/s/silent-cache-9y7dl

票数 0
EN

Stack Overflow用户

发布于 2019-07-13 13:15:46

您不需要在Main中将消息作为参数传递,只需传递函数的名称。

代码语言:javascript
复制
<Main addTodos={addTodos} />
票数 0
EN

Stack Overflow用户

发布于 2019-07-13 14:12:20

在Application.jsx中:

您可以在这里传递一个对addTodos的引用。左边的名字可以是你想要的。

代码语言:javascript
复制
  <Main addTodos={addTodos} />

在Main.jsx中:

因为getTodo返回一个承诺,所以该承诺决定的任何内容都将是您所期望的消息。

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

https://stackoverflow.com/questions/57019502

复制
相关文章

相似问题

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