gpt4 book ai didi

javascript - react 备忘录没有得到 Prop

转载 作者:行者123 更新时间:2023-12-04 02:08:31 25 4
gpt4 key购买 nike

React 备忘录没有捕获 Prop ,prevProps也不是 nextProps并且组件渲染良好。 react 文档说

  • 如果你的函数组件在给定相同的 props 的情况下呈现相同的结果,你可以将它包装在对 React.memo 的调用中以提高性能。

  • 我的问题是使用 react 备忘录停止两次渲染,但备忘录似乎不起作用,并且组件使用相同的 Prop 渲染两次。

    组件在 Create New Event 时呈现点击 /events
    here is the live sandbox .
  • 子组件位于 /components/Event/CreateEvent/CreateEvent.js
  • 父组件位于 /Pages/Event/Event.js行号999 ' 从哪里触发子组件

  • 这是代码:
    import React from "react";
    import AuthContext from "../../context/global-context";
    import CreateEvent from "../../components/Event/CreateEvent/CreateEvent";

    function Events({ location }) {

    // Sate Managing
    const [allEvents, setAllEvents] = React.useState([]);
    const [creating, setCreating] = React.useState(false);

    // Context As State
    const { token, email } = React.useContext(AuthContext);

    // Creating Event Showing
    const modelBoxHandler = () => {
    // works on when the ViewEvent is open
    if (eventSelected) {
    setEventSelected(null);
    return;
    }

    setCreating(!creating);
    };

    return (
    <div className="events">

    {/* New Event Creating */}
    {creating && (
    <CreateEvent onHidder={modelBoxHandler} allEvents={allEvents} />
    )}

    {console.log("Event Rendered.js =>")}

    </div>
    );
    }

    export default React.memo(Events, () => true);

    矩形备忘录没有 Prop 的子组件:
    import React from "react";
    import AuthContext from "../../../context/global-context";

    function CreateEvent({ onHidder, allEvents }) {
    // Context
    const { token } = React.useContext(AuthContext);

    console.log("CreatedEvent.js REnder");
    return (
    ... Some code here
    );
    }

    export default React.memo(CreateEvent, (prevProps, nextProps) => {
    console.log("Hello", prevProps, nextProps);
    });

    提前感谢您的宝贵答案和时间!

    最佳答案

    问题是基于 creating变量你实际上是重新安装而不渲染 CreateEvent 组件。这意味着如果创建变量更改,则组件在创建为真时被卸载并重新安装,因此它不是重新渲染

    您还必须注意 modelBoxHandler函数引用也会在每次重新渲染时发生变化,因此即使您的 CreateEvent 组件处于渲染状态并且父级由于某种原因重新渲染,CreateEvent 组件也将重新渲染

    您需要进行 2 项更改才能使其更好地工作

  • 使用 useCallback 钩子(Hook)定义 modelBoxHandler
  • 在 createEvent 中根据创建属性
  • 进行条件渲染

    // Creating Event Showing
    const modelBoxHandler = useCallback(() => {
    // works on when the ViewEvent is open
    if (eventSelected) {
    setEventSelected(null);
    return;
    }

    setCreating(prevCreating => !prevCreating);
    }, [eventSelected]);
    ...
    return (
    <div className="events">

    {/* New Event Creating */}
    <CreateEvent creating={creating} onHidder={modelBoxHandler} allEvents={allEvents} />

    {console.log("Event Rendered.js =>")}

    </div>
    );


    并在 createEvent
    function CreateEvent({ onHidder, allEvents, creating }) {
    // Context
    const { token } = React.useContext(AuthContext);

    console.log("CreatedEvent.js REnder");
    if(!creating) {
    return null;
    }
    return (
    ... Some code here
    );
    }

    export default React.memo(CreateEvent);

    关于javascript - react 备忘录没有得到 Prop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62275813/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com