代码之家  ›  专栏  ›  技术社区  ›  Blaine Lafreniere

组件未从作为prop传入的对象在页面上呈现任何值

  •  0
  • Blaine Lafreniere  · 技术社区  · 5 年前

    下面的例子很简单。什么时候? new Book(id); 被称为 Book 构造函数将对我的后端API进行API调用,获取书籍的JSON数据,并设置 喜欢 title , synopsis 等等。

    这个 <BookDetailComponent /> 只是应该呈现的细节 例子

    import React from "react";
    import { useParams } from "react-router-dom";
    import Book from "../../../modules/books";
    
    export default function BookDetail(props) {
        let {id} = useParams();
        let book = new Book(id);
        return (
            <BookDetailComponent book={book} />
        )
    }
    
    export class BookDetailComponent extends React.Component {
        render () {
            return (
                <div>
                    <h2>{this.props.book.title}</h2>
                    <div>
                        {this.props.book.synopsis}
                    </div>
                </div>
            )
        }
    }
    

    我可以看到数据已经收到 BookDetailComponent 在React devtools选项卡中。正如您在屏幕截图中看到的, props.book 是一个有标题、概要等的对象。

    但是,这些信息似乎都没有显示在页面上。

    enter image description here

    编辑:

    根据要求,这是 :

    export default class Book {
        constructor(id) {
            this.id = id
        }
    
        load = (callback) => {
            Axios.get(`${process.env.REACT_APP_API_URL}/books/${this.id}`).then(response => {
                this.author_id = response.data.author_id
                this.title = response.data.title
                this.synopsis = response.data.synopsis
            })
        }
    }
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Shubham Khatri    5 年前

    当调用load函数时,Book模块会进行异步调用。现在,它不会触发BookDetail组件的重新渲染以反映更新的值。从今天开始,您也不能在渲染中直接调用异步api

    我建议你将Book转换为一个获取数据并使用它的自定义钩子

    const useBook = (id) => {
        const [book, setBook] = useState({});
        useEffect(() => {
            Axios.get(`${process.env.REACT_APP_API_URL}/books/${this.id}`).then(response => {
              setBook({
                author_id: response.data.author_id,
                title: response.data.title,
                synopsis: response.data.synopsis,
            });
        }, [id]);
        return book
    }
    export default useBook;
    

    import useBook from "../../../modules/books";
    
    export default function BookDetail(props) {
        let {id} = useParams();
        let book = useBook(id);
        return (
            <BookDetailComponent book={book} />
        )
    }