Javascript 我真的需要将forceUpdate与fetchapi和ReactJS一起使用吗
我正在使用React和来开发UI,结果是: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
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)
,看看会发生什么。