2016-12-04 163 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請求中的值填充狀態變量,從而導致使用更新的重新呈現值。 –