如何在React中使用useState Hook调用Parent函数?

SPG*_*SPG 2 ecmascript-6 reactjs react-hooks

理想的结果是单击列表中的项目时显示字符串。

这是根组件。

const App = () => {
  const [click, setClick] = useState(null);
  const handleClick = name => {
    setClick(name);
  };
  return (
    <div>
      <Parent handleClick={handleClick} />
      {click && <p>{click} is clicked.</p>}
    </div>
  );
};
Run Code Online (Sandbox Code Playgroud)

和父级组件。

const Parent = ({ handleClick }) => (
  <div>
    <Child
      name="First Item"
      handleClick={handleClick("First Item is Clicked!")}
    />
    <Child
      name="Second Item"
      handleClick={handleClick("Second Item is Clicked!")}
    />
    <Child
      name="Third Item"
      handleClick={handleClick("Third Item is Clicked!")}
    />
  </div>
);
Run Code Online (Sandbox Code Playgroud)

和子组件。

const Child = ({ name, handleClick }) => <li onClick={handleClick}>{name}</li>;
Run Code Online (Sandbox Code Playgroud)

另外,代码沙箱链接

我只是想知道为什么点击永远不会改变结果。

Ori*_*ori 5

您正在调用该handleClick()函数,而不是将函数传递给子组件。使用内联箭头函数来包装调用。

注意:由于每当渲染父项时都会重新创建箭头函数,因此如果您有很多项目,或者由于其他原因不断渲染父项,这可能会导致性能问题。

const { useState } = React;

const App = () => {
  const [click, setClick] = useState(null);
  const handleClick = name => {
    setClick(name);
  };
  return (
    <div>
      <Parent handleClick={handleClick} />
      {click && <p>{click} is clicked.</p>}
    </div>
  );
};

const Parent = ({ handleClick }) => (
  <div>
    <Child
      name="First Item"
      handleClick={() => handleClick("First Item is Clicked!")}
    />
    <Child
      name="Second Item"
      handleClick={() => handleClick("Second Item is Clicked!")}
    />
    <Child
      name="Third Item"
      handleClick={() => handleClick("Third Item is Clicked!")}
    />
  </div>
);

const Child = ({ name, handleClick }) => <li onClick={handleClick}>{name}</li>;

ReactDOM.render(
  <App />,
  root
)
Run Code Online (Sandbox Code Playgroud)
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id="root"></div>
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是将函数和文本传递给子组件,并让它处理函数调用。在这种情况下,您可以使用以下命令记住该函数useCallback

const { useState, useCallback } = React;

const App = () => {
  const [click, setClick] = useState(null);
  const handleClick = name => {
    setClick(name);
  };
  return (
    <div>
      <Parent handleClick={handleClick} />
      {click && <p>{click} is clicked.</p>}
    </div>
  );
};

const Parent = ({ handleClick }) => (
  <div>
    <Child
      name="First Item"
      handleClick={handleClick} text="First Item is Clicked!"
    />
    <Child
      name="Second Item"
      handleClick={handleClick} text="Second Item is Clicked!"
    />
    <Child
      name="Third Item"
      handleClick={handleClick} text="Third Item is Clicked!"
    />
  </div>
);

const Child = ({ name, handleClick, text }) => {
  const handler = useCallback(() => handleClick(text), [handleClick, text]);
  
  return <li onClick={handler}>{name}</li>;
}

ReactDOM.render(
  <App />,
  root
)
Run Code Online (Sandbox Code Playgroud)
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id="root"></div>
Run Code Online (Sandbox Code Playgroud)


Shu*_*tri 5

问题是您没有将函数传递给handleClick父对象的评估值。您的代码必须是

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

const Parent = ({ handleClick }) => (
  <div>
    <Child
      name="First Item"
      handleClick={() => handleClick("First Item is Clicked!")}
    />
    <Child
      name="Second Item"
      handleClick={() => handleClick("Second Item is Clicked!")}
    />
    <Child
      name="Third Item"
      handleClick={() => handleClick("Third Item is Clicked!")}
    />
  </div>
);

export default Parent;
Run Code Online (Sandbox Code Playgroud)

工作演示