【问题标题】:How to see the full details of particular member when it is clicked after search?如何在搜索后点击特定成员的完整详细信息?
【发布时间】:2021-10-23 19:56:23
【问题描述】:

我已经构建了一个搜索引擎,我能够成功获取数据,即我唯一想要做的是,只要选择搜索的字段,它就会显示详细信息。 (还有更多的细节,比如年龄,house_no 等。)就像另一个屏幕必须带有完整的细节。

我被困在这里,请帮帮我。这就像导航到具有完整详细信息的另一个屏幕现在我正在使用警报命令来显示我想要另一个屏幕的一些详细信息。谢谢。

import React, {useState, useEffect} from 'react';
import {
  SafeAreaView,
  Text,
  StyleSheet,
  View,
  FlatList,
  TextInput,
} from 'react-native';
import { db } from '../firebase';

const App = () => {
  const [search, setSearch] = useState('');
  const [filteredDataSource, setFilteredDataSource] = useState([]);
  const [masterDataSource, setMasterDataSource] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
        const data = await db
            .collection('Data')
            .get();
            setFilteredDataSource(data.docs.map((doc) => ({ ...doc.data(), id: doc.id })));
            setMasterDataSource(data.docs.map((doc) => ({ ...doc.data(), id: doc.id })));
    };
    fetchData();
}, []);

  const searchFilterFunction = (text) => {

    if (text) {
      const newData = masterDataSource.filter(
        function (item) {
          const itemData = item.FM_NAME_EN + item.EPIC_NO + item.MOBILE_NO
            ? item.FM_NAME_EN.toUpperCase() + item.EPIC_NO.toUpperCase() + item.MOBILE_NO
            : ''.toUpperCase();
          const textData = text.toUpperCase();
          return itemData.indexOf(textData) > -1;
      });
      setFilteredDataSource(newData);
      setSearch(text);
    } else {
      setFilteredDataSource(masterDataSource);
      setSearch(text);
    }
  };

  const ItemView = ({item}) => {
    return (
      <Text
        style={styles.itemStyle}
        onPress={() => getItem(item)}>
        {item.FM_NAME_EN}
        {'\n'}
        {item.GENDER.toUpperCase()}
      </Text>
    );
  };

  const ItemSeparatorView = () => {
    return (
      // Flat List Item Separator
      <View
        style={{
          height: 0.5,
          width: '100%',
          backgroundColor: '#C8C8C8',
        }}
      />
    );
  };

  const getItem = (item) => {
    alert('Name : ' + item.FM_NAME_EN + ' Epic_no : ' + item.EPIC_NO);
  };

  return (
    <SafeAreaView style={{flex: 1}}>
      <View style={styles.container}>
        <TextInput
          style={styles.textInputStyle}
          onChangeText={(text) => searchFilterFunction(text)}
          value={search}
          underlineColorAndroid="transparent"
          placeholder="Search Here"
        />
        <FlatList
          data={filteredDataSource}
          keyExtractor={(item, index) => index.toString()}
          ItemSeparatorComponent={ItemSeparatorView}
          renderItem={ItemView}
        />
      </View>
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  container: {
    backgroundColor: 'white',
  },
  itemStyle: {
    padding: 10,
  },
  textInputStyle: {
    height: 40,
    borderWidth: 1,
    paddingLeft: 20,
    margin: 5,
    borderColor: '#009688',
    backgroundColor: '#FFFFFF',
  },
});

export default App;

【问题讨论】:

  • 您好,能否分享一下minimal 可重现的示例。目前尚不清楚是什么问题。你说你可以window.alert 正确的结果,但我在你的代码中看不到任何window.alert。
  • @SinanYaman 它不是 window.alert 我正在构建一个移动应用程序兄弟,我只使用“alert”选项来查看警报框中的全部详细信息及其显示在 getItem 中。正如您在 getItem 中看到的那样。而不是警报,我想在另一个屏幕上查看该数据。感谢您回答我的问题。

