【问题标题】:React Native custom class not setting propertiesReact Native 自定义类未设置属性
【发布时间】:2018-10-21 14:04:38
【问题描述】:

我创建了一个名为 UserInfo 的类,我在其中将用户信息存储在变量中,并在不同的屏幕中调用这些变量

    class UserInfo {
    constructor(props) {
        this.username = "Test"
    }
}

export default (new UserInfo())

我在像这样 UserInfo.username 的其他屏幕上调用它,它工作正常

但是现在我想从本地数据库中检索用户信息,所以我在 UserInfo 类中创建了一个从本地数据库中获取数据的方法

    class UserInfo {
    constructor(props) {
        this.username = ""
        this.getUserInfo
    }

    getUserInfo = () =>{
        db.transaction((tx) => {
            tx.executeSql('SELECT * FROM users', [], (tx, results) => {
                let row = results.rows.item(0);
                console.log("UserID: " + row.id) // return value from db, working
                this.username = row.id
            });
        });
    }

}

export default (new UserInfo())

但现在它返回空值但在控制台值显示,我错过了什么。我通过在构造函数末尾调用 getUserInfo 方法重新设置用户名值...

【问题讨论】:

  • 你需要调用方法-this.getUserInfo()而不是this.getUserInfo
  • 已经试过了,同样的结果...
  • 好的。请在问题中更正这一点,以免您从下一个人那里得到类似的答案。

标签: javascript android reactjs react-native sqlite


【解决方案1】:

db.transaction 是一个asynchronous 调用,你可能会在this.username = row.id 语句执行之前调用UserInfo.username。而不是直接访问username,而是调用UserInfo.getUserInfo()并使用promise获取解析值,比如

UserInfo.getUserInfo().then(username => {
    /* do whatever you want to do with username */
});

getUserInfo中需要做的改动如下

getUserInfo = () => {
  return new Promise((resove, reject) => {
     db.transaction((tx) => {
        tx.executeSql('SELECT * FROM users', [], (tx, results) => {
            let row = results.rows.item(0);
            console.log("UserID: " + row.id) // return value from db, working
            this.username = row.id;

            resolve(this.username);

        }, (ts, err) => { 
            /* handle the failed case here */
            reject();
        });
    });
  }); 
}

希望这会有所帮助!

【讨论】:

  • 致电UserInfo.getUserInfo().then(...) 时获得了什么价值?
  • 什么都没有,它显示错误。我以前做过 {UserInfo.username}
  • 但现在我用你上面的代码显示错误
  • 哦,你在使用这个内部渲染方法!,你需要更多的改变,你需要先调用函数,然后将结果存储在state中,然后使用显示相同跨度>
  • 我试过这样: UserInfo.getUserInfo().then(username => { /* 对用户名做任何你想做的事情 */ this.setState({username:username}) }) ;
【解决方案2】:

我认为您可能会失去“this”的范围

您可以尝试以下方法,看看是否有效?

class UserInfo {
  constructor(props) {
    this.username = ""
    this.getUserInfo()
  }

  getUserInfo = () => {
    let ref = this; // save a reference to to this
    db.transaction((tx) => {
      tx.executeSql('SELECT * FROM users', [], (tx, results) => {
        let row = results.rows.item(0);
        console.log("UserID: " + row.id) // return value from db, working
        ref.username = row.id // save the username using the reference
      });
    });
  }

}

export default (new UserInfo())

【讨论】:

  • 如何检查用户名是否为空?您在代码中的什么地方使用它?
  • 我在另一个屏幕上调用它,比如这个 UserInfo.username & 它在那里什么都没有显示,但是如果我手动设置 this.username = "User Name" 它会在其他屏幕上显示用户名
  • 如果你想在 react 组件中显示值,那么你应该使用扩展 React.Component 的类并使用状态来更新你的 UI。您的 UserInfo 类在初始化时将用户名设置为空字符串。如果您当时尝试使用用户名,则用户名将始终等于“”。如果您稍后尝试请求它,它将被正确更新。我认为你应该检查一下 React 组件是如何工作的以及如何使用它们的状态。
  • 我不希望它是一个组件类,我只是希望它是一个基本类
  • 那么你应该自己处理 UI 的更新。这意味着当您实际拥有用户名的数据时,您需要用新值通知您的其他组件。
【解决方案3】:

您正在创建您的 UserInfo 类的新实例,此时您的此用户名变量中存储的空字符串。如果您想在调用 getUserInfo 函数后从数据库中获取值,那么您可以从函数中返回值并在反应组件中使用该值,如下所示:-

    class UserInfo {
    constructor(props) {
        this.username = ""
        this.getUserInfo
    }

    getUserInfo = () =>{
        return new Promise((resolve, reject) => { 
           db.transaction((tx) => {
             tx.executeSql('SELECT * FROM users', [], (tx, results) => {
                let row = results.rows.item(0);
                console.log("UserID: " + row.id) // return value from db, working
                // this.username = row.id
                resolve(row.id);
            });
           });
        })
    }
 }

export default (new UserInfo())

从你的函数中返回你的值后,你可以在你的反应组件中使用这个值,如下所示:-

UserInfo.getUserInfo().then(username => {
     this.setState({username})
});

将此值存储在您的状态和组件中,您可以按如下方式使用它:-

<Text>{this.state.username}</Text>

【讨论】:

  • 还是空的兄弟
  • 您能否通过控制台检查您在 getUserInfo 的 then 函数中的用户名值和 UserInfo 类中 row.id 的值?
  • 那么您的问题解决了吗?或者你还有什么问题?
猜你喜欢
  • 2018-12-07
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2019-03-10
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多