Можно ли передать значение функции в компонент в react-native?

#react-native

Вопрос:

У меня есть приложение, которое отображает пользователей, и я хочу показывать дополнительную информацию всякий раз, когда нажимаю на пользователя.

 class DetailsUsersScreen extends Component  {
    constructor(){
    super()
      this.state = {
      users:[]
      };

    expandDetail = () => {
        this.setState(previousState => ({ content: !previousState.content}))}
        
    getUsers = async() => {
      const res = await Http.instance.get("random link which retrieves a set of users")
      this.setState({users:res, allClients:res})
  
    getUserId = (item) => {
      const userInfo = item
      return userInfo
    
  }
    render() {
    
    const {users} = this.state
    
      return (
      
      <View>
                {this.state.content ?
              <View style={{shadowOffset: {
                                width: 0,
                                height: 3,
                              },
                              marginTop: 20,
                              backgroundColor:'#48555D',
                              shadowOpacity: 0.7,
                              shadowRadius: 4.65,
                              elevation: 3,
                              paddingTop: 10,
                              paddingHorizontal: 10,
                              borderRadius: 5
                              }}>
                <View  style={{flex: 0.8, flexDirection: 'row', flexWrap: 'wrap', margin:10, justifyContent: 'space-between', backgroundColor:'green' }}>
                  <Text style={styles.titleText}>Today </Text>
                  <Image source={require('../../assets/download.png')} />
                </View>
                <View style={{paddingTop:30}}>
                <FlatList
                  data={users}
                  renderItem={({item}) => (
                    <TouchableHighlight activeOpacity={0.9} underlayColor="#7a7a7a" onPress={()=>{this.expandDetail(),this.getUserId(item)}}>
                      <View style={{flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'space-between', paddingBottom: 15}}>
                        <View>
                          <Text style={styles.nIdentifyText}>{item.metadata.fingerid}</Text>
                          <Text style={styles.nameText}>{item.name}</Text>
                          <Text style={styles.emailText}>{item.email}</Text>
                        </View>
                        <View>
                          <Text style={styles.typeText}>{item.type}</Text>
                          <Text style={styles.emailText}>{item.fecha}</Text>
                          <Text style={styles.dateText}>{item.datetime}</Text>

                        </View>
                      </View>
                    </TouchableHighlight>
                  )
                
                }
                /> 
          
                </View>
                
              </View>:<UserDetailExpanded>
          </UserDetailExpanded>}
      )
    }
 }             

Этот код показывает пользователей, которых я получаю по URL-адресу. Обратите внимание, что я также использую метод, при котором я скрываю весь плоский список, как только нажимаю на пользователя, вот где появляется строка «{this.state.content?…». Компонент <UserDetailExpanded/> в конце кода-это компонент, который я хочу показать, как только скрою весь плоский список, в котором отображается дополнительная информация о пользователе, которого я только что щелкнул. Его содержание на данный момент:

 import React, { Component } from "react";
import { View, Text, Button } from "react-native"

class UserDetailExpanded extends Component {

    render() {
        return (
            <View>
                <Text>Hello World</Text>
            </View>
        )
    }
}

export default UserDetailExpanded; 

Моя логика такова: как только я нажимаю на пользователя из плоского списка, я выполняю вызываемую функцию expandDetail() , которая скрывает весь плоский список. Как только он скрывается, я также выполняю функцию, связанную с нажатием кнопки пользователя, которая извлекает данные пользователя, которые есть getUserId() , и я хочу передать эти данные компоненту с именем в конце <UserDetailExpanded/> и показать информацию внутри компонента. Есть ли способ? Спасибо.

Ответ №1:

Было бы лучше сделать это с помощью библиотеки навигации, такой как react-навигация, таким образом, пользователи смогут нажимать назад, чтобы вернуться к списку, но допустим, вы хотите сделать все это на одном экране.

Это также в целом было бы проще как функциональный компонент, но давайте оставим его классом.

начните с добавления переменной состояния selectedUser: null

визуализация становится

 render (){
const { users, selectedUser } = this.state
if(!selectedUserId) return <UserDetailExpanded user={selectedUser} />
return (
 // this is where your current flatlist goes
)
 

}

тогда ваш onPress в вашем плоском списке должен выглядеть так

 onPress={() => this.setState({ ...state, selectedUser: item )}
 

затем в вашем компоненте UserDetailExpanded вы можете получить доступ ко всему, что есть в пользователе, вы можете увидеть это, добавив несколько журналов, поэтому измените его на этот

 class UserDetailExpanded extends Component {
    console.log(this.props.user)
    render() {
        return (
            <View>
                <Text>Hello World</Text>
            </View>
        )
    }

}
 

наконец, если вы хотите иметь возможность вернуться к компоненту UserDetailExplained, вы можете создать функцию внутри экрана DetailsUsersScreen, которая выглядит следующим образом

goBackToList() { this.setState({ …состояние, выбранный пользователь: null )} }

затем в конструкторе вы должны добавить

 this.goBackToList = this.goBackToList.bind(this);
 

затем вы можете обновить

 <UserDetailExpanded user={selectedUser} />
 

Для

 <UserDetailExpanded user={selectedUser} goBack={goBackToList} />
 

а затем внутри вашего UserDetailExpanded вы можете добавить кнопку с надписью onPress, которая выглядит следующим образом

 onPress={this.props.goBack}