如何在反应组件中找出支柱是否是节点?

问题描述 投票:0回答:2

我有一个React.Component有这些道具:

Test.propTypes = {
   ...
   ...
   example: PropTypes.oneOfType([PropTypes.node, PropTypes.object]),
};

我需要知道在render()方法中,example的类型是节点还是对象?

reactjs react-proptypes
2个回答
0
投票

查看代码,herePropTypes.node验证的以下内容:

  function isNode(propValue) {
    switch (typeof propValue) {
      case 'number':
      case 'string':
      case 'undefined':
        return true;
      case 'boolean':
        return !propValue;
      case 'object':
        if (Array.isArray(propValue)) {
          return propValue.every(isNode);
        }
        if (propValue === null || isValidElement(propValue)) {
          return true;
        }

        var iteratorFn = getIteratorFn(propValue);
        if (iteratorFn) {
          var iterator = iteratorFn.call(propValue);
          var step;
          if (iteratorFn !== propValue.entries) {
            while (!(step = iterator.next()).done) {
              if (!isNode(step.value)) {
                return false;
              }
            }
          } else {
            // Iterator will provide entry [k,v] tuples rather than values.
            while (!(step = iterator.next()).done) {
              var entry = step.value;
              if (entry) {
                if (!isNode(entry[1])) {
                  return false;
                }
              }
            }
          }
        } else {
          return false;
        }

        return true;
      default:
        return false;
    }
  }

React仅提供函数React.isValidElement(),因此您需要实现自己的检查以确定它是否是有效节点,或实现更具体的道具类型(即.[PropTypes.string, PropTypes.object]),并检查。


-1
投票

prop-types doesn't export any of such functions, but we may achieve by doing like below

Test.propTypes = {
   ...
   ...
   example: PropTypes.oneOfType([PropTypes.node, PropTypes.object]),
};

import React, { Component } from 'react';
class Test extends component 
{
    render() {
        const isNode = React.isValidElement(example) 
//isNode is false, we consider it as object
    }
}

React.isValidElement

© www.soinside.com 2019 - 2024. All rights reserved.