简体   繁体   English

State useState 定义的变量在本机反应中不起作用

[英]State variable defined by useState is not working in react native

Can someone please findout what is wrong in this code?有人可以找出这段代码有什么问题吗? Getting nothing from the flatlist.从平面列表中一无所获。 The state variable items is also showing null. state 变量项也显示 null。

 import React, { useEffect, useState } from 'react'; import { FlatList, SafeAreaView, TextInput, Text, Button, Alert } from 'react-native'; import { openDatabase } from 'react-native-sqlite-storage'; const db = openDatabase({name: 'sqlitedb3 '}); const App = () => { const [text, setText] = useState(''); const [items, setItems] = useState([]); async function init() { await handleInit(); await handleFetch(); } useEffect(() => { init(); }, []) const handleInit = async() => { await db.transaction((txn) => { txn.executeSql('CREATE TABLE IF NOT EXISTS Items ('+ 'id INTEGER PRIMARY KEY AUTOINCREMENT,'+ 'item VARCHAR(30))', [], (tx, res) => { console.log('table created'); }) }) } const handleFetch = async() => { await db.transaction((txn) => { txn.executeSql('SELECT * FROM Items', [], (tx, res) => { let n = res.rows.length; console.log('fetched '+n+' items'); let result = []; for(let i = 0; i < n; i++) { result.push({id: res.rows.item(i).id, item: res.rows.item(i).item }); console.log(res.rows.item(i).id+". "+res.rows.item(i).item) } setItems(result); console.log('state.items: '+items.length) }) }) } const handleSubmit = async() => { console.log('submit pressed'); if(text === null || text === '') { Alert.alert('text input is blank'); return; } try { await db.transaction((txn) => { txn.executeSql('INSERT INTO Items (item) VALUES (?)', [text],async (tx, res) => { console.log('saved successfully'); setText(''); await handleFetch(); }) }) } catch(err) { console.log("can't submit") } } const renderlist = ({val}) => { return(<Text>{val.item}</Text>) } return( <SafeAreaView> <TextInput value={text} onChangeText={(val)=>setText(val)} /> <Button onPress={() => { handleSubmit() }} title='Submit'/> <Text>Hello</Text> <FlatList data={items} renderItem={renderlist} /> </SafeAreaView> ) } export default App;

console output:控制台 output:

LOG table created LOG表创建

LOG table created LOG表创建

LOG submit pressed按下日志提交

LOG saved successfully LOG保存成功

LOG fetched 9 items LOG 获取了 9 项

LOG 1. Heyy LOG 1.嘿嘿

LOG 2. m Gnutella fits n me gobo dl LOG 2.m Gnutella 适合 n me gobo dl

LOG 3. Fnch h gcc日志 3. Fnch h gcc

LOG 4. Geysgdsfsgd日志 4. Geysgdsfsgd

LOG 5. Dyrydydyd日志 5. Dyrydydyd

LOG 6. Vjvjvj日志 6. Vjvjvj

LOG 7. Xbxbx日志 7.Xbxbx

LOG 8. Gdgx日志 8.Gdgx

LOG 9. Xvxdh日志 9.Xvxdh

ERROR TypeError: undefined is not an object (evaluating 'val.item')错误类型错误:未定义不是 object(评估“val.item”)

you need to change your FlatList& renderlist a bit, dont forget uppercases.您需要稍微更改 FlatList 和渲染列表,不要忘记大写字母。 try this instead:试试这个:

 const RenderList = ({val}) => {
    return(<Text>{val.item}</Text>)
    
  }
<FlatList 
        data={items} 
        renderItem={({ item }) => (
        <RenderList val={item}
        />
      )}/>

Try something like this:尝试这样的事情:

useEffect(() => {
    if(!items.length){
     init();
    }
  }, [items]);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM