2017-01-09 4 views
4

Я пытаюсь создать динамические ссылки для пользовательских компонентов, созданных с помощью функции карты.React ref возвращает объект 'Connect' вместо DOM

class PostsList extends Component { 
 

 
    constructor(props) { 
 
    super(props); 
 
    } 
 

 
    componentDidUpdate =() => { 
 
    console.log(this.refs); 
 
    } 
 

 
    render() { 
 
    let posts = this.props.posts || []; 
 
    return (
 
     <div ref="test"> 
 
      {posts.map((post) => { 
 
      return <Post post={post} key={post.id} ref={post.id}></Post> 
 
      })} 
 
     </div> 
 
    ); 
 
    } 
 

 
} 
 

 
export default PostsList

console.log возвращает правильный узел DOM для refs.test, но и для тех, в петле, он возвращает объект Connect. Screenshot

Может кто-нибудь указать мне в правильном направлении?

ответ

10

Похоже, что Post является подключенным компонентом, в то время как вы действительно хотите обернутый.

Вы должны связаться с withRef: true:

connect(null, null, null, { withRef: true })(Post); 

затем использовать getWrappedInstance(), чтобы получить лежащий в основе компонента связности:

this.refs[<id>].getWrappedInstance() 

Из docs:

[withRef] (Boolean): If true, stores a ref to the wrapped component instance and makes it available via getWrappedInstance() method. Default value: false

+0

В моем 'Post.jsx', я добавил' экспорт по умолчанию подключения (mapStateToProps, NULL, NULL, {withRefs : true}) (Post); 'И когда я пытаюсь вызвать' getWrappedInstance() 'в моем PostList.jsx, он испускает ошибку' Ошибка: для доступа к завернутому экземпляру вам нужно указать {withRef: true} в options аргумент connect() call.' Редактировать: извините, я вижу свою ошибку сейчас, должен быть с Ref, а не с Refs –

0

Альтернативным способом сделать это было бы использование некоторых других пропусков e (кроме ref). Например:

<Post 
    ... 
    innerRef={(node) => { this.myRef = node; }} 
/> 

Это также работает, если вы используете библиотеку как styled-components или emotion

Смежные вопросы