【问题标题】:Unable to use data from chlid component to parent component?无法使用从子组件到父组件的数据?
【发布时间】:2019-11-11 17:38:13
【问题描述】:

我制作了这个反应应用程序,其中有一个父组件为App.js,它具有三个子组件。第一个子组件的某些状态正在被父组件中的其他两个子组件更改。

所以首先我在父组件中传递状态,然后将它们作为道具传递给其他两个子组件。这是我的一段代码。

这是我的App.js

function App() {
  var firstvalueoftextarea,
    setfirstvalueoftextarea,
    secondvalueoftextarea,
    setsecondvalueoftextarea;

  var PanelOfResult = function(
    firstvalueoftextarea,
    setfirstvalueoftextarea,
    secondvalueoftextarea,
    setsecondvalueoftextarea
  ) {
    firstvalueoftextarea = firstvalueoftextarea;
    setfirstvalueoftextarea = setfirstvalueoftextarea;
    secondvalueoftextarea = secondvalueoftextarea;
    setsecondvalueoftextarea = setsecondvalueoftextarea;
  };

  return (
    console.log("Rendering of component"),
    (
      <div className="App">
        <ResultPanel PanelOfResult={PanelOfResult} />

        <SecondChildComponent
          valueoftextarea={firstvalueoftextarea}
          setvalueoftextarea={setfirstvalueoftextarea}
        />
        <ThirdChildComponent
          className="Symbols"
          firstvalueoftextarea={firstvalueoftextarea}
          setfirstvalueoftextarea={setfirstvalueoftextarea}
          secondvalueoftextarea={secondvalueoftextarea}
          setsecondvalueoftextarea={setsecondvalueoftextarea}
        />
      </div>
    )
  );
}

export default App;

这是我的ResultPanel.js

import React from "react";

function ResultPanel(props) {
  const [firstvalueoftextarea, setfirstvalueoftextarea] = React.useState(
    "Hello World"
  );
  const [secondvalueoftextarea, setsecondvalueoftextarea] = React.useState("");

  props.PanelOfResult(
    firstvalueoftextarea,
    setfirstvalueoftextarea,
    secondvalueoftextarea,
    setsecondvalueoftextarea
  );

  return (
    <div>
      <h1>{firstvalueoftextarea}</h1>
    </div>
  );
}

export default ResultPanel;

ResultPanel 组件的状态可以通过 SecondChildComponent 和 ThirdChildComponent 更改,并且这些组件代码工作正常。

当 SecondChildComponent 尝试更改 ResultPanel 的状态时,我收到错误 - TypeError: this.props.setvalueoftextarea is not a function

谁能帮我解决我的错误?我不确定在 ResultPanel 组件中哪里调用 PanelOfResult 回调方法。

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    这里有很多问题,最大的问题之一是如何为状态设置变量。

    首先,将您的状态声明移至父组件,然后删除您的 var。整个PanelOfResult 是不必要的,是一种糟糕的做事模式。

    function App() {
      const [firstvalueoftextarea, setfirstvalueoftextarea] = React.useState(
        "Hello World"
      );
      const [secondvalueoftextarea, setsecondvalueoftextarea] = React.useState("");
    

    然后,不是传递回调,而是传递所需的值:

    <ResultPanel firstvalueoftextarea={firstvalueoftextarea} />
    

    这将停止您关于不是函数的错误,并消除对回调的需要。

    一般情况下,您应该尽量不要使用var,而是使用letconst

    另外,尝试更好地命名变量。驼峰式大小写或下划线都会使您的代码更具可读性。

    【讨论】:

    • 好的,感谢您的回复。但首先是我的初始代码完全相同并且运行良好。我将 ResulPanel 作为单独的 Comp 移动的原因。是在更改状态时,整个 App 正在重新渲染自身,最终将重新渲染第二个和第三个 Comp。不必要的,我不想要。我通过在 componentShouldUpdate 方法中返回 false 来防止第二个和第三个组件重新渲染。但是,当我只想重新渲染其中的一部分时,当整个应用程序组件重新渲染时该怎么办(这就是为什么制作单独的 Comp.)?欢迎提出建议
    • 我不知道其他两个子组件的密集程度如何,但除非他们做了很多,否则重新渲染似乎可以忽略不计。但除此之外,所有三个子组件都在使用该状态,因此当它发生变化时,它们需要重新渲染,无论状态保存在哪里,因为它们的 props 会发生变化。
    猜你喜欢
    • 2021-02-22
    • 2017-07-28
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多