当前位置: 首页 > 知识库问答 >
问题:

在渲染之前在服务器中获取数据

淳于熙云
2023-03-14

我是reactjs新手,我想在服务器中获取数据,以便它将包含数据的页面发送给客户端。

当函数getDefaultProps返回像这样的虚拟数据时是可以的{data:{book:[{...},{...}]}}。

但是不适用于下面的代码。代码按此顺序执行,并带有错误消息“无法读取未定义的属性'book'”

  1. getDefaultProps
  2. 返回
  3. {data:{book:[{...},{...}]}}

但是,我希望代码应该按此顺序运行

  1. getDefaultProps
  2. {data:{book:[{...},{...}]}}
  3. 返回

有什么想法吗?

statics: {
    fetchData: function(callback) {
      var me = this;

      superagent.get('http://localhost:3100/api/books')
        .accept('json')
        .end(function(err, res){
          if (err) throw err;

          var data = {data: {books: res.body} }

          console.log('fetch');                  
          callback(data);  
        });
    }


getDefaultProps: function() {
    console.log('getDefaultProps');
    var me = this;
    me.data = '';

    this.fetchData(function(data){
        console.log('callback');
        console.log(data);
        me.data = data;      
      });

    console.log('return');
    return me.data;            
  },


  render: function() {
    console.log('render book-list');
    return (
      <div>
        <ul>
        {
          this.props.data.books.map(function(book) {
            return <li key={book.name}>{book.name}</li>
          })
        }
        </ul>
      </div>
    );
  }

共有3个答案

韩单弓
2023-03-14

我用来从服务器接收数据并显示数据的最佳答案

 constructor(props){
            super(props);
            this.state = {
                items2 : [{}],
                isLoading: true
            }

        }

componentWillMount (){
 axios({
            method: 'get',
            responseType: 'json',
            url: '....',

        })
            .then(response => {
                self.setState({
                    items2: response ,
                    isLoading: false
                });
                console.log("Asmaa Almadhoun *** : " + self.state.items2);
            })
            .catch(error => {
                console.log("Error *** : " + error);
            });
    })}



    render() {
       return(
       { this.state.isLoading &&
                    <i className="fa fa-spinner fa-spin"></i>

                }
                { !this.state.isLoading &&
            //external component passing Server data to its classes
                     <TestDynamic  items={this.state.items2}/> 
                }
         ) }
林博厚
2023-03-14

这是一个非常简单的例子

import React, { Component } from 'react';
import { View, Text } from 'react-native';

export default class App extends React.Component  {

    constructor(props) {
      super(props);

      this.state = {
        data : null
      };
    }

    componentWillMount() {
        this.renderMyData();
    }

    renderMyData(){
        fetch('https://your url')
            .then((response) => response.json())
            .then((responseJson) => {
              this.setState({ data : responseJson })
            })
            .catch((error) => {
              console.error(error);
            });
    }

    render(){
        return(
            <View>
                {this.state.data ? <MyComponent data={this.state.data} /> : <MyLoadingComponnents /> }
            </View>
        );
    }
}
墨星鹏
2023-03-14

您正在寻找的是组件WillMount

从文档中:

在初始渲染发生之前,在客户端和服务器上调用一次。如果在此方法中调用setState,则会看到更新的状态,即使状态发生更改,也只会执行一次。

所以你可以这样做:

componentWillMount : function () {
    var data = this.getData();
    this.setState({data : data});
},

这样,render()将只被调用一次,并且您将在初始渲染中获得要查找的数据。

 类似资料:
  • 我正在我的演示反应应用程序上进行服务器渲染。虽然它的工作原理,如果我刷新一个网址上的页面来获取医生,如/doctor/:id,如果我在/login并尝试去/医生/123456医生属性是空的,并且(这个.props.医生.name.first)失败。 在这些情况下,使用redux获取数据的好方法是什么? 代码如下 异径管 行动 日志错误

  • info 如果您能了解下面这些技术,能加快您对本文的了解 vuex - Vue.js 应用程序开发的状态管理模式 Vue.js SSR - Vue.js 服务器端渲染 webpack - 编译构建工具 Lavas 服务器端渲染模板参考了 vue-hackernews 的渲染和开发机制,并且结合了 Lavas 的 App Shell 模板,导出的工程中会有 App Shell 等 如果您不了解 vu

  • React 提供了两个方法 renderToString 和 renderToStaticMarkup 用来将组件(Virtual DOM)输出成 HTML 字符串,这是 React 服务器端渲染的基础,它移除了服务器端对于浏览器环境的依赖,所以让服务器端渲染变成了一件有吸引力的事情。 服务器端渲染除了要解决对浏览器环境的依赖,还要解决两个问题: 前后端可以共享代码 前后端路由可以统一处理 Rea

  • 我正在使用Vue路由器和基于文件的组件。我打电话给其中一条路线并获取一个参数(slug),该参数使用axios从API获取json。 我使用“组件内保护”来实现这一点,使用名为beforeRouteEnter的方法。我正在将axios的响应传递到下一个方法。 这是可行的,但是,Vue在设置数据之前呈现视图。这将生成

  • 如果你调研服务器端渲染(SSR)只是用来改善少数营销页面(例如/,/about,/contact等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时(build time)简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可以将你的前端作为一个完全静态的站点。 如果你使用 webpack,你可以使用prerende

  • 问题内容: 我刚刚开始研究ReactJS,发现它为您提供了两种渲染页面的方法:服务器端和客户端。但是,我不知道如何一起使用。是使用两种单独的方法来构建应用程序,还是可以将它们一起使用? 如果可以一起使用,该如何做- 我们是否需要在服务器端和客户端重复相同的元素?或者,我们是否可以仅在服务器上构建应用程序的静态部分,而在客户端构建动态部分,而无需与已经预先渲染的服务器端建立任何连接? 问题答案: 对