#reactjs
#reactjs
Вопрос:
Содержимое ошибки выглядит следующим образом: Объекты недопустимы как дочерние элементы React (найдено: объект с ключами {}). Если вы хотели отобразить коллекцию дочерних элементов, вместо этого используйте массив.
Посмотрите react-dom.development.js
"Objects are not valid as a React child
(found: " (Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' Object.keys(newChild).join(', ') '}' : newChild) ").
If you meant to render a collection of children, use an array instead."
// This is my code
import React, { Component } from "react";
class ResponseCheck extends Component {
state = {
state: "waiting",
message: "Click and Start.",
result: [],
};
timeout;
startTime;
endTime;
onClickScreen = () => {
const { state } = this.state;
if (state === "waiting") {
timeout.current = setTimeout(() => {
this.setState({
state: "now",
message: "Click now",
});
this.startTime = new Date();
}, Math.floor(Math.random() * 1000) 2000); // 2초~3초 랜덤
this.setState({
state: "ready",
message: "Click when it turns green.",
});
} else if (state === "ready") {
// 성급하게 클릭
clearTimeout(this.timeout);
this.setState({
state: "waiting",
message: "Too hasty.",
});
} else if (state === "now") {
// 반응속도 체크
endTime.current = new Date();
this.setState((prevState) => {
return {
state: "waiting",
message: "Click and Start.",
result: [...prevState.result, this.endTime, this.startTime],
};
});
}
};
onReset = () => {
this.setState({
result: [],
});
};
renderAverage = () => {
const { result } = this.state;
return result.length === 0 ? null : (
<>
<div>Average Time: {result.reduce((a, c) => a c) / result.length}ms</div>
<button onClick={this.onReset}>Reset</button>
</>
);
};
render() {
const { state, message } = this.state;
return (
<>
<div id="screen" className={state} onClick={this.onClickScreen}>
{message}
</div>
{this.renderAverage()}
</>
);
}
}
export default ResponseCheck;
В чем проблема? Пожалуйста, помогите…
Я не смог решить эту проблему
Полный код ошибки приведен ниже. Я добавил всю ошибку в код
«Посмотрите react-dom.development.js ‘ Приведенная выше часть совпадает с номером в этой строке
react-dom.development.js:13231
react-dom.development.js:13231 Uncaught Error: Objects are not valid as a React child (found: object with keys {}). If you meant to render a collection of children, use an array instead.
at throwOnInvalidObjectType (react-dom.development.js:13231)
at reconcileChildFibers (react-dom.development.js:14133)
at reconcileChildren (react-dom.development.js:16990)
at mountIndeterminateComponent (react-dom.development.js:17890)
at beginWork (react-dom.development.js:19049)
at HTMLUnknownElement.callCallback (react-dom.development.js:3945)
at Object.invokeGuardedCallbackDev (react-dom.development.js:3994)
at invokeGuardedCallback (react-dom.development.js:4056)
at beginWork$1 (react-dom.development.js:23959)
at performUnitOfWork (react-dom.development.js:22771)
Комментарии:
1. Можете ли вы поделиться фактическим текстом ответа на ошибку дословно? Конечно, есть трассировка стека, которая подскажет вам, с чего начать поиск, номер строки?
2. Добавлен полный код ошибки
Ответ №1:
Скопируйте / вставьте ваш фрагмент кода в рабочий, работающий codesandbox, и я не могу повторить вашу ошибку. Единственным массивом в этом компоненте является state.result
, и поскольку вы его уменьшаете, я не думаю, что он должен вызывать предупреждение «render», как вы видите.
Похоже, что вы пытаетесь использовать ref react для таймеров, в вашем фрагменте вы ссылаетесь на a timer.current
, но это не ссылка, и так и должно быть this.timer
.
- Следует ссылаться
timer
на asthis.timer
, удалить.current
. - Следует ссылаться
endTime
на asthis.endTime
, удалить.current
. - Введите в
result
массив значениеthis.endTime - this.startTime
, чтобы вычислить среднее значение.
Код
class ResponseCheck extends Component {
state = {
state: "waiting",
message: "Click and Start.",
result: []
};
timeout;
startTime;
endTime;
onClickScreen = () => {
const { state } = this.state;
if (state === "waiting") {
this.timeout = setTimeout(() => { // <-- this.timeout
this.setState({
state: "now",
message: "Click now"
});
this.startTime = new Date();
}, Math.floor(Math.random() * 1000) 2000); // 2초~3초 랜덤
this.setState({
state: "ready",
message: "Click when it turns green."
});
} else if (state === "ready") {
// 성급하게 클릭
clearTimeout(this.timeout);
this.setState({
state: "waiting",
message: "Too hasty."
});
} else if (state === "now") {
// 반응속도 체크
this.endTime = new Date(); // <-- this.endTime
this.setState((prevState) => {
return {
state: "waiting",
message: "Click and Start.",
result: [...prevState.result, this.endTime - this.startTime] // <-- correct time value
};
});
}
};
onReset = () => {
this.setState({
result: []
});
};
renderAverage = () => {
const { result } = this.state;
return result.length === 0 ? null : (
<>
<div>
Average Time: {result.reduce((a, c) => a c) / result.length}ms
</div>
<button onClick={this.onReset}>Reset</button>
</>
);
};
render() {
const { state, message } = this.state;
return (
<>
<div id="screen" className={state} onClick={this.onClickScreen}>
{message}
</div>
{this.renderAverage()}
</>
);
}
}
Комментарии:
1. Тем не менее, я не выхожу из той же ошибки «Ошибка: объекты недопустимы как дочерний элемент React (найдено: объект с ключами {}). Если вы хотели отобразить коллекцию дочерних элементов, вместо этого используйте массив. »
2. @eeezkim Какой код, который вы запускаете, работает иначе, чем код, которым вы поделились в своем фрагменте, или тот, который я добавил в свое решение, в котором нет этой ошибки?
3. github.com/eunjin0212/React-WebGame/tree/master/ResponseCheck Эта ссылка — мой полный код, пожалуйста, проверьте, верен ли он
4. @eeezkim Я вижу, что ваш репозиторий имеет тот же код, что и мое решение. Что вы используете для запуска своего кода? Я не видел
start
скрипта в вашем файле package.json. Вы использовали create-react-app? Похоже, вы запускаетеapp.js
изdist
каталога, был ли этот артефакт сборки обновлен с новыми изменениями? ( должно быть, он был обновлен 21 минуту назад ). Можете ли вы попробовать создать свою собственную песочницу и протестировать свой код?5. Нет, я не использовал create-react-app. Я установил babel и webpack. Удалите его и повторите попытку.