reactjs - proptypes - react/forbid-prop-types
ReactJs: ¿Cuáles deberían ser los PropTypes para this.props.children? (6)
Las respuestas aquí no parecen abarcar la verificación exacta de los niños.
node
y
object
son demasiado permisivos, quería verificar el elemento exacto.
Esto es lo que terminé usando:
-
Use
oneOfType([])
para permitir un solo o conjunto de hijos -
Utilice
shape
yarrayOf(shape({}))
para elementos individuales y conjuntos de elementosarrayOf(shape({}))
, respectivamente -
Use
oneOf
para el elemento secundario en sí
Al final, algo como esto:
import PropTypes from ''prop-types''
import MyComponent from ''./MyComponent''
children: PropTypes.oneOfType([
PropTypes.shape({
type: PropTypes.oneOf([MyComponent]),
}),
PropTypes.arrayOf(
PropTypes.shape({
type: PropTypes.oneOf([MyComponent]),
})
),
]).isRequired
Este problema me ayudó a resolver esto más claramente: https://github.com/facebook/react/issues/2979
Dado un componente simple que representa a sus hijos:
class ContainerComponent extends Component {
static propTypes = {
children: PropTypes.object.isRequired,
}
render() {
return (
<div>
{this.props.children}
</div>
);
}
}
export default ContainerComponent;
Pregunta: ¿Cuál debería ser el propType del prop de los niños?
Cuando lo configuro como un objeto, falla cuando uso el componente con varios hijos:
<ContainerComponent>
<div>1</div>
<div>2</div>
</ContainerComponent>
Advertencia: Tipo de utilería fallido:
children
de utilería no válidos de tipoarray
suministrados aContainerComponent
,object
esperado.
Si lo configuro como una matriz, fallará si le doy solo un hijo, es decir:
<ContainerComponent>
<div>1</div>
</ContainerComponent>
Advertencia: Tipo de utilería fallido: hijos de utilería no válidos del tipo de objeto suministrado a ContainerComponent, matriz esperada.
Por favor avise, ¿no debería molestarme en hacer una verificación de propTypes para elementos secundarios?
Para mí depende del componente. Si sabe con qué necesita que se rellene, debe intentar especificar exclusivamente o varios tipos utilizando:
PropTypes.oneOfType
Sin embargo, encuentro que, con componentes más genéricos que pueden tener muchos tipos de hijos, estoy feliz de usar:
PropTypes.any
Si desea hacer referencia a un componente Reaccionar, entonces estará buscando
PropTypes.element
A pesar de que,
PropTypes.node
describe todo lo que se puede representar: cadenas, números, elementos o una matriz de estas cosas. Si esto te conviene, este es el camino.
Pruebe algo como esto utilizando
oneOfType
o
PropTypes.node
import PropTypes from ''prop-types''
...
static propTypes = {
children: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.node),
PropTypes.node
]).isRequired
}
o
static propTypes = {
children: PropTypes.node.isRequired,
}
Pruebe un propTypes personalizado:
const childrenPropTypeLogic = (props, propName, componentName) => {
const prop = props[propName];
return React.Children
.toArray(prop)
.find(child => child.type !== ''div'') && new Error(`${componentName} only accepts "div" elements`);
};
static propTypes = {
children : childrenPropTypeLogic
}
const {Component, PropTypes} = React;
const childrenPropTypeLogic = (props, propName, componentName) => {
var error;
var prop = props[propName];
React.Children.forEach(prop, function (child) {
if (child.type !== ''div'') {
error = new Error(
''`'' + componentName + ''` only accepts children of type `div`.''
);
}
});
return error;
};
class ContainerComponent extends Component {
static propTypes = {
children: childrenPropTypeLogic,
}
render() {
return (
<div>
{this.props.children}
</div>
);
}
}
class App extends Component {
render(){
return (
<ContainerComponent>
<div>1</div>
<div>2</div>
</ContainerComponent>
)
}
}
ReactDOM.render(<App /> , document.querySelector(''section''))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<section />
Si desea hacer coincidir exactamente un tipo de componente, marque esto
MenuPrimary.propTypes = {
children: PropTypes.oneOfType([
PropTypes.arrayOf(MenuPrimaryItem),
PropTypes.objectOf(MenuPrimaryItem)
])
}
Si desea hacer coincidir exactamente algunos tipos de componentes, marque esto
const HeaderTypes = [
PropTypes.objectOf(MenuPrimary),
PropTypes.objectOf(UserInfo)
]
Header.propTypes = {
children: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.oneOfType([...HeaderTypes])),
...HeaderTypes
])
}
La documentación de PropTypes tiene lo siguiente
// Anything that can be rendered: numbers, strings, elements or an array
// (or fragment) containing these types.
optionalNode: PropTypes.node,
Por lo tanto, puede usar
PropTypes.node
para buscar objetos o matrices de objetos
static propTypes = {
children: PropTypes.node.isRequired,
}