Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.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
Javascript 我真的需要将forceUpdate与fetchapi和ReactJS一起使用吗_Javascript_Reactjs_Fetch Api - Fatal编程技术网

Javascript 我真的需要将forceUpdate与fetchapi和ReactJS一起使用吗

Javascript 我真的需要将forceUpdate与fetchapi和ReactJS一起使用吗,javascript,reactjs,fetch-api,Javascript,Reactjs,Fetch Api,我正在使用React和来开发UI,结果是: getOperatorsList: function ( obj ) { fetch( 'http://x.x.x.x/operators.list', { method: 'GET', credentials: 'include' } ).then( function ( response ) { return response.j

我正在使用React和来开发UI,结果是:

getOperatorsList: function ( obj ) {
    fetch( 'http://x.x.x.x/operators.list',
        {
            method: 'GET',
            credentials: 'include'
        }
    ).then( function ( response ) {
            return response.json()
        } ).then( function ( json ) {
        if ( json.statusCode === 3 ) {
            cookieService.unsetCookie( 'sessId' );
        }
        obj.setState( { data: json }, () => obj.forceUpdate() );
    } ).catch( function ( ex ) {
        console.log( 'parsing failed', ex );
    } )

}
这在我的组件操作符中调用,如下所示

var Operators = React.createClass( {

    getInitialState: function () {
        return {
            data: [{ "data": "Loading" }]
        }
    },

    componentDidMount: function () {
        operatorsService.getOperatorsList( this );
    },

    render: function () {
        return (
            <div>
                <Row >
                    <Col>
                        <DataTablesCustom data={this.state.data} />
                    </Col>
                </Row>
            </div>
         );
     }
});
var Operators=React.createClass({
getInitialState:函数(){
返回{
数据:[{“数据”:“加载”}]
}
},
componentDidMount:函数(){
operatorsService.getOperatorsList(此);
},
渲染:函数(){
返回(
);
}
});
我已经看过了,但代码对我不起作用

这很好,但我真的需要使用
forceUpdate()
还是有办法让代码“更干净”


编辑:有一个
setState
看起来像这个
this.setState({stuff:stuff},this.function()})在子组件中。在将
setState
更改为
this.setState({stuff:stuff},()=>this.function()})之后,我能够删除
forceUpdate()

要使代码正常工作,您可以尝试在服务中执行以下操作:

obj.setState.bind(obj)( { data: json });
但是,不需要将组件对象传递给您的服务。可以说,这不是一个好主意,因为你只是在不需要的时候耦合东西。让组件调用您的服务,然后决定如何处理数据:

 getOperatorsList: function () {
    return fetch( 'http://x.x.x.x/operators.list', {
        method: 'GET',
        credentials: 'include'
    }).then( function ( response ) {
        return response.json()
    }).then( function ( json ) {
        if (json.statusCode === 3 ) {
            cookieService.unsetCookie( 'sessId' );
        }
        return json;
    }).catch( function ( ex ) {
      console.log( 'parsing failed', ex );
    })

}
然后在组件中:

componentDidMount: function () {
    operatorsService.getOperatorsList()
    .then(function (json) {
       this.setState({ data: json });
    }.bind(this))
}

如果没有它,我想要的数据在页面加载时不会显示。所以你有你的答案,你必须使用它;)(这段代码对我来说很清楚)这主要是关于ReactJS文档如何说应该避免forceUpdate(),但我想换一种观点。谢谢:)@Steeve Pitis代码看起来一点也不干净。另外,如果他能更好地重构代码,他根本不需要调用
forceUpdate
。你忘记了在
getOperatorsList
中返回承诺,我得到了“Uncaught TypeError:Cannot read property”then“of undefined”,我引用的问题是这样做的,并在fetch()之前添加了一个返回,但这也不起作用。我的行为和以前一样。@Harmeko抱歉,我只是忘记了返回承诺,我用
return
语句更新了GetOperatorList。它仍然不起作用。我真的不明白怎么了。还有更多,当我尝试
console.log时(这个)
then()
中查看状态,其中有数据,但如果我
console.log(this.state.data)
@Harmeko从React文档中看到:“setState()不会立即改变this.state,而是创建挂起的状态转换。调用此方法后访问this.state可能会返回现有值。”这就是console.log(this.state)不显示数据的原因。如果仍然不起作用,请尝试在
渲染
中调试/
console.log(this.state.data)
,看看会发生什么。