2016-12-04 169 views
1

你好,我试图设置状态的读取调用是这样的:不能设置取态反应原生

getCats() { 
     fetch(GLOBALS.API + '/specials.php?action=getCats&key=' + GLOBALS.KEY) 
     .then((response) => response.json()) 
     .then((responseJson) => { 
      this.setState = ({ 
       dataSource: "test" 
      }); 
Alert.alert("test"); 

     }) 
     .catch((error) => { 
      console.log(error.toString()); 
     }); 
    } 

    componentDidMount() { 
     this.getCats(); 
     console.log(this.state.dataSource); 
    } 

但行:

console.log(this.state.dataSource); 

还给我不确定 和我得到一个警告“测试”

有什么问题?

TNX很多

+0

查看我的回答 –

+0

我很高兴它适合你。你可以upvote以及:-) –

回答

1

您可以使用回调。

下面是代码示例

getCats(successCallBack, failureCallback) { 
    fetch(GLOBALS.API + '/specials.php?action=getCats&key=' + GLOBALS.KEY) 
     .then(
      function(response) { 
       if (response.status !== 200) { 
        console.log('Looks like there was a problem. Status Code: ' + 
         response.status); 
        failureCallback(); 
       } 
       // Examine the text in the response 
       response.json().then(function(data) { 
        console.log(data) 
        successCallBack(data); 
       }); 
      } 
     ) 
     .catch(function(err) { 
      console.log('Fetch Error :-S', err); 
      failureCallback(); 
     }); 
} 

下面是成功和失败呼叫的代码备份

successCallBack(data) { 
    console.log(data) 
} 

failureCallback() { 
    alert("failure"); 
} 

下面是结合的成功和失败回调的代码。

getCats(this.successCallBack.bind(this), this.failureCallback.bind(this)); 
1

取是异步的,因此会立即返回,在随后的条款代码运行之前。因此,setState在控制台日志记录之前不会运行。

+0

所以我如何创建listview取数据后获取? – gregory

+0

更改状态时,组件会自动重新渲染。也就是说,如果渲染方法正确地依赖于状态,则状态变化就是在状态改变时自动更新UI所需的全部内容。因此,一种方法是将最初为空的数组作为状态变量,在render方法中循环该变量(呈现您的列表视图),并使用http请求中的值填充状态变量,从而导致使用更新的重新呈现值。 –