我在Reaction应用程序的自定义组件中遇到了一个条件呈现问题.我一直致力于创建一个用于条件呈现的定制组件,该组件仅在满足特定条件时呈现内容.以下是我到目前为止拥有的代码

import React from 'react';

function ConditionalRenderComponent({ condition, children }) {
  return (
    <div>
      {condition && children}
    </div>
  );
}

export default ConditionalRenderComponent;

在使用这个定制组件时,我注意到,即使在conditionfalse的情况下,也可以访问和执行通过childrenprops 传递的内容.这种行为不同于我在没有定制组件的情况下直接使用condition && <div></div>时的行为,当条件为false时,它正确地防止了内容被访问.

Here's how I'm using the custom component:

import React, { useState, useEffect } from 'react';
import ConditionalRenderComponent from './ConditionalRenderComponent';

function App() {
  const [userData, setUserData] = useState(null);
  const isLoggedIn = userData !== null;

  useEffect(() => {
    setTimeout(() => {
      setUserData({
        username: 'john_doe',
        email: 'john@example.com'
      });
    }, 1000);
  }, []);

  return (
    <div>
      <h1>Welcome to My App</h1>
      <ConditionalRenderComponent condition={isLoggedIn}>
        <div>
          <p>Hello, {userData.username}!</p>
          <p>Your email: {userData.email}</p>
        </div>
      </ConditionalRenderComponent>
      {!isLoggedIn && <p>Please log in to access user data.</p>}
    </div>
  );
}

export default App;

在上面的示例中,userData最初是null,后来填充了从服务器检索的数据.isLoggedIn条件取决于是否填充了userData.

然而,即使isLoggedIn条件为false(在获取数据之前),ConditionalRenderComponent内的内容仍试图访问和显示userData.这会导致错误消息:"TypeError:Cannot Read Property of NULL(Reading‘Username’)".

Comparison with standard conditional rendering:

以下是使用标准condition && <div></div>方法的行为比较:

// Standard conditional rendering
{isLoggedIn && (
  <div>
    <p>Hello, {userData.username}!</p>
    <p>Your email: {userData.email}</p>
  </div>
)}

如上面的代码所示,当条件为false时,使用标准方法可以正确地防止访问userData个值.

我不确定为什么在使用带有childrenprops 的自定义组件时会出现这种行为差异.我试着调试和寻找解决方案,但一直未能找到明确的答案.

我真的很感激任何关于为什么会发生这种行为的见解或建议,以及我如何修改自定义组件以使用childrenprops 实现预期的条件呈现行为.

提前感谢您的帮助!

推荐答案

我不建议为条件呈现创建组件,但如果您想要这样做,您可以使用呈现属性模式,以便只有在条件为真时才调用该函数.这样可以防止立即对表达式求值.

function If({ condition, render }) {
  if (!condition) return null;

  return render();
}

export default function App() {
  const [state, setState] = useState(null);

  useEffect(() => {
    wait(1000).then(() => {
      setState({ hello: "world" });
    });
  }, []);

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>

      <If condition={Boolean(state)} render={() => <p>{state.hello}</p>} />
    </div>
  );
}

Edit snowy-framework-pv2ptp

Javascript相关问答推荐

zoom svg以适应圆

无法在nextjs应用程序中通过id从mongoDB删除'

PrivateRoute不是路由组件错误

如何从隐藏/显示中删除其中一个点击?

JS—删除对象数组中对象的子对象

material UI按钮组样式props 不反射

单个HTML中的多个HTML文件

DOM不自动更新,尽管运行倒计时TS,JS

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

回溯替代方式

AJAX POST在控制器中返回空(ASP.NET MVC)

try 将Redux工具包与MUI ToggleButtonGroup组件一起使用时出错

使用线性插值法旋转直线以查看鼠标会导致 skip

ReferenceError:无法在初始化之前访问setData

我们是否可以在reactjs中创建多个同名的路由

Firebase函数中的FireStore WHERE子句无法执行

如何处理不带参数的redux thunk payloadCreator回调函数?

MAT-TREE更多文本边框对齐问题

使用onClick单击子元素时,使用交点观察器的关键帧动画意外运行

如何使用Angular JS双击按钮