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

如何从子级到父级获取状态变量?

沈嘉瑞
2023-03-14

index.js

import React from "react";
import Button from "./Button/Button"

export default function Index() {

  return (
    <>
    <Button />
    <div>Value of flag in Index.js = {}</div>
    </>
  );
}

Button.js

import React, { useState } from "react";
import "./button.css";

export default function Button(props) {
  const [flag, setFlag] = useState(true);
  const clickHandler = () => {
      setFlag(!flag);   
  };

  return (
      <div className="btn" onClick={clickHandler}>
        Value of flag in Button.js = {flag.toString()}
      </div>
  );
}

我的问题是“如何从Button.js到index.js获取标志值”?(儿童对父母)。

共有3个答案

倪棋
2023-03-14

有两种类型的状态:

  1. 所有人的全球状态

对于初学者,你必须遵守一些政策,不要尝试滥用状态,否则你会有一些麻烦。

对于全局状态,可以使用Redux、dva或umijs。

对于私人国家,你似乎已经知道了。

阎建德
2023-03-14

你可以通过方法发送一个值,参考这个:

index.js

import React from "react";
import Button from "./Button/Button"

export default function Index() {

  let getFlagValue = (flag) => {
    //here you'll get a flag value
    console.log(flag)
  }

  return (
    <>
    <Button sendFlagValue=(getFlagValue)/>
    <div>Value of flag in Index.js = {}</div>
    </>
  );
}

Button.js

import React, { useState } from "react";
import "./button.css";

export default function Button(sendFlagValue) {
  const [flag, setFlag] = useState(true);
  const clickHandler = () => {
      setFlag(!flag);   
      sendFlagValue(flag)
  };

  return (
      <div className="btn" onClick={clickHandler}>
        Value of flag in Button.js = {flag.toString()}
      </div>
  );
}
丌官晨
2023-03-14

1)您可以在父组件中提升状态,并将状态和处理程序作为道具传递给子组件。

注意:这将起作用,因为您需要在JSX中使用标志,但是如果您将事件处理程序作为子组件中的道具传递,则必须调用处理程序以获取值。因此,要么解除状态,要么使用Redux

现场演示

一个pp.js

const App = () => {
    const [flag, setFlag] = useState( true );
    return (
        <>
            <Button flag={flag} setFlag={setFlag} />
            <div>Value of flag in Index.js = { flag.toString() }</div>
        </>
    );
};

Button.js

export default function Button({ flag, setFlag }) {
    
    const clickHandler = () => {
        setFlag(oldFlag => !oldFlag);
    };

    return (
        <div className="btn" onClick={clickHandler}>
            Value of flag in Button.js = {flag.toString()}
        </div>
    );
}

2) 您可以将处理程序作为道具传递到子组件中,如Harsh Patel答案所示

3) 您可以使用状态管理工具,即Redux。

 类似资料:
  • 我试图在父组件中显示子组件的状态,但不知何故,文本“abcde”仍然没有显示,这是示例代码 但不知怎么的,屏幕仍然是空的,“abcde”直到我点击两次,来自功能组件,所以我不知道发生了什么,请帮助,非常感谢

  • 问题内容: 我本质上是在尝试做出回应,但是有一些问题。 这是档案 当你点击按钮A,在RadioGroup中组件需要去选择按钮B 。 “选定”仅表示来自状态或属性的className 这里是: 的来源并不重要,它具有触发原始DOM 事件的常规HTML单选按钮 预期流量为: 点击按钮“ A” 按钮“ A”触发本地DOM事件onChange,该事件一直持续到RadioGroup 调用RadioGroup

  • 问题内容: 我用这个文章为例(做出反应的方式),但它不是为我工作。请指出我的错误,因为我不明白怎么了。 这是我看到的错误: 未捕获的TypeError:this.props.onClick不是函数 这是我的代码: 提前致谢! 问题答案: 问题在于回调内部不引用React组件,因此是。 您可以通过将第二个参数传递给来显式设置值: 现在,回调 内部 的值与回调 外部 (即实例)的值相同。 这与Reac

  • 问题内容: 使用onEnter重定向到状态时,如果新状态是当前状态的子级,则会发生无限循环。 例: 什么时候: 被调用后,状态被重新初始化,导致其被再次调用=无限循环。 但是,如果重定向状态为: 不会发生此问题。我假设父状态正在重新初始化,但是为什么呢? 为什么在子状态上调用父状态会被重新初始化? 那么,您将如何处理重定向到子状态? 问题答案: 1)为什么在子状态上调用.go时会重新初始化父状态?

  • 假设我有一个应用程序来处理一系列的书。 我的应用程序允许向库中添加新书。创建书籍时,用户可以在列表中选择作者,如果作者尚不存在,则可以将其添加到列表中,并在表单字段中提供其姓名。填写表单后,数据将发送到WS,类似 然后我将json映射到我的实体中 书: 作者 这不会像用户尝试添加新作者一样工作,当我尝试. sav()时,我会收到错误: 组织。冬眠TransientPropertyValueExce

  • 我正在尝试制作一个很好的ApiWrapper组件来填充各种子组件中的数据。从我读到的所有内容来看,这应该是可行的:https://jsfidle.net/vinniejames/m1mesp6z/1/ 但由于某种原因,当父状态更改时,子组件似乎没有更新。 我是不是漏了什么?