2017-06-19 113 views
1

我试图从列表中传递一些行数据到下一个屏幕来显示细节,但似乎无法实现它。 这是导览时我是怎么过的道具:React Native:如何将道具从一个屏幕导航到另一个

_renderRow(row,sectionId, rowId, highlightRow) { 
 
     var self = this; 
 
     let navigate=this.props.navigation; 
 
       return (
 
      <TouchableOpacity onPress={() => navigate('ChatList',{row})}> 
 
      
 
........//ignored code

,而在另一屏幕ChatList.js:

import React, { Component } from 'react'; 
 
import { 
 
    StyleSheet, 
 
    Text, 
 
    View, 
 
    TouchableOpacity, 
 
    TextInput, 
 
    Image 
 
} from 'react-native'; 
 

 
import { StackNavigator } from 'react-navigation'; 
 

 

 
const ChatList =() => { 
 

 
    return ( 
 
    <View> 
 
    </View> 
 
); 
 
} 
 

 
ChatList.navigationOptions = { 
 
//trying to set the title from the data sent around here 
 
    title: 'ChatList Title', 
 
    headerStyle: { 
 
      backgroundColor: '#2196F3', 
 
     }, 
 
    headerTitleStyle: { 
 
     color: 'white', 
 
    }, 
 
    headerBackTitleStyle: { 
 
     color: 'white', 
 
    }, 
 
    headerTintColor: 'white', 
 
}; 
 

 

 
export default ChatList

另外要注意,不同于0,我对堆栈导航有不同的实现.Checkout我这里整个实施https://gist.github.com/SteveKamau72/f04b0a3dca03a87d604fe73767941bf2

这里是从_renderRow所在的满级:

ChatGroup.js 

/** ChatGroup.js**/ 
 
//This code is component for file App.js to display group of chats 
 
    
 
import React, { Component } from 'react'; 
 
import { 
 
    StyleSheet, 
 
    ListView, 
 
    Text, 
 
    View, 
 
    Image, 
 
    TouchableOpacity 
 
} from 'react-native'; 
 
    
 
const data = [ 
 
    { 
 
     name: "Kasarini", 
 
     last_chat: { 
 
      updated_at:"22:13", 
 
      updated_by: "Steve Kamau", 
 
      chat_message: "Lorem Ipsum is pretty awesome if you know it" 
 
     }, 
 
     thumbnail: "https://randomuser.me/api/portraits/thumb/men/83.jpg" 
 
    
 
    }, 
 
    { 
 
     name: "Kabete", 
 
     last_chat: { 
 
      updated_at:"20:34", 
 
      updated_by: "Tim Mwirabua", 
 
      chat_message: "Lorem Ipsum is pretty awesome if you know it" 
 
     }, 
 
     thumbnail: "https://randomuser.me/api/portraits/thumb/men/83.jpg" 
 
    
 
    }, 
 
    { 
 
     name: "Kiambuu", 
 
     last_chat: { 
 
      updated_at:"19:22", 
 
      updated_by: "Maureen Chubi", 
 
      chat_message: "Lorem Ipsum is pretty awesome if you know it" 
 
     }, 
 
     thumbnail: "https://randomuser.me/api/portraits/thumb/men/83.jpg" 
 
    
 
    }, 
 
    { 
 
     name: "UnderPass", 
 
     last_chat: { 
 
      updated_at:"17:46", 
 
      updated_by: "Faith Chela", 
 
      chat_message: "Lorem Ipsum is pretty awesome if you know it" 
 
     }, 
 
     thumbnail: "https://randomuser.me/api/portraits/thumb/men/83.jpg" 
 
    
 
    }, 
 
] 
 
    
 
export default class UserListView extends Component { 
 
    constructor() { 
 
     super(); 
 
     const ds = new ListView.DataSource({rowHasChanged: this._rowHasChanged}); 
 
    
 
     this.state = { 
 
      dataSource: ds.cloneWithRows(data) 
 
     } 
 
    } 
 
    render() { 
 
     return ( 
 
      <ListView 
 
       dataSource={this.state.dataSource} 
 
       renderRow={this._renderRow.bind(this)} 
 
       enableEmptySections={true} /> 
 
     ) 
 
    } 
 
    
 
    _renderRow(row,sectionId, rowId, highlightRow) { 
 
     var self = this; 
 
     return ( 
 
      <TouchableOpacity activeOpacity={0.9} onPress={() => navigate('ChatList',{ user: 'Lucy' })}> 
 
       <View style={styles.container}> 
 
        <Image 
 
          style={styles.groupChatThumbnail} 
 
          source={{uri: row.thumbnail}}/> 
 
        <View> 
 
         <View style={{flexDirection:'row', justifyContent:'space-between', width:280}}> 
 
           <Text style={styles.groupNameText}>{row.name} </Text> 
 
           <Text style={styles.groupUpdatedAtText}>{row.last_chat.updated_at}</Text> 
 
    
 
         </View> 
 
         <View style={{ flexDirection:'row', alignItems:'center', marginTop: 5}}> 
 
           <Text style={styles.groupUpdatedByText}>{row.last_chat.updated_by} : </Text>  
 
           <View style={{flex: 1}}> 
 
             <Text ellipsizeMode='tail' numberOfLines={1}style={styles.groupChatMessageText}>{row.last_chat.chat_message} </Text> 
 
           </View> 
 
         </View> 
 
        </View> 
 
         
 
       
 
       </View> 
 
      </TouchableOpacity> 
 
     ) 
 
    } 
 
    
 
    _rowHasChanged(r1, r2) { 
 
     return r1 !== r2 
 
    } 
 
    
 
    
 
     highlightRow() { 
 
    alert('Hi!'); 
 
    } 
 
    
 
} 
 
    
 
const styles = StyleSheet.create({ 
 
    container:{ 
 
     alignItems:'center', 
 
     padding:10, 
 
     flexDirection:'row', 
 
     borderBottomWidth:1, 
 
     borderColor:'#f7f7f7', 
 
     backgroundColor: '#fff' 
 
     }, 
 
     groupChatContainer:{ 
 
     display: 'flex', 
 
     flexDirection: 'row', 
 
     
 
     }, 
 
     groupNameText:{ 
 
     marginLeft:15, 
 
     fontWeight:'600', 
 
     marginTop: -8, 
 
     color: '#000' 
 
     }, 
 
     groupUpdatedAtText :{ 
 
     color:'#333', fontSize:10, marginTop: -5 
 
     }, 
 
     groupChatThumbnail:{ 
 
     borderRadius: 30, 
 
     width: 50, 
 
     height: 50 , 
 
     alignItems:'center' 
 
     }, 
 
     groupUpdatedByText:{ 
 
     fontWeight:'400', color:'#333', 
 
     marginLeft:15, marginRight:5 
 
     }, 
 
    
 
});

+0

您可以显示_renderRow属于哪个类的构造函数吗? – Ismailp

+0

如果你正在尝试在兄弟组件之间传递数据,这会是一个合理的解释吗? – SoZettaSho

+0

@Ismailp查看我的更新代码。 –

回答

7

有访问第二个屏幕上导航道具两种方式:

  1. 里面像

    navigationOptions = ({navigation}) => ({title:`${navigation.state.params.name}`}); 
    
  2. 如果任何方法内访问诸如渲染等是

    {user}= this.props.navigation.state.params 
    

ChatList.navigationOptions这可以写成像

ChatList.navigationOptions= ({navigation}) => ({// props access here }); 

const ChatList =()这里面你可以写this.props.navigation.state.params

+0

谢谢队友,解决了我的问题 –

+0

欢迎您 – Rahul

相关问题