#reactjs #react-hooks #react-state #react-error-boundary
#reactjs #реагирующие хуки #реагирующее состояние #реакция-ошибка-граница
Вопрос:
Компонент PostList когда я добавляю createcommonent, я получаю слишком много ошибок повторного рендеринга. React ограничивает количество рендеров, чтобы предотвратить бесконечный цикл.
import React,{useState,useEffect} from 'react';
import axios from 'axios'
import './PostList.css'
import CommentCreate from './CommentCreate';
const PostList = () => {
const [ptitle,setPtitle]=useState({});
const fetchPost = async ()=> {
const res=await axios.get('http://localhost:8000/posts')
setPtitle(res.data)
}
useEffect(() => {
fetchPost()
}, [])
const renderedPost = Object.values(ptitle).map((post) => {
return (
<div
className="card"
style={{ width: "30%", marginBottom: "20px" }}
key={post.id}
>
<div className="card-body">
<h3>{post.title}</h3>
<CommentCreate postId={post.id} />
</div>
</div>
);
});
return (
<div>
<h1>Post List</h1>
{renderedPost}
</div>
);
}
export default PostList;
Компонент createComment
это компонент, который предоставляет возможность добавить границу ошибки в ваше дерево, чтобы настроить поведение обработки ошибок.
import React,{useState} from 'react';
import axios from 'axios'
import './CommentCreate.css'
const CommentCreate = ({postId}) => {
const [comment, setComment]=useState('')
const createComment = async (e) =>{
e.preventDefault();
await axios.post(`http://localhost:9000/post/${postId}/comment`, {
comment,
});
}
setComment('')
return (
<div>
<input value={comment} onChange={e =>{
setComment(e.target.value)
}} placeholder="Create a Comment here" />
<button class="btn btn-primary" onClick={createComment}>
Comment
</button>
</div>
);
}
export default CommentCreate;
```
Комментарии:
1. Опубликуйте свой
CommentCreate
компонент. Проблемы лежат там, я не вижу проблем вPostList
компоненте.2. привет @PrateekThapa, я добавил компонент createComment, не могли бы вы сказать мне, что происходит не так или какова основная логика этой ошибки, я здесь борюсь
Ответ №1:
ПРОБЛЕМА
Вы createComment
обновляетесь родительским и setComment
вызывается, что вызывает повторный рендеринг снова setComment
. Таким образом, бесконечный повторный рендеринг.
РЕШЕНИЕ
Поместите свой setComment
внутри createComment
функции.
const createComment = async (e) =>{
e.preventDefault();
await axios.post(`http://localhost:9000/post/${postId}/comment`, {
comment,
});
setComment('')
}
Ответ №2:
Вы устанавливаете состояние глобально setComment('')
. Рассмотрите возможность использования useEffect
, если вы хотите установить состояние только при монтировании компонента. Используйте приведенные ниже фрагменты:
useEffect(() => setComment(''), []);
Глобальная настройка состояния приведет к повторному рендерингу компонента, и снова при повторном рендеринге будет вызван setComment(«), эта процедура выполняется бесконечно, и вы получите ошибку бесконечного цикла, которой вы являетесь. Поэтому мое предложение никогда не устанавливать состояние без использования useEffect или без выполнения какого-либо конкретного условия.