繁体   English   中英

react.js React.UseEffect 仅在页面加载时呈现一次,但在 prop 更改时不呈现

[英]react.js React.UseEffect only rendered once upon page load but not when prop changes

每次道具更改时,我都试图更新我的组件:

export default function ChatMessages(props) {
  const [chatRooms, setChatRooms] = React.useState([]);
  React.useEffect(() => {
    (async () => {
      var x = await GetMessages(props.statePassDown);
      console.log(x);
      setChatRooms(x);
    })();
  }, []);

  return (
    <div class="mainChatView">
      <div>{props.statePassDown}</div>
      {chatRooms.map((chatRoom, index) => {
        return (
          <ul>
            <li key={index}>
              <table>
                <tr>
                  <td>
                    chatID: {chatRoom.chatID}
                    <br></br>
                    message: {chatRoom.message}
                  </td>
                </tr>
              </table>
            </li>
          </ul>
        );
      })}
    </div>
  );
}

但不幸的是,这段代码只被调用过一次。 我可以看到道具通过这个 div 发生变化:

<div>{props.statePassDown}</div>

每次在另一个组件内按下按钮时,都会重新渲染此行,但整个映射功能不是。

如何更改我的代码以响应props.statePassDown的更改?

您明确地将效果设置为没有依赖项:

React.useEffect(()=>{
  // ...
}, []);  // <-- empty dependencies

这意味着它只会在组件安装时执行。 (如果不传递任何依赖数组,则效果在每次组件更新后执行。)

更改依赖项以在这些值更改时执行效果。

React.useEffect(()=>{
  // ...
}, [props.statePassDown]);
export default function ChatMessages(props) {

const [chatRooms, setChatRooms] = React.useState([]);
React.useEffect(()=>{
  (async () => {
      var x = await GetMessages(props.statePassDown)
      console.log(x)
      setChatRooms(x)
  })()
},[props.statePassDown])  // pass what you are trying to watch change 
...
// ... here in the dependency array

此外,关于 useEffect 钩子的一件好事是 useEffect 钩子内的 return 语句将在组件未卸载生命周期时触发。 前任。

useEffect(() => {
  // ... on component mount

  return () => {
    // ... component did unmount 
  }
}, [/* dependency array */]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM