axios 警告:无法在尚未装载的组件上执行React状态更新

a64a0gku  于 2022-11-05  发布在  iOS
关注(0)|答案(1)|浏览(163)

我收到警告:
js:86注意事项:无法对尚未装入的组件执行React状态更新。这表示呈现函数中存在副作用,稍后异步调用尝试更新该组件。请将此工作移到useEffect。

未捕获的类型错误:无法读取未定义的属性(阅读'review')
setReviews在我的axios函数中也不起作用

import React, { useState } from "react";
import axios from "axios";

function GetRandomReview(props) {
    const [reviews, setReviews] = useState([]);

    axios.get("http://localhost:7000/reviews").then((response) => {
        setReviews(response.data);
    })
    let j = Math.floor((Math.random() * reviews.length));
    console.log(reviews);
    return (
        <div className={props.active ? "carousel-item container-fluid active" : "carousel-item container-fluid"}>
            <h2 className=" testimonial-text">
                {reviews[j].review}

            </h2>
            <em>
                {reviews[j].name}
            </em>
        </div>
    )
}

export default GetRandomReview;

`
我尝试使用UseEffect,但不起作用

mmvthczy

mmvthczy1#

你必须使用useEffect来调用你的api,这将首先挂载你的组件,然后调用你的api,成功后,你的状态将更新,这将呈现数据。
给你

<h2 className=" testimonial-text">{reviews?.[j].review}</h2>
      <em>{reviews?.[j].name}</em>

这将抛出错误,因为你试图引用一个还不存在的键。如果你想让你的组件稍后呈现,但先获取,然后使用useLayoutEffect挂钩,而不是useEffect挂钩。

function GetRandomReview(props) {
  const [reviews, setReviews] = useState([]);

  useEffect(() => {
    axios.get("http://localhost:7000/reviews").then((response) => {
      setReviews(response.data);
    });
  }, []);

  let j = Math.floor(Math.random() * reviews.length);
  console.log(reviews);
  return (
    <div
      className={
        props.active
          ? "carousel-item container-fluid active"
          : "carousel-item container-fluid"
      }
    >
      <h2 className="testimonial-text">{reviews?.[j]?.review}</h2>
      <em>{reviews?.[j]?.name}</em>
    </div>
  );
}

相关问题