setState不能在React Native中的AsyncStorage内部工作吗?

时间:2018-08-10 05:22:27

标签: javascript react-native

setState在React Native的AsyncStorage内部不起作用。

Chart1.Series(0).Points(0).Url="/url1"

Chart1.Series(0).Points(1).Url="/url2"

Chart1.Series(0).Points(2).Url="/url3"

使用constructor(props) { super(props); this.state = {userId: ''}; } componentDidMount() { AsyncStorage.getItem('USER_ID', (err, result) => { if (!err && result != null) { this.setState({ userId: result }); } else { this.setState({ userId: null }); } }); alert(this.state.userId); let userId = this.state.userId; fetch('http://localhost/JsonApi/myprofile.php', { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, body: JSON.stringify({ userId: userId, }), }) .then((response) => response.json()) .then((responseJson) => { this.setState({userDetails: responseJson}); }) .catch((error) => { console.error(error); }); } 和alert设置userId值根本不会返回任何值。尝试了Stackoverflow的其他解决方案,但未达到我的预期。

注意:代码已更新。从AsyncStorage获取userId后,它将传递给fetch。这里,缺少userId值。

3 个答案:

答案 0 :(得分:2)

2种方法。一种是简单的方法,另一种是根据反应建议的正确方法

一个是传递值,直接声明。

 .then((responseJson) => {
           // this.setState({userDetails: responseJson});
      this.state.userDetails=responseJson;
     this.setState({});   //for update render
        })

第二种方式在这里

在渲染功能中检查状态值,例如:如果UserDetails状态为null,则只要userDetails状态再次执行数据渲染并提供完美结果,都不会给您错误。

          render() {
    return (
      <div>
        {this.state.userDetails ?
          this.state.userDetails.map((data, index) =>
            <tr key={index}>
              <td>{data.userName}</td>
              <td>{data.userEmail}</td>
            </tr>
          )
          : null
        }
 </div>)}

让我知道收获。如果遇到问题

答案 1 :(得分:0)

尝试在更新状态后发出警报。状态更新后,您将获得回调。

this.setState({
                userId: result
            },function(){
        console.log("userId in async = ", this.state.userId);
        alert(this.state.userId);
});

答案 2 :(得分:-1)

我不知道你为什么写那么多代码。

第一种方式

$serviceNames = array_column($serviceNames, Null, "language");

echo $serviceNames["fi"]["value"];  //jotain
echo $serviceNames["en"]["value"];  //something
echo $serviceNames["sv"]["value"];  //någonting
  • 您无需同时检查AsyncStorage.getItem("USER_ID").then((value) => { console.log("userId in async = " + value); this.setState({ userId: value }); }); error,因为如果该字段为null,则将状态下的userId设置为null。因此您可以直接将result设置为value
  • 还设置日志以查看异步存储userId的输出。
  • 还请确认您在“ USER_ID”中的某个位置设置了值。

第二种方式

可以使用不同的方式,就像使用userId方法一样。

async

您可以使用

const getUserId = async () => {
  try {
    const userId = await AsyncStorage.getItem('USER_ID') || 'none';
  } catch (error) {
    // Error retrieving data
    console.log(error.message);
  }
  return userId;
}

我不喜欢这种方式,因为我需要使用this.setState ({ userId : getUserId() }); async关键字创建另一种方法。

我采用第一种方式。

更新

请执行与await中的userId相关的工作,因为您在调用getIten();之后立即提醒了userId。调用AsyncStorage之后,AsyncStorage返回值。

alert