标签: reactjs react-native react-native-android hybrid-mobile-app mobile-development


【解决方案1】:

首先,您必须创建 ItemDetails.js 作为新屏幕的新组件:

import React from 'react';
import {Text, View} from 'react-native';

const ItemDetails= () => {
  return (
    <View>
    <Text>ItemDetails screen</Text>
    </View>
  );
};

export default ItemDetails;

然后,确保安装 react native navigation 并去创建一个新屏幕:

 <Stack.Navigator
      screenOptions={{
        headerShown: false,
      }}>
      <Stack.Screen name="ItemDetails" component={ItemDetails} />
    </Stack.Navigator>

然后返回到应用程序组件并将您的 getItem 函数修改为:

   const getItem  = item => {
    navigation.navigate('ItemDetails', {item});
  };

这就是你告诉应用程序它必须移动到另一个屏幕的方式,并且你用它发送了特定的项目,现在让我们修改我们的 ItemDetails.js 以查看数据:

const ItemDetails = ({route}) => {
//console.log(route.params) so you can know how to access whatever you want to print
  return (
    <View>
            <Text>{route.params.item.item.FM_NAME_EN}</Text>
    </View>
  );
};

【讨论】:

  • @bazadough 谢谢你解决这个兄弟我真的很感激。再次感谢。
  • 正在工作的细节是路由到另一个屏幕,但是你可以在 setFilteredDataSource usestate 钩子中看到我的整个数据,我希望你显示的那个路由屏幕上的那个钩子我可以这样做吗????
  • 编辑: const getItem = item => { navigation.navigate('ItemDetails', {item, filteredDataSource}); };还有这个: const ItemDetails = ({route, filteredDataSource}) => { //console.log(route.params) 这样你就可以知道如何访问你想要打印的任何内容 //console.log(filteredDataSource) 来检查你是否在这个组件中得到它返回( {route.params.item.item.FM_NAME_EN} ); };
  • 感谢您的回复,但我仍有问题请查看 const ItemDetails = ({ route, filteredDataSource }) => { const [values, setValue] = useState("") // 控制台.log(route.params.filteredDataSource) const updateValue = () => { db.collection("Data") .doc(filteredDataSource.id) .update({...filteredDataSource, MOBILE_NO: values }) .then(function () { alert("手机号码更新成功") }) }
  • filteredDataSource 没有得到克隆我想在 doc() 中更新它,如您所见
【解决方案2】:

如果我正确理解了您的问题,您需要另一条路线:

首先,为新页面创建一个显示详细信息的组件:

ItemDetails.js:

import { useParams } from 'react-router-dom' //You will get the params from the url
import {useState, useEffect} from 'react'

export const ItemDetails = props => {
  const { id } = useParams()
  
  const [item, setItem] = useState(null)
  useEffect(() => {
    if(id){
      const itemSelected = /* get your item by id */
      setItem(itemSelected)
    }
  }, [id])

  return(
   <p> {item.name} </p>
   )
}

无论您在哪里定义路线:

import {ItemDetails} from './path/to/ItemDetails/'

<Switch>
   ...
   <Route exact path="/item/:id" component={ItemDetails} />
   ...
<Switch>

最后,用 react-router 链接包装你的 jsx:

import { Link } from 'react-router-dom'

...
return (
   <Link to={`/item/${item.id}`}>
      <Text
        style={styles.itemStyle}
        {item.FM_NAME_EN}
        {'\n'}
        {item.GENDER.toUpperCase()}
      </Text>
    </Link>
    );

【讨论】:

  • 感谢您的回复,我很感激,但是兄弟,我正在为 React Native 构建应用程序,您已经发送了 React.js 的代码,这让我有点困惑。感谢您的回复我想要反应原生的解决方案。
猜你喜欢
  • 2012-05-29
  • 2013-03-13
  • 2020-06-28
  • 2020-11-16
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
相关资源
最近更新 更多