Передайте значение от родительского к дочернему компоненту с помощью React

#reactjs

Вопрос:

Я пытаюсь отобразить рейтинг запроса в своем приложении React. Но я не уверен, что понимаю, как обращаться с государством.

Это мой компонент запроса:

 import React, { Component, useRef, useState, useEffect } from 'react';
import { render } from 'react-dom';
import InputSearchLandlord from './search'
import './style.css'
import SimpleRating from '../components/star_display'
import ReactStars from 'react-rating-stars-component'
import './style.css'

    
const HandleSearch = () => {
    const [ratingValue, setRating] = useState(0)
    const [name, searcName] = useState("")

    const nameForm = useRef(null)

    const average = arr => arr.reduce( ( p, c ) => p   c, 0 ) / arr.length;
    const ratings = []
    const displayComment = async() => {
        try {
            const form = nameForm.current
            const name = form['name'].value
            searchName(name)
            const response = await fetch(`localhost`)
            const jsonData = await response.json()
            getComments(jsonData)
            comments.forEach(e => {
                console.log(e.rating)
                ratings.push(e.rating)
            })
            const rating = average(ratings) //Avg of all rating associated with the search 
            console.log(rating)             //Should be pass to Rating component
            setRating(rating)
        } catch (error) {
            console.log(error.message)
        }
    }


    return(
        <div className="container">
        <div className="form-group">
        <h1 className="text-center mt-5">SEARCH</h1>
            <form ref={nameForm} className="mt-5">
                <InputSearch name={'name'}/>
                <div className="d-flex justify-content-center">
                    <button type="submit" className="d-flex btn btn-primary" onClick={displayComment}>Search</button>
                </div>
            </form>
            <div>
            <div className='container'>
                <h1>{name}</h1>
                <SimpleRating data={ratingValue}
                />
            </div>
            <div className='container'>
                {comments.map(comment => (
                    <div className="commentSection">
                         <a>
                            {comment.problem}
                        </a><br/>
                        <a>
                                Posted on : {comment.date}
                        </a>
                    </div>
                ))}
            </div>
            </div>
        </div>
        </div>
    )
}

export default HandleSearch;
 

И это моя составляющая рейтинга:

 import React, { useState } from 'react';
import { render } from 'react-dom';
import ReactStars from 'react-rating-stars-component'
import './style.css'
import HandleSearch from '../pages/handleSearch'


export default function SimpleRating(rating) {

  const [ratingValue, setRating] = useState(0)

  const options = {
    value: ratingValue, //Should use the value from the Search component
    a11y: true,
    isHalf: true,
    edit: false,
  };

  console.log(options.value)

  if (options.value == 0) return null //if rating value = 0 doesn't display the component

  return (
    <div className="starComponent">
      <ReactStars {...options}/>
    </div>
  );
}
 

Поэтому я пытаюсь передать значение, вычисленное в компоненте поиска, компоненту рейтинга. Перед выполнением любого запроса с помощью компонента поиска значение должно быть равно 0 и скрыто.

Что я упускаю ?

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

1. Что происходит с этой строкой const response = await fetch(`localhost`) , я не думаю, что вы на самом деле что-то получаете обратно, так как вы просто указываете на localhost

Ответ №1:

Это связано с вашим реквизитом. В родительском компоненте вы создаете реквизит под названием данные, поэтому в компоненте рейтинга вам нужно извлечь это значение из реквизита

 
//  HandleSearch Component
<SimpleRating data={ratingValue}

export default function SimpleRating(props) {
  const { data } = props
  // You can also just say props.data 

  ... rest of your component
}

 

В настоящее время вы фактически определяете реквизиты в своем компоненте упрощения, но вы называете их рейтингом (на самом деле не имеет значения, как вы его называете, но обычно его называют реквизитами), и это объект, содержащий все реквизиты, которые вы передаете в этот компонент.

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

1. Поэтому я попробовал это решение, которое приблизило меня к моей цели. Тем не менее, похоже, что мое состояние в компоненте поиска не обновляется должным образом. Он остается на уровне 0.

2. Тогда проблема кроется в вашей функции displayComment. Если он возвращает 0, то это означает, что состояние не меняется