当前位置: 首页 > 知识库问答 >
问题:

Proptype类型组件的子元素不工作

隆康平
2023-03-14

我试图用类型输入将proptype转换为一个特定的组件类,但这给了我一个警告。

警告:失败的道具类型:提供给MyComponent的道具无效。

MyComponent.js

    import React, { Component, cloneElement } from 'react';
    import Input from '../Input';

    class MyComponent extends Component {
      static propTypes = {
        children: PropTypes.oneOfType([
          PropTypes.shape({
            type: PropTypes.oneOf([Input]),
          }),
          PropTypes.arrayOf(
            PropTypes.shape({
              type: PropTypes.oneOf([Input]),
            })
          ),
        ]).isRequired,
      }

      renderChildren(child) {
        const clone = cloneElement(child, {newProp: 'blaaa'});
        return <div className='inner'>{clone}</div>;
      }

      render() {
        const { children } = this.props;
        return (
          <div>
            {React.Children.map(children, this.renderChildren)}
          </div>
        );
      }
    }

export default MyComponent;

我的输入组件被剥离了。

import React, { Fragment } from 'react';

const Input = ({name}) => (
    <Fragment>
      <input
      />
    </Fragment>
);

export default Input;

子系统上的控制台日志为:

$$typeof: Symbol(react.element)
key: null
props: {id: "email", placeholder: "email", type: "tel", name: "Email", styles: Array(1), …}
ref: null
type: ƒ Input(_ref)
_owner: FiberNode {tag: 1, key: "inputname", type: ƒ, stateNode: null, return: FiberNode, …}
_self: null
__proto__: Object

共有1个答案

郎诚
2023-03-14

这假设您的MyComponent在接收一个或多个ReactInput时是一致的。

工作示例:https://codesandbox.io/s/045kw2pq30

组件/非输入。js

import React, { Fragment } from "react";
import PropTypes from "prop-types";

const NonInput = props => (
  <code>
    <pre>{JSON.stringify(props, null, 4)}</pre>
  </code>
);

NonInput.propTypes = {
  props: PropTypes.objectOf(PropTypes.string)
};

export default NonInput;

组件/Input.js

import React, { Fragment } from "react";
import PropTypes from "prop-types";

const Input = ({ newProp, ...props }) => (
  <Fragment>
    {console.log(newProp)}
    <input className="uk-input" {...props} />
  </Fragment>
);

Input.propTypes = {
  newProp: PropTypes.string,
  props: PropTypes.objectOf(PropTypes.string)
};

export default Input;

组件/MyComponent。js

import React, { PureComponent, cloneElement } from "react";
import PropTypes from "prop-types";
import Input from "./Input";

const shapeOfChildren = PropTypes.shape({
  type: PropTypes.oneOf([Input]).isRequired,
  props: PropTypes.shape({
    name: PropTypes.string.isRequired,
    type: PropTypes.string.isRequired,
    placeholder: PropTypes.string.isRequired
  }).isRequired
});

class MyComponent extends PureComponent {
  renderChildren = child => (
    <div className="inner">{cloneElement(child, { newProp: "blaaa" })}</div>
  );

  render = () => (
    <div className="uk-form-large">
      {React.Children.map(this.props.children, this.renderChildren)}
    </div>
  );
}

MyComponent.propTypes = {
  children: PropTypes.oneOfType([
    shapeOfChildren,
    PropTypes.arrayOf(shapeOfChildren)
  ]).isRequired
};

export default MyComponent;

组件/Example.js(删除NonInput,保存,然后刷新页面以删除PropType警告-如果您希望它显示更明确的警告,请编写自定义验证器函数(底部的示例))

import React from "react";
import MyComponent from "./MyComponent";
import Input from "./Input";
import NonInput from "./NonInput";

export default () => (
  <MyComponent>
    <Input name="firstName" type="text" placeholder="First Name" />
    <Input name="lastName" type="text" placeholder="Last Name" />
    <NonInput name="lastName" type="text" placeholder="Last Name" />
  </MyComponent>
);
 类似资料:
  • 问题内容: 我想设置不在标签内的元素的样式。 什么是实现此目标的最佳方法? 似乎根本不起作用,至少在Chrome上不起作用,即使看起来应该如此 我也无法从控制台运行它。 我还有其他可用于CSS的方法吗? 问题答案: 不支持组合器选择器。 如果我们在谈论它的直接父: 否则,无法在CSS中执行此操作。您必须重写它:

  • 我正在创建一个组件,我希望元素类型是可配置的。 所以容器元素可以是上面的defaultProps中的元素,也可以是组件。 我不能得到的验证,我已经尝试了这个: 但它不能正确验证。 提供给的值的prop无效,

  • in HTML and XML documents, when you expand abbreviations, all abbreviation parts are transformed on-the-fly into HTML/XML tags. But certain elements like a or img are transformed into elements with pr

  • 你好,我正在使用JAXB将XML解锁到JAVA,我的xml文档中有一个元素“值”,可以是int类型,也可以是双精度型,并且我的java类中此元素的相应属性是数字类型的“值”。 JAXB不支持“数字”类型的umarshaling,我想,有人知道如何处理这个问题吗?一个例子将会得到真正的赞赏。提前谢谢。

  • 我有这样一个功能组件:

  • 问题内容: 我正在尝试通过将元素作为的子元素来更改元素的背景颜色,但我似乎无法使其正常工作,我尝试了使用不同元素的多种变体,但似乎没有任何效果 如果我不尝试定位元素,这将更改背景颜色 我怎样才能针对中的 元素? 问题答案: 我可以假设您的代码无法正常工作,因为&:nth-​​child(2)意味着您选择的是ImgGrid,它本身就是第二个孩子。尝试将ImgCell指定为nth- child(2):