Обработка комментариев React JS

#reactjs

#reactjs

Вопрос:

В моем коде я пытаюсь отображать многопоточные комментарии с ответами. В настоящее время я могу отображать комментарии к сообщению (рецепту), и он отображается с помощью кнопки ответа. Однако в моем поле ввода ответа это позволит мне вводить только одну букву каждый раз, когда я нажимаю в поле ввода. Например, я введу «i», затем мне придется снова нажать на ввод, чтобы ввести другую букву, чтобы сохранить оба состояния в виде одной строки. Кроме того, когда я отправляю ответ, моя выборка не выполняется, и я не получаю никаких ошибок на моем интерфейсе или серверной части.

Любая помощь приветствуется. Вот мой код для моего поточного комментария / ответа. вот данные, которые я использую для справки.

  "comments": [
    {
      "id": 1,
      "content": "This is so great!",
      "recipe_id": 1,
      "commentable_id": 1,
      "commentable_type": "Recipe",
      "user_id": 1,
      "created_at": "2020-09-08T00:16:55.296Z",
      "updated_at": "2020-09-08T00:16:55.296Z"
    },
    {
      "id": 2,
      "content": "This is another one",
      "recipe_id": 1,
      "commentable_id": 1,
      "commentable_type": "Comment",
      "user_id": 1,
      "created_at": "2020-09-08T00:16:55.323Z",
      "updated_at": "2020-09-08T00:16:55.323Z"
    },
    {
      "id": 3,
      "content": "This is another one",
      "recipe_id": 1,
      "commentable_id": 2,
      "commentable_type": "Comment",
      "user_id": 1,
      "created_at": "2020-09-08T00:16:55.332Z",
      "updated_at": "2020-09-08T00:16:55.332Z"
    },
  
 function RecipeCard() {

const [reply, setReply] = useState("")

const getComments = () => {
  fetch(`http://localhost:3000/recipes/${id}/comments`)
  .then(res => res.json())
  .then(data => setComments(data.comments))

  }  
  useEffect(() => {
    
    getComments()
   },[])

const handleSubmit = (e) => {
  e.preventDefault()
  fetch(`http://localhost:3000/recipes/${id}/comments`,{
    method: "POST",
    headers: {
      "Content-type": "application/json",
      "Authorization": `bearer ${token}`
      },
      body: JSON.stringify({
        content: search,
        recipe_id: id,
        commentable_id: id,
        commentable_type: "Recipe",
        user_id: userId
      })
  })
  .then(res => res.json())
  .then(data => console.log(data))

}



const updateReply = (e) => {
  setReply(e.target.value)
  console.log(e.target.value)
}

const handleReply = (id) => e => {
  e.preventDefault()
  console.log(id)
  fetch(`http://localhost:3000/recipes/${id}/comments`,{
    method: "POST",
    headers: {
      "Content-type": "application/json",
      "Authorization": `bearer ${token}`
      },
      body: JSON.stringify({
        content: reply,
        recipe_id: id,
        commentable_id: id,
        commentable_type: "Comment",
        user_id: userId
      })
  })
  .then(res => res.json())
  .then(data => console.log(data))

}


   const CommentBox = ({ comment, allComments }) => {
    const children = allComments.filter(
      (c) => c.commentable_type === "Comment" amp;amp; c.commentable_id === comment.id
    );
  
    return (
      <li>
        {comment.content}
        {children ? <CommentBoxes comments={children} allComments={allComments} /> : null}
        <input type="text" value={reply} onChange={updateReply}></input> <button onSubmit={() => handleReply(comment.id)}>Reply</button>
      </li>
      
    );
  };

  
  const CommentBoxes = ({ comments, allComments }) => (
    <ul>
      {comments.map((c) => (
        
        <CommentBox comment={c} allComments={allComments} key={c.id}/>
        
      ))}
     
    </ul>
    
  );
  
  const App = () => {
    const rootComments = comments.filter((c) => c.commentable_type === "Recipe");
    return <CommentBoxes comments={rootComments} allComments={comments} />;
  };

return (
<div>
   <form onSubmit={handleSubmit}>
        <textarea value={search} onChange={updateSearch} style={{width:"100%"}} placeholder="Comments"></textarea>
          <button type="submit" >Comment</button>
        </form>
      </div>
      <App/>
</div>
  

Комментарии:

1. Правильно ли я понимаю, что все ваши компоненты (например, CommentBox ) вложены внутри RecipeCard функции? Если это так, это приведет к сбою системы компонентов React. Переместите другие компоненты на уровень модуля.

2. @AKX да, это так. Перемещая компоненты на уровень модуля, вы имеете в виду создание отдельного файла функционального компонента в моем каталоге для комментария, полей комментариев и приложения?

3. Нет, достаточно просто переместить их из функции на верхний уровень, где находится сама RecipeCard.