在 ReactJS 中滚动嵌套组件

Posted

技术标签:

【中文标题】在 ReactJS 中滚动嵌套组件【英文标题】:Scrolling Nested Componentsin ReactJS 【发布时间】:2019-04-08 10:13:58 【问题描述】:

滚动嵌套组件时遇到问题: 我已经在这里待了一个小时:/

我正在尝试在我的聊天屏幕的另一个组件中滚动列表。似乎没有办法做到这一点。 Refs 似乎没有在父级读取,如果我尝试直接访问子级,它只会获取加载 div,并且不会尝试在容器上设置 scrollTop。 我希望 this.list 在条目时向下滚动。有什么想法吗?

下面的代码示例:

<div className="chatroom" style=style ref=this.scroller>
        <h3>Chat Example</h3>
        <Query
          query=GET_MESSAGES
          variables= chatID, limit: LIMIT, cursor 
          fetchPolicy="network-only"
        >
          ( data, loading, error, subscribeToMore, fetchMore ) => 
            if (loading) 
              return <div style= height: "100%" >Loading</div>;
            

            if (error) 
              return <div>Error: error.message</div>;
            
            if (!unsubscribe) 
              unsubscribe = subscribeToMore(
                document: NEW_MESSAGE_SUB,
                variables:  chatID ,
                updateQuery: (prev,  subscriptionData ) => 
                  const  newMessageSubscribe  = subscriptionData.data;

                  if (!newMessageSubscribe) 
                    return prev;
                  
                  prev.getMessages.messages = [
                    ...prev.getMessages.messages,
                    newMessageSubscribe
                  ];

                  return prev;
                
              );
            

            return (
              <Fragment ref=this.container>
                <Waypoint
                  onEnter=( previousPosition ) =>
                    this.handleEnd(
                      previousPosition,
                      fetchMore,
                      data.getMessages.messages[
                        data.getMessages.messages.length - 1
                      ].createdAt
                    )
                  
                />
                <List className="chats" ref=this.list>
                  data.getMessages.messages.map(message => (
                    <Message key=message.id message=message />
                  ))
                  <List.Item />
                </List>
              </Fragment>
            );
          
        </Query>

        <InputForm chatID=chatID />
      </div>

【问题讨论】:

data, loading, error, subscribeToMore, fetchMore - 有你组件的 props 数据/状态数据吗? 查询中没有数据。 【参考方案1】:

您可能需要一种方法来了解您的 List 组件何时可以被访问。使用componentDidMount 通知父组件。

在父组件中:

...
render() 
  ...
  <List className="chats" ref=this.list onReady=this.handleListReady>
  ...

...

List

...
componentDidMount() 
  if (this.props.onReady) 
    this.props.onReady()
  

...

【讨论】:

对它的所有调用都在 DidMount 中。

以上是关于在 ReactJS 中滚动嵌套组件的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS - 如何将“全局”数据传递给深度嵌套的子组件?

ReactJs - 将带有嵌套 React 组件的原始 HTML 转换为 JSX

reactjs - jest 快照测试嵌套的 redux “连接”组件

父组件中的 Reactjs 按钮,在子组件中提交 Redux 表单

ReactJS学习笔记-组件嵌套与组件复用

如何使用 reactjs 和 graphql 在 gatsby 中映射嵌套数组