Я извлекаю данные из новостного API и сохраняю их в своем состоянии после завершения, а затем также передаю значение состояния в качестве реквизита дочернему компоненту.
Данные, возвращаемые API, представляют собой массив объектов. Я хочу передать только один элемент (объект) этого массива (который сейчас находится в моем состоянии) моему дочернему компоненту. Итак, я сделал именно это, используя обычный метод обхода массивов ([]) для передачи одного элемента, но, к сожалению, когда я попытался использовать хук useEffect в моем дочернем компоненте для консоли, журналировать реквизиты (что сработало), я не смог получить доступ к свойствам моего элемента (объекта) ни из хука, ни из тела компонента, поскольку он продолжал говорить мне, что он не определен и что я должен отменить все подписки и асинхронные задачи в функции очистки useEffect. Итак, я попытался передать этот элемент в виде массива с помощью метода splice, чтобы его можно было пройти из дочернего компонента с помощью метода map (который сработал), однако я все еще не смог получить доступ к свойствам из хука useEffect.
Родительский компонент (Home.js)
...
const [data, setData]= useState([])
useEffect(()=>{
const fetch= async()=>{
const response= await axios(url)
const results= response.data
setData(results.articles.slice(0,5))
}
fetch()
},[url])
return(
<>
<Categories onClick = {fetchCategory}/>
<section className = {classes.latest}>
<Vertical postArray = {data.slice(0,1)} postObject = {data[0]}/>
</section>
</>
)
}
export default Home
Дочерний компонент (Vertical.js)
const Vertical=(props)=>{
useEffect(() => {
// console.info('postArray',props.postArray.title)
console.info('postObject',props.postObject.title)
}, )
return(
<>
{/* <article key = {props.postObject.content} className = {classes.article}>
<figure className = {classes.article_figure}>
<img src='' alt = "article alternative"/>
</figure>
<div className = {classes.article_details}>
<h2>{props.postObject.title}</h2>
<p>{props.postObject.description}</p>
</div>
</article> */}
{props.postArray.map(post=>(
<article key = {post.content} className = {classes.article}>
<figure className = {classes.article_figure}>
<img src='' alt = "article alternative"/>
</figure>
<div className = {classes.article_details}>
<h2>{post.title}</h2>
<p>{post.description}</p>
</div>
</article>
))}
</>
)
}
export default Vertical
Причина этого в том, что мне нужно получить доступ к URL-адресу, который находится внутри переданного объекта, чтобы сделать другой для получения миниатюры для этого сообщения.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


вам нужно дать зависимости для useEffect, чтобы он смотрел и консольил
useEffect(() => {
// console.info('postArray',props.postArray.title)
console.info('postObject',props.postObject.title)
},[props.postObject.title]) //this will ensure that this prop is watched for changes
Редактировать: для всех с неопределенными ошибками вы можете сделать следующее изменение в зависимости
useEffect(() => {
// console.info('postArray',props.postArray.title)
console.info('postObject',props?.postObject?.title) // optional-chaining would take care of the undefined check
},[props?.postObject?.title]) // optional-chaining would take care of the undefined check
где вы получаете undefined, вы получите undefined в первый раз, но в тот момент, когда данные возвращаются из API, вы больше не должны получать undefined]
Я получаю неопределенность, когда пытаюсь получить доступ к любому свойству из хука useEffect, точно так же, как props.postObject.title.
О, теперь я понимаю немного больше. Возможно, мой запрос API не будет полностью разрешен к моменту отображения дочернего компонента на экране, верно?
Позвольте мне попробовать установить isLoading как мое состояние и передать его дочернему компоненту, который будет использоваться в качестве зависимости в хуке useEffect.
Да, все равно не повезло.
где эти данные? вам нужно установить результат в состояние
в состояние дочернего компонента? Вместо этого я просто использовал его прямо из реквизита.
Извините, я не включил это в фрагмент кода. Позвольте мне сделать это прямо сейчас.
отлично сработало для меня, почему это еще не помечено как ответ
Хороший! это решает проблему с производительностью, но я все еще продолжаю получать неопределенность при попытке доступа к свойствам из хука, который есть.