【问题标题】:React when passing query result to next view it's empty将查询结果传递给下一个视图时做出反应,它是空的
【发布时间】:2018-05-04 21:35:04
【问题描述】:

我有一个简单的 SQLite 应用程序,我正在尝试将查询结果作为参数传递给下一个视图,但它始终为空。

我用 Button 和 ListView 得到了一个这样的滚动视图

            <TextInput placeholder="Marka" onChangeText={(text) => this.setState({brandSearch: text})}/>
            <TextInput placeholder="Model" onChangeText={(text) => this.setState({modelSearch: text})}/>
            <Button title="Wyszukaj"
                    color="#841584"
                onPress={() =>
                    navigate('SearchResultView', {data: this.searchCars})
                }
                     /*    onPress={this.searchCars}*/
            />

            <ListView
                enableEmptySections
                dataSource={this.state.data}
                renderSeparator={this.ListViewItemSeparator}
                renderRow={(rowData) =>
                    <View>
                        <Text style={{
                            textAlign: 'center',
                            fontWeight: "bold"
                        }}>{rowData.brand} {rowData.model} {rowData.power}km {rowData.color}</Text>

                        <Image
                            style={{width: null, height: 200}}
                            source={{uri: rowData.photos}}
                        />
                    </View>
                }
            />

        </ScrollView>

以及要执行的函数

searchCars() {
        var p = new Promise(function (resolve, reject) {
            db.transaction((tx) => {
                tx.executeSql("SELECT * FROM Car;", [], (tx, results) => {
                    var temp = [];
                    var len = results.rows.length;
                    for (let i = 0; i < len; i++) {
                        temp.push(results.rows.item(i));
                    }

                    resolve(temp);
                });
            });
        });

        p.then((result) => {
             return result;
        });
    };

【问题讨论】:

  • 您的问题似乎不是特定于反应的问题,而是您如何处理数据的问题。您应该提供导航功能的实现并将您的示例清理为具有预期行为的minimal reproducible example

标签: reactjs sqlite navigator


【解决方案1】:

您的 searchCars 方法正在调用 p.then 并在该函数调用中返回结果,但 p 本身并未返回。基本上,searchCars 没有返回任何内容。

function wrongSearchCars() {
  var p = new Promise(function (resolve, reject) {
        resolve('hello');
    });

    p.then((result) => {
         return result;
    });
}
function correctSearchCars() {
  var p = new Promise(function (resolve, reject) {
        resolve('hello');
    });

  return p.then((result) => {
         return result;
  });
}

wrongSearchCars().then(console.log) // undefined
correctSearchCars().then(console.log) // 'hello'

此外,如您所见,由于 searchCars 内的 p 的 .then 块将返回一个承诺,因此甚至没有理由对 .then 进行内部调用。

searchCars() {
    return new Promise(function (resolve, reject) {
        db.transaction((tx) => {
            tx.executeSql("SELECT * FROM Car;", [], (tx, results) => {
                var temp = [];
                var len = results.rows.length;
                for (let i = 0; i < len; i++) {
                    temp.push(results.rows.item(i));
                }

                resolve(temp);
            });
        });
    });
};

这是我的猜测,基于我所看到的。你的很多代码都丢失了,无法推断。

【讨论】:

  • 感谢您的帮助,但不幸的是它仍然是一样的,当我记录输出时,它就像 {"_40":0...} 一样奇怪。在第二个视图中,它是空的。整个代码在:github.com/MateuszBucko/ReactNativeTemplate/tree/sqliteTask
  • 在 Screens 文件夹中,有 MainList - 主视图,SearchResultView - 我要使用查询结果导航的视图,以及带有导航器的 App.js。您可以忽略的汽车详细信息
  • 我还注意到在主列表文件的第 124 行,您将 searchCars 作为属性“数据”的值传递给导航方法。我对该模块不太熟悉,但从文档来看,我不相信它会为您调用该方法。您可能需要自己调用它:navigation('SearchResultView', {data: this.searchCars()})
  • 是的,我想通了,但是谢谢 :),我仍然无法从 sql 查询中获取真实数据,它没有返回,这是我最大的问题 :(。现在我第一次调用 setState 它是空的,但接下来没问题..这很奇怪
  • 我进行了更改..就像第一次通话承诺不起作用
猜你喜欢
  • 2022-11-21
  • 1970-01-01
  • 2018-04-17
  • 2020-03-16
  • 2020-11-13
  • 1970-01-01
  • 2011-10-25
  • 2021-04-05
  • 1970-01-01
相关资源
最近更新 更多