2017-02-03 2 views
4

나는 comments과 아마도 subcomments의 목록을 댓글에 표시하려면 ListView을 사용하고 있습니다. ref을 통해 특정 subcomment으로 스크롤하려고하는데 작동하도록 가져올 수 없습니다.React Native - ListView를 중첩 된 하위 참조로 스크롤 하시겠습니까?

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

const subComments = [ 
    {id: '1', body: 'subcomment 1'},{id: '2', body: 'subcomment 2'},{id: '3', body: 'subcomment 3'},{id: '4', body: 'subcomment 4'},{id: '5', body: 'subcomment 5'},{id: '6', body: 'subcomment 6'},{id: '7', body: 'subcomment 7'},{id: '8', body: 'subcomment 8'},{id: '9', body: 'subcomment 9'},{id: '10', body: 'subcomment 10'}, 
    {id: '11', body: 'subcomment 11'},{id: '12', body: 'subcomment 12'},{id: '13', body: 'subcomment 13'},{id: '14', body: 'subcomment 14'},{id: '15', body: 'subcomment 15'},{id: '16', body: 'subcomment 16'},{id: '17', body: 'subcomment 17'},{id: '18', body: 'subcomment 18'},{id: '19', body: 'subcomment 19'},{id: '20', body: 'subcomment 20'}, 
    {id: '21', body: 'subcomment 21'},{id: '22', body: 'subcomment 22'},{id: '23', body: 'subcomment 23'},{id: '24', body: 'subcomment 24'},{id: '25', body: 'subcomment 25'},{id: '26', body: 'subcomment 26'},{id: '27', body: 'subcomment 27'},{id: '28', body: 'subcomment 28'},{id: '29', body: 'subcomment 29'},{id: '30', body: 'subcomment 30'}, 
    {id: '31', body: 'subcomment 31'},{id: '32', body: 'subcomment 32'},{id: '33', body: 'subcomment 33'},{id: '34', body: 'subcomment 34'},{id: '35', body: 'subcomment 35'},{id: '36', body: 'subcomment 36'},{id: '37', body: 'subcomment 37'},{id: '38', body: 'subcomment 38'},{id: '39', body: 'subcomment 39'},{id: '40', body: 'subcomment 40'}, 
    {id: '41', body: 'subcomment 41'},{id: '42', body: 'subcomment 42'},{id: '43', body: 'subcomment 43'},{id: '44', body: 'subcomment 44'},{id: '45', body: 'subcomment 45'},{id: '46', body: 'subcomment 46'},{id: '47', body: 'subcomment 47'},{id: '48', body: 'subcomment 48'},{id: '49', body: 'subcomment 49'},{id: '50', body: 'subcomment 50'}, 
    {id: '51', body: 'subcomment 51'},{id: '52', body: 'subcomment 52'},{id: '53', body: 'subcomment 53'},{id: '54', body: 'subcomment 54'},{id: '55', body: 'subcomment 55'},{id: '56', body: 'subcomment 56'},{id: '57', body: 'subcomment 57'},{id: '58', body: 'subcomment 58'},{id: '59', body: 'subcomment 59'},{id: '60', body: 'subcomment 60'}, 
    {id: '61', body: 'subcomment 61'},{id: '62', body: 'subcomment 62'},{id: '63', body: 'subcomment 63'},{id: '64', body: 'subcomment 64'},{id: '65', body: 'subcomment 65'},{id: '66', body: 'subcomment 66'},{id: '67', body: 'subcomment 67'},{id: '68', body: 'subcomment 68'},{id: '69', body: 'subcomment 69'},{id: '70', body: 'subcomment 70'} 
]; 

export default class CommentListItem extends Component { 
    rowz = []; // to hold subComment refs for scroll access 

    subCommentsList =() => { 
    return subComments.map((subComment, i) => { 
     return (
     <View ref={i => this.rowz["subComment_"+subComment.id] = i} key={"subComment_"+subComment.id}> 
      <Text>{subComment.body}</Text> 
     </View> 
    ); 
    }); 
    } 

    render() { 
    const comment = this.props.comment; 

    return (
     <View> 
     <Text>{comment.body}</Text> 
     {comment.hasSubComments && this.subCommentsList()} 
     </View> 
    ) 
    } 
} 
CommentListItem

1. 주석

import React, { Component } from 'react' 
import { TouchableOpacity, ListView, View, Text } from 'react-native' 
import CommentRow from './commentRow' 

const ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1.id !== r2.id }); 
const commentsDataSource = [ 
    {id: '1', body: 'comment 1'},{id: '2', body: 'comment 2'},{id: '3', body: 'comment 3'},{id: '4', body: 'comment 4'},{id: '5', body: 'comment 5'},{id: '6', body: 'comment 6'},{id: '7', body: 'comment 7'},{id: '8', body: 'comment 8'},{id: '9', body: 'comment 9'},{id: '10', body: 'comment 10'}, 
    {id: '11', body: 'comment 11'},{id: '12', body: 'comment 12', hasSubComments: true},{id: '13', body: 'comment 13'},{id: '14', body: 'comment 14'},{id: '15', body: 'comment 15'},{id: '16', body: 'comment 16'},{id: '17', body: 'comment 17'},{id: '18', body: 'comment 18'},{id: '19', body: 'comment 19'},{id: '20', body: 'comment 20'} 
]; 

export default class Comments extends Component { 
    constructor(props) { 
     super(props); 

     this.state = { 
     dataSource: ds.cloneWithRows(commentsDataSource) 
     }; 
    } 

    scrollToSubCommentRef(ref) { 
     this.rowz[ref].measure((ox, oy, width, height, px, py) => { 
     const offsetY = oy; 
     this.refs.mainListView.scrollTo({ y: offsetY }) 
     }); 
    } 

    render() { 
     return (
     <View> 
      <TouchableOpacity style={{backgroundColor: 'red', padding: 50}} 
           onPress={() => this.scrollToSubCommentRef('subComment_10')}> 
       <Text>Scroll to subComment_10!</Text> 
      </TouchableOpacity> 

      <ListView ref="mainListView" 
         renderRow={comment => <CommentRow comment={comment} />} 
         dataSource={this.state.dataSource} 
         enableEmptySections={true} /> 
     </View> 
    ) 
    } 
} 

2 CommentRow

import React, { Component } from 'react'; 
import { View } from 'react-native' 
import CommentListItem from './commentListItem' 

export default class CommentRow extends Component { 
    render() { 
     const comment = this.props.comment; 

     return (
     <View key={`comment_${comment.id}`} style={{overflow: 'hidden'}}> 
      <CommentListItem comment={comment} /> 
     </View> 
    ) 
    } 
} 

3. I 이것을 달성하기 위해 (이하 졸인) 3 개 성분을 사용

부모 구성 요소에서 # 1 을 사용하여 subComment으로 스크롤하려고 시도했지만 측정 값이 정의되지 않았습니다. 나는 subComments지도의 각 subComment을 반복하고는 rowz 배열에 할당 곳 this.rowz 그냥 #3#1에 존재하지 않는 이해 (나는 그냥 어떤 이유로 rowz 배열에 subComment_idhere를 할당하지 않습니다 실현).

그래서 우리가 어떻게 #3지도에서 ref 할당 문제 때문에 rowz 배열 refs 그래서 우리는 그들에게 스크롤 할 수있는 모든 subComment의 목록을 가져옵니다 해결할 수 있습니까? 그리고 TouchableOpacitythis.scrollToSubCommentRef('subComment_10')으로 # 1으로 설정하면 mainListViewsubComment_10으로 스크롤 할 수 있습니까?

UPDATE 제공되는 솔루션을

ref 성공적으로 rowz 배열로 전달됩니다,하지만 당신은 알 수 있습니다, 그것은, subComment_10로 이동하지 않는 대신이 comment 10의 맨 아래로 스크롤합니다. 그것은이 TouchableHighlight의 클릭의 상단 가장 눈에 띄는 subComment입니다 그래서 subComment_10의 상단으로 스크롤해야합니다

enter image description here

+0

: subCommentsList =() => { REF = {subComment => this.rows [ "subComment _"+ subComment.id = subComment} 는 말할 수 PARAMS 및 REF 함수 subComment의 PARAM에 subComment 여부 혼합 되나요? – eden

+0

무슨 뜻인지 모르겠지만, ** # 3 ** 상단의'rows' 배열은 언급 한'ref' 함수에 의해 할당 될 때'subcomments'의리스트를 가지고 있습니다. 그래서'subcomment_10'라는 ref가 행 배열. – Wonka

+0

subComments.map에는 ref 익명 화살표 함수와 같은 이름의 매개 변수가 있습니다. 나는 그것이 갈등을 일으킬 수 있다고 생각했다. 그러나 기능이 예상대로 작동하고 있음을 확신합니까? – eden

답변