如何使用搜索文本输入在屏幕上显示项目(expo,react-native)
How to display items on screen using search textinput (expo, react-native)
我正在使用 React Native 和 Expo。我在屏幕 (iOS) 模拟器上有一些 JSON 数据是从 API 获取的。在顶部,我有一个搜索栏,用户可以在其中搜索屏幕上显示的数据。
例如,如果数据是
一个
一家公司
B
b公司
A 是公司代码,a company
是代码名称。因此,当用户键入 A 时,它应该显示 A
公司,如果用户键入 Z
,它应该显示 Z
公司。
我的代码:
import React, { useState, useEffect } from "react";
import {
StyleSheet,
View,
TouchableWithoutFeedback,
Keyboard,
FlatList,
TextInput,
Button,
Text,
} from "react-native";
import { useStocksContext } from "../contexts/StocksContext";
import { scaleSize } from "../constants/Layout";
import { Ionicons } from "@expo/vector-icons";
import { ListItem } from "react-native";
export default function SearchScreen({ navigation }) {
const { ServerURL, addToWatchlist } = useStocksContext();
const [state, setState] = useState({
/* initial state here */
myListData: [],
search: "",
});
useEffect(() => {
renderWithData();
// FixMe: fetch symbol names from the servner and save in local SearchScreen state
}, []);
updateSearch = (event) => {
setState({ search: event.target.value });
};
renderWithData = () => {
return fetch("http://131.181.190.87:3001/all")
.then((res) => res.json())
.then((json) => {
setState({
isLoaded: true,
myListData: json,
});
setTimeout(() => {
console.log(state.myListData);
}, 10000);
});
};
let filteredItems = state.myListData.filter((item) => {
return (
item.symbol.toUpperCase().indexOf(state.search.toUpperCase()) !== -1 ||
item.name.indexOf(state.search) !== -1
);
});
let movies = state.myListData.filteredItems.map((val) => {
return (
<View key={val.symbol} style={styles.text}>
<Text style={styles.text}>{val.symbol}</Text>
<Text style={styles.text}>{val.name}</Text>
</View>
);
});
return (
<TouchableWithoutFeedback onPress={Keyboard.dismiss}>
<View style={styles.container}>
<TextInput
style={styles.textinput}
placeholder="Search here"
placeholderTextColor="white"
value={state.search}
onChange={updateSearch.bind()}
/>
<Text>csdn</Text>
<View style={styles.text}>{movies}</View>
</View>
</TouchableWithoutFeedback>
);
}
const styles = StyleSheet.create({
textinput: {
color: "white",
height: "20",
fontSize: 18,
},
text: {
color: "white",
backgroundColor: "black",
},
flatstuff: {
color: "white",
},
// use scaleSize(x) to adjust sizes for small/large screens
});
我不确定我做错了什么,但如果我在 textinput 上输入内容,它不会显示任何内容(更像是搜索功能不起作用)并且我的数据仍然显示在屏幕上,除了我无法使用文本输入进行搜索。有人可以帮我吗?
编辑:json 数据
对象{
"name": "Chesapeake Energy",
"symbol": "CHK",
},
对象 {
"name": "C. H. Robinson Worldwide",
"symbol": "CHRW",
},
您应该在 React-Native 中使用如下所示的文本输入
<TextInput
style={styles.textinput}
placeholder="Search here"
placeholderTextColor="white"
value={state.search}
onChangeText={text=>updateSearch(text)}
/>
你应该使用 onChangeText
并且 updateSearch 应该像下面这样改变
updateSearch = (text) => {
setState({ search: text });
};
更新
这就是你的完整组件的样子,你可以试一试
function SearchScreen({ navigation }) {
const { ServerURL, addToWatchlist } = useStocksContext();
const [state, setState] = useState({
/* initial state here */
myListData: [],
});
const [search, setSearch] = useState('');
useEffect(() => {
renderWithData();
// FixMe: fetch symbol names from the servner and save in local SearchScreen state
}, []);
const updateSearch = (text) => {
setSearch(text);
};
renderWithData = () => {
return fetch('http://131.181.190.87:3001/all')
.then((res) => res.json())
.then((json) => {
setState({
isLoaded: true,
myListData: json,
});
setTimeout(() => {
console.log(state.myListData);
}, 10000);
});
};
let filteredItems = state.myListData.filter((item) => {
return (
item.symbol.toUpperCase().indexOf(search.toUpperCase()) !== -1 ||
item.name.indexOf(search) !== -1
);
});
let movies = filteredItems.map((val) => {
return (
<View key={val.symbol} style={styles.text}>
<Text style={styles.text}>{val.symbol}</Text>
<Text style={styles.text}>{val.name}</Text>
</View>
);
});
return (
<TouchableWithoutFeedback onPress={Keyboard.dismiss}>
<View style={styles.container}>
<TextInput
style={styles.textinput}
placeholder="Search here"
placeholderTextColor="white"
value={search}
onChangeText={(text) => updateSearch(text)}
/>
<Text>csdn</Text>
<View style={styles.text}>{movies}</View>
</View>
</TouchableWithoutFeedback>
);
}
我正在使用 React Native 和 Expo。我在屏幕 (iOS) 模拟器上有一些 JSON 数据是从 API 获取的。在顶部,我有一个搜索栏,用户可以在其中搜索屏幕上显示的数据。
例如,如果数据是
一个
一家公司
B
b公司
A 是公司代码,a company
是代码名称。因此,当用户键入 A 时,它应该显示 A
公司,如果用户键入 Z
,它应该显示 Z
公司。
我的代码:
import React, { useState, useEffect } from "react";
import {
StyleSheet,
View,
TouchableWithoutFeedback,
Keyboard,
FlatList,
TextInput,
Button,
Text,
} from "react-native";
import { useStocksContext } from "../contexts/StocksContext";
import { scaleSize } from "../constants/Layout";
import { Ionicons } from "@expo/vector-icons";
import { ListItem } from "react-native";
export default function SearchScreen({ navigation }) {
const { ServerURL, addToWatchlist } = useStocksContext();
const [state, setState] = useState({
/* initial state here */
myListData: [],
search: "",
});
useEffect(() => {
renderWithData();
// FixMe: fetch symbol names from the servner and save in local SearchScreen state
}, []);
updateSearch = (event) => {
setState({ search: event.target.value });
};
renderWithData = () => {
return fetch("http://131.181.190.87:3001/all")
.then((res) => res.json())
.then((json) => {
setState({
isLoaded: true,
myListData: json,
});
setTimeout(() => {
console.log(state.myListData);
}, 10000);
});
};
let filteredItems = state.myListData.filter((item) => {
return (
item.symbol.toUpperCase().indexOf(state.search.toUpperCase()) !== -1 ||
item.name.indexOf(state.search) !== -1
);
});
let movies = state.myListData.filteredItems.map((val) => {
return (
<View key={val.symbol} style={styles.text}>
<Text style={styles.text}>{val.symbol}</Text>
<Text style={styles.text}>{val.name}</Text>
</View>
);
});
return (
<TouchableWithoutFeedback onPress={Keyboard.dismiss}>
<View style={styles.container}>
<TextInput
style={styles.textinput}
placeholder="Search here"
placeholderTextColor="white"
value={state.search}
onChange={updateSearch.bind()}
/>
<Text>csdn</Text>
<View style={styles.text}>{movies}</View>
</View>
</TouchableWithoutFeedback>
);
}
const styles = StyleSheet.create({
textinput: {
color: "white",
height: "20",
fontSize: 18,
},
text: {
color: "white",
backgroundColor: "black",
},
flatstuff: {
color: "white",
},
// use scaleSize(x) to adjust sizes for small/large screens
});
我不确定我做错了什么,但如果我在 textinput 上输入内容,它不会显示任何内容(更像是搜索功能不起作用)并且我的数据仍然显示在屏幕上,除了我无法使用文本输入进行搜索。有人可以帮我吗?
编辑:json 数据
对象{
"name": "Chesapeake Energy",
"symbol": "CHK",
}, 对象 {
"name": "C. H. Robinson Worldwide",
"symbol": "CHRW",
},
您应该在 React-Native 中使用如下所示的文本输入
<TextInput
style={styles.textinput}
placeholder="Search here"
placeholderTextColor="white"
value={state.search}
onChangeText={text=>updateSearch(text)}
/>
你应该使用 onChangeText 并且 updateSearch 应该像下面这样改变
updateSearch = (text) => {
setState({ search: text });
};
更新
这就是你的完整组件的样子,你可以试一试
function SearchScreen({ navigation }) {
const { ServerURL, addToWatchlist } = useStocksContext();
const [state, setState] = useState({
/* initial state here */
myListData: [],
});
const [search, setSearch] = useState('');
useEffect(() => {
renderWithData();
// FixMe: fetch symbol names from the servner and save in local SearchScreen state
}, []);
const updateSearch = (text) => {
setSearch(text);
};
renderWithData = () => {
return fetch('http://131.181.190.87:3001/all')
.then((res) => res.json())
.then((json) => {
setState({
isLoaded: true,
myListData: json,
});
setTimeout(() => {
console.log(state.myListData);
}, 10000);
});
};
let filteredItems = state.myListData.filter((item) => {
return (
item.symbol.toUpperCase().indexOf(search.toUpperCase()) !== -1 ||
item.name.indexOf(search) !== -1
);
});
let movies = filteredItems.map((val) => {
return (
<View key={val.symbol} style={styles.text}>
<Text style={styles.text}>{val.symbol}</Text>
<Text style={styles.text}>{val.name}</Text>
</View>
);
});
return (
<TouchableWithoutFeedback onPress={Keyboard.dismiss}>
<View style={styles.container}>
<TextInput
style={styles.textinput}
placeholder="Search here"
placeholderTextColor="white"
value={search}
onChangeText={(text) => updateSearch(text)}
/>
<Text>csdn</Text>
<View style={styles.text}>{movies}</View>
</View>
</TouchableWithoutFeedback>
);
}