#reactjs #react-hooks #jsx #react-component
#reactjs #реагирующие крючки #jsx #реагирующий компонент
Вопрос:
Я получаю сообщение об ошибке с моим компонентом «TypeError: не удается прочитать свойство ‘length’ из неопределенного» из моего компонента в моем приложении react «. react app». Что я делаю не так?
import React, { useState } from 'react';
import ReactDOM from 'react-dom';
function RandomName(props) {
const [name, newName] = useState(0);
const { names } = props;
return (
<div>
<h2>{name}</h2>
<button onClick={() => newName(names[Math.floor(Math.random()*names.length)])}>
New Name
</button>
</div>
);
}
ReactDOM.render(
<RandomName names={['Paul', 'David', 'Kevin']} />,
document.getElementById('root')
);
export default RandomName
Комментарии:
1. «Что я делаю не так?» Вы буквально опубликовали ответ на свой собственный вопрос перед вопросом: «Не удается прочитать свойство ‘length’ неопределенного».
names
естьundefined
.2.
names
это число. Вы не можете найти его длину
Ответ №1:
Вы можете сначала сгенерировать массив, а затем использовать faker для добавления в него поддельных имен.
const a = new Array(50).fill(null)
.map(e =>
e = faker.fake("{{name.lastName}}, {{name.firstName}}"))
Ответ №2:
Ваш приведенный выше код кажется правильным, но вместо 0 вы можете передать «. Но из репозитория Github я заметил, что вы не передаете имена в App.js .
<Switch>
<Route path="/">
<>
<RandomName names={['Paul', 'David', 'Kevin']} />
</>
</Route>
</Switch>
Ответ №3:
У вас есть 3 способа
используйте typescript для проверки типа данных реквизитов
function RandomName({names=[]}:{names:Array<string>}){...}
используйте приведенный ниже код для проверки PropTypes
import PropTypes from 'prop-types';
.
.
.
RandomName .propTypes = {
names: PropTypes.arrayOf(PropTypes.string)
}
и используйте приведенный ниже код для определения функции
function RandomName({names=[],...restprops}){...}
Ответ №4:
Я смог заставить компонент работать следующим образом — спасибо всем за вашу помощь:
import React, { useState } from 'react';
импорт ‘./index.css’
const names=[‘Марк’, ‘Стив’, ‘Том’]
function -() { const [name, newName] = useState(‘Bob’);
return (
<div id="RandomName-container">
<h2>{name}</h2>
<button onClick={() => newName(names[Math.floor(Math.random()*names.length)])}>
New Name
</button>
</div>
);
}
экспортировать по умолчанию RandomName