Erreur étrange de réaction lors de l'utilisation d'un composant avec le nom Array
J'ai deux composants React simples:
// Array.js
import React from 'react'
import PropTypes from 'prop-types'
const factor = 10
const Array = ({array}) =>
<div className="array">
{array.map(v => v * factor)
.map((h, i) => <Column key={i}
height={h}/>)}
</div>
const Column = ({height}) =>
<div className="column" style={{height: `${height}px`}}/>
Array.propTypes = {
array: PropTypes.array.isRequired
}
export default Array
et
// ArraySort.js
import React from 'react'
import Array from 'src/components/Array'
const array = [2, 4, 6, 7, 10, 7, 6, 1]
class ArraySort extends React.Component {
state = {array}
render() {
const {array} = this.state
console.log('array', array)
return <div className="array-sort">
<Array array={array}/>
</div>
}
}
export default ArraySort
Étrangement, lorsque j'essaye de rendre, ArraySort
j'obtiens une erreur:
Array.js:7 Uncaught TypeError: Cannot read property 'map' of undefined
at Array (Array.js:7)
at new ArraySort (bundle.js:35363)
at constructClassInstance (react-dom.development.js:9760)
at updateClassComponent (react-dom.development.js:10215)
at beginWork (react-dom.development.js:10605)
at performUnitOfWork (react-dom.development.js:12573)
at workLoop (react-dom.development.js:12682)
at HTMLUnknownElement.callCallback (react-dom.development.js:1299)
at Object.invokeGuardedCallbackDev (react-dom.development.js:1338)
at invokeGuardedCallback (react-dom.development.js:1195)
Array @ Array.js:7
ArraySort @ bundle.js:35363
constructClassInstance @ react-dom.development.js:9760
updateClassComponent @ react-dom.development.js:10215
beginWork @ react-dom.development.js:10605
performUnitOfWork @ react-dom.development.js:12573
workLoop @ react-dom.development.js:12682
callCallback @ react-dom.development.js:1299
invokeGuardedCallbackDev @ react-dom.development.js:1338
invokeGuardedCallback @ react-dom.development.js:1195
performWork @ react-dom.development.js:12800
scheduleUpdateImpl @ react-dom.development.js:13185
scheduleUpdate @ react-dom.development.js:13124
scheduleTopLevelUpdate @ react-dom.development.js:13395
updateContainer @ react-dom.development.js:13425
(anonymous) @ react-dom.development.js:17105
unbatchedUpdates @ react-dom.development.js:13256
renderSubtreeIntoContainer @ react-dom.development.js:17104
render @ react-dom.development.js:17129
(anonymous) @ index.js:17
__webpack_require__ @ bootstrap d8c366268449b6de2a48:19
(anonymous) @ bundle.js:2545
__webpack_require__ @ bootstrap d8c366268449b6de2a48:19
(anonymous) @ bootstrap d8c366268449b6de2a48:62
(anonymous) @ bootstrap d8c366268449b6de2a48:62
react-dom.development.js:8305 The above error occurred in the <ArraySort> component:
in ArraySort
in div
in Router (created by BrowserRouter)
in BrowserRouter
Consider adding an error boundary to your tree to customize error handling behavior.
You can learn more about error boundaries at -----.
logCapturedError$1 @ react-dom.development.js:8305
captureError @ react-dom.development.js:12993
performWork @ react-dom.development.js:12825
scheduleUpdateImpl @ react-dom.development.js:13185
scheduleUpdate @ react-dom.development.js:13124
scheduleTopLevelUpdate @ react-dom.development.js:13395
updateContainer @ react-dom.development.js:13425
(anonymous) @ react-dom.development.js:17105
unbatchedUpdates @ react-dom.development.js:13256
renderSubtreeIntoContainer @ react-dom.development.js:17104
render @ react-dom.development.js:17129
(anonymous) @ index.js:17
__webpack_require__ @ bootstrap d8c366268449b6de2a48:19
(anonymous) @ bundle.js:2545
__webpack_require__ @ bootstrap d8c366268449b6de2a48:19
(anonymous) @ bootstrap d8c366268449b6de2a48:62
(anonymous) @ bootstrap d8c366268449b6de2a48:62
Array.js:7 Uncaught TypeError: Cannot read property 'map' of undefined
at Array (Array.js:7)
at new ArraySort (bundle.js:35363)
at constructClassInstance (react-dom.development.js:9760)
at updateClassComponent (react-dom.development.js:10215)
at beginWork (react-dom.development.js:10605)
at performUnitOfWork (react-dom.development.js:12573)
at workLoop (react-dom.development.js:12682)
at HTMLUnknownElement.callCallback (react-dom.development.js:1299)
at Object.invokeGuardedCallbackDev (react-dom.development.js:1338)
at invokeGuardedCallback (react-dom.development.js:1195)
Cela fonctionne si j'importe Array.js
sous un nom différent ie ArrayComponent
.
Les projets utilisent:
"dependencies": {
"babel-core": "^6.26.0",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"react": "^16.0.0",
"react-dom": "^16.0.0",
"react-router": "^4.2.0",
"react-router-dom": "^4.2.2"
},
"devDependencies": {
"babel-loader": "^7.1.2",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.24.1",
"css-loader": "^0.28.7",
"file-loader": "^1.1.5",
"html-webpack-plugin": "^2.30.1",
"node-sass": "^4.5.3",
"sass-loader": "^6.0.6",
"style-loader": "^0.19.0",
"webpack": "^3.8.1",
"webpack-dev-server": "^2.9.3"
}
Quelle pourrait en être la cause?
Array
Est un nom prédéfini dans la javascript
langue et son utilisation doit être évitée
Citation:
En plus des mots réservés ci-dessus, vous feriez mieux d'éviter les identificateurs suivants comme noms de variables JavaScript. Ce sont des noms prédéfinis d'objets, de méthodes ou de propriétés JavaScript dépendants de l'implémentation (et, sans doute, certains auraient dû être des mots réservés)
Je recommanderais également d'initier l'état dans le constructor
.
Modifier
comme suivi de votre commentaire
Pourquoi recommandez-vous d'initialiser l'état dans le constructeur?
Parce que cette méthode fait partie du React.Component
cycle de vie
Citation du DOCS :
Le constructeur est le bon endroit pour initialiser l'état. Pour ce faire, attribuez simplement un objet à this.