使用 Hook,Undefined 将搜索栏添加到 Flatlist
Adding Search Bar into Flatlist using Hook, Undefined
我尝试使用搜索栏功能在模态内创建平面列表,该功能可以根据用户在搜索栏中的输入过滤结果。
对于平面列表,所有内容都会相应显示,
问题我无法过滤数据,
我尝试使用原始完整数据(列表)中的 .filter 但结果始终未定义不是数据。
顺便说一句,数据从本地 .json 文件填充到使用 useEffect 的状态。
这里是本地country.json数据:
[
"Japan",
"Korea",
"Thailand",
"Indonesia" ]
这里是部分源代码:
import dataCountry from '../../assets/json/country.json';
const NameScreen = ({ navigation }) => {
// hook
const [list, setList] = useState([]);
const [modalBirthplace, setModalBirthplace] = useState(false);
const [searchText, setSearchText] = useState('');
useEffect(() => {
setList({ dataCountry });
console.log('check List : ', list);
}, [])
const renderItem = ({ item }) => (
<Item title={item.title} />
);
const ListItem = ({ title }) => (
<View>
<TouchableOpacity onPress={() => console.log("ok")}>
<Text style={styles.cityList}>{title}</Text>
</TouchableOpacity>
</View>
);
const searchFilterFunction = searchText => {
setSearchText(searchText);
console.log(searchText)
const newData = list.filter((item) => { // error trigger from this list.filter undefined is not a function
const itemData = item.toUpperCase();
const textData = searchText.toUpperCase();
return itemData.indexOf(textData) > -1;
});
setList(newData);
};
return (
<View style={styles.container}>
<Modal
animationType="slide"
transparent={true}
visible={modalBirthplace}
onRequestClose={() => {
Alert.alert('Modal has been closed.');
}}>
<View style={styles.centeredView}>
<View style={styles.modalView}>
<Text style={styles.modalText}>Choose your country location :</Text>
<TextInput
placeholder="Try japan maybe?"
onChangeText={searchText => searchFilterFunction(searchText)}
value={searchText}
/>
<FlatList
data={list.dataCountry}
renderItem={({ item }) => (
<ListItem
title={item}
/>
)}
keyExtractor={item => item}
/>
<TouchableHighlight
style={{ ...styles.openButton, backgroundColor: '#E15C72' }}
onPress={() => {
setModalBirthplace(!modalBirthplace);
}}>
<Text style={styles.textStyle}>Close Selection</Text>
</TouchableHighlight>
</View>
</View>
</Modal>
</View>
)
}
有人知道为什么我不能过滤状态吗?
之前非常感谢
问题是您的状态是 JSON 对象,而不是数组:
setList({ dataCountry });
// so list is:
{
dataCountry: [
...
]
}
所以,这里需要改一下
const newData = list.dataCountry.filter((item) => { // here
const itemData = item.toUpperCase();
const textData = searchText.toUpperCase();
return itemData.indexOf(textData) > -1;
});
setList({dataCountry: newData}); // and here
也许你的json是这样的,
const list = {
dataCountry : [
'UK',
'US'
]
}
列表是一个对象,您不能将过滤器与对象一起使用。
除了使用数组占位符,您还可以像这样使用展开运算符,
const newData = [...list.dataCountry].filter((item) => {
const itemData = item.toUpperCase();
const textData = searchText.toUpperCase();
return itemData.indexOf(textData) > -1;
});
我尝试使用搜索栏功能在模态内创建平面列表,该功能可以根据用户在搜索栏中的输入过滤结果。
对于平面列表,所有内容都会相应显示, 问题我无法过滤数据, 我尝试使用原始完整数据(列表)中的 .filter 但结果始终未定义不是数据。
顺便说一句,数据从本地 .json 文件填充到使用 useEffect 的状态。
这里是本地country.json数据:
[
"Japan",
"Korea",
"Thailand",
"Indonesia" ]
这里是部分源代码:
import dataCountry from '../../assets/json/country.json';
const NameScreen = ({ navigation }) => {
// hook
const [list, setList] = useState([]);
const [modalBirthplace, setModalBirthplace] = useState(false);
const [searchText, setSearchText] = useState('');
useEffect(() => {
setList({ dataCountry });
console.log('check List : ', list);
}, [])
const renderItem = ({ item }) => (
<Item title={item.title} />
);
const ListItem = ({ title }) => (
<View>
<TouchableOpacity onPress={() => console.log("ok")}>
<Text style={styles.cityList}>{title}</Text>
</TouchableOpacity>
</View>
);
const searchFilterFunction = searchText => {
setSearchText(searchText);
console.log(searchText)
const newData = list.filter((item) => { // error trigger from this list.filter undefined is not a function
const itemData = item.toUpperCase();
const textData = searchText.toUpperCase();
return itemData.indexOf(textData) > -1;
});
setList(newData);
};
return (
<View style={styles.container}>
<Modal
animationType="slide"
transparent={true}
visible={modalBirthplace}
onRequestClose={() => {
Alert.alert('Modal has been closed.');
}}>
<View style={styles.centeredView}>
<View style={styles.modalView}>
<Text style={styles.modalText}>Choose your country location :</Text>
<TextInput
placeholder="Try japan maybe?"
onChangeText={searchText => searchFilterFunction(searchText)}
value={searchText}
/>
<FlatList
data={list.dataCountry}
renderItem={({ item }) => (
<ListItem
title={item}
/>
)}
keyExtractor={item => item}
/>
<TouchableHighlight
style={{ ...styles.openButton, backgroundColor: '#E15C72' }}
onPress={() => {
setModalBirthplace(!modalBirthplace);
}}>
<Text style={styles.textStyle}>Close Selection</Text>
</TouchableHighlight>
</View>
</View>
</Modal>
</View>
)
}
有人知道为什么我不能过滤状态吗?
之前非常感谢
问题是您的状态是 JSON 对象,而不是数组:
setList({ dataCountry });
// so list is:
{
dataCountry: [
...
]
}
所以,这里需要改一下
const newData = list.dataCountry.filter((item) => { // here
const itemData = item.toUpperCase();
const textData = searchText.toUpperCase();
return itemData.indexOf(textData) > -1;
});
setList({dataCountry: newData}); // and here
也许你的json是这样的,
const list = {
dataCountry : [
'UK',
'US'
]
}
列表是一个对象,您不能将过滤器与对象一起使用。 除了使用数组占位符,您还可以像这样使用展开运算符,
const newData = [...list.dataCountry].filter((item) => {
const itemData = item.toUpperCase();
const textData = searchText.toUpperCase();
return itemData.indexOf(textData) > -1;
});