javascript - React 组件子项在渲染前检测是否为空/null

标签 javascript reactjs

“ react ”:“16.8.4”

你好,有人知道如何检查(功能)组件中是否存在子组件(在渲染它们之前)

React.Children.count
React.Children.toArray(children)

不会工作

children 是$$typeof: Symbol(react.element)

代码示例是

function ContextMenuItems(): JSX.Element | null {
   if (no-items) return null;  
   ...
}

class ContextMenu extends React.Component {
   public render(): JSX.Element | null {
      if (this.props.children === null) { //ContextMenuItems empty check
        return null;
       }
       return <ContextMenu>{this.props.children}</ContextMenu>
   }
}

如有任何帮助,感激不尽

最佳答案

解决方案一:

获取 child 类型。如果 Child 组件返回 null,它将返回 null:

const isChildNull = children => {
  return Boolean(children.type()=== null);
};

方案二:

使用 ReactDOMServer.renderToStaticMarkup .它将 jsx 元素转换为 string。如果 children 返回 null,则 renderToStaticMarkup 将返回一个空字符串:

import ReactDOMServer from 'react-dom/server';

const isChildNull = children => {
  return !Boolean(ReactDOMServer.renderToStaticMarkup(children));
};

用法:

const Child = () => {
  return null;
};
    
const Parent = ({ children }) => {
  const isNull = isChildNull(children);
  if (isNull) {
     return "render null";
  }
  return <div>{children}</div>;
};
    
export default function App() {
   return (
     <Parent>
        <Child />
     </Parent>
   );
}

Working example using solution 1

关于javascript - React 组件子项在渲染前检测是否为空/null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55303409/

相关文章:

javascript - 使用 Redux Toolkit 异步 REST API 模式时如何捕获 HTTP 4xx 错误?

javascript - socket.send 在 io.sockets.on() 之外

javascript - 异步/顺序 promise ,检测结束

reactjs - 使用 React Router 传递状态最简单的方法是什么?

javascript - 无法读取未定义的 React-Native Firebase React-native-fetch-blob 的属性 'DocumentDir'

reactjs - 在react js中触发更改或输入事件的最佳方式是什么

javascript - javascript中仅将字符串的一部分加粗

javascript - 没有边框的 iframe 并在弹出窗口中滚动

javascript - 在轮播循环中正确地添加元素

reactjs - React select 没有选择选项