Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反应防止子渲染(ajax加载程序等待响应)_Ajax_Reactjs - Fatal编程技术网

反应防止子渲染(ajax加载程序等待响应)

反应防止子渲染(ajax加载程序等待响应),ajax,reactjs,Ajax,Reactjs,我正在尝试编写简单的ajax加载程序,我想知道我是否可以阻止props.childrend在父容器中渲染。问题是孩子们想要渲染,不管加载程序是否想要显示它,也不管渲染是否基于导致错误的ajax数据 例如: 例2: 此示例将产生错误,因为在ajax请求之前未定义This.state.data.user 加载器: import React from 'react' export default React.createClass({ getDefaultProps() {

我正在尝试编写简单的ajax加载程序,我想知道我是否可以阻止props.childrend在父容器中渲染。问题是孩子们想要渲染,不管加载程序是否想要显示它,也不管渲染是否基于导致错误的ajax数据

例如:

例2: 此示例将产生错误,因为在ajax请求之前未定义This.state.data.user

加载器:

import React from 'react'
export default React.createClass({

    getDefaultProps() {
        return { text: "Loading", loaded: false };
    },

    render() {

        if(this.props.loaded == false)
            return <div>{this.props.text}</div>;
        else
            return <div>{this.props.children}</div>;
    }
})
从“React”导入React
导出默认的React.createClass({
getDefaultProps(){
返回{文本:“加载”,加载:false};
},
render(){
if(this.props.loaded==false)
返回{this.props.text};
其他的
返回{this.props.children};
}
})
使用加载器初始化

import React from 'react'
import Loader from '../helpers/Loader';
import {comm} from '../Comm';

export default React.createClass({

    getInitialState() {
        return {loaded: false, data: null};
    },
    componentWillMount(){
        comm.get("/xxx/xxx", {json: 1}, (back) => {
            console.log(back);
            this.setState({loaded: true, data: back});
        });
    },
    render(){
        return <Loader loaded={this.state.loaded}>{this.state.data.user.name}</Loader>
});
从“React”导入React
从“../helpers/Loader”导入加载程序;
从“../comm”导入{comm};
导出默认的React.createClass({
getInitialState(){
返回{loaded:false,data:null};
},
组件willmount(){
comm.get(“/xxx/xxx”,{json:1},(back)=>{
控制台日志(返回);
this.setState({loaded:true,data:back});
});
},
render(){
返回{this.state.data.user.name}
});

原因是,最初您定义了
data=null
,在ajax调用之前,您正在使用
this.state.data.user.name
,它将抛出错误:

无法读取未定义的属性“name”

简单的解决方案是,在没有得到ajax响应之前,您需要对数据进行检查,请检查以下内容:

var Loader=React.createClass({
getDefaultProps(){
返回{文本:“加载”,加载:false};
},
render(){
if(this.props.loaded==false)
返回{this.props.text};
其他的
返回{this.props.children};
}
});
var Hello=React.createClass({
getInitialState(){
返回{loaded:false,data:null};
},
组件willmount(){
设置超时(()=>{
this.setState({loaded:true,data:{user:{name:“login”}});
}, 1000);
},
render:function(){
var user=null;
返回
你好{this.state.data?this.state.data.user.name:null}
;
}
});
ReactDOM.render(
,
document.getElementById('容器')
);

Thx获取答案。但我知道我可以检查变量,我只是不想这么做。我希望“收到数据后”有干净的代码。我知道我可以让这个类与ifs一起工作,我只是想知道,我可以在loader中阻止它们吗。