如何创建“加载更多”'在React / Node中没有重新渲染整个组件的功能?

时间:2017-11-16 06:16:57

标签: node.js reactjs

我正在尝试创建一个简单的民意调查应用,您可以在其中进行新的民意调查。

在' MyPolls'部分中,我希望它只渲染我所做的前5次民意调查,而不是渲染整个民意调查列表。

在底部是“加载更多”'按钮,点击后,再加载5个民意调查,依此类推。

我一直在使用Mongoose / MongoDB后端,我的方法是使用skiplimit

我已设法实现此功能,但问题是整个组件重新渲染,这对用户来说很烦人,因为您必须再次向下滚动点击“加载更多”'按钮。

这是我的应用:https://voting-app-drhectapus.herokuapp.com/

(为方便起见,请使用这些登录详细信息: 用户名:riverfish@gmail.com 密码:123

然后转到My Polls页面。

MyPoll.js

import React, { Component } from 'react';
import { connect } from 'react-redux';
import * as actions from '../../actions';

class MyPolls extends Component {
  constructor(props) {
    super(props);
    this.state = {
      skip: 0
    };
  }

  componentDidMount() {
    this.props.fetchMyPolls(this.state.skip);
    this.setState({ skip: this.state.skip + 5 });
  }

  sumVotes(polls) {
    return polls.reduce((a, b) => {
      return a.votes + b.votes;
    });
  }

  loadMore(skip) {
    this.props.fetchMyPolls(skip);
    const nextSkip = this.state.skip + 5;
    this.setState({ skip: nextSkip });
  }

  renderPolls() {
    return this.props.polls.map(poll => {
      return (
        <div className='card' key={poll._id}>
          <div className='card-content'>
            <span className='card-title'>{poll.title}</span>
            <p>Votes: {this.sumVotes(poll.options)}</p>
          </div>
        </div>
      )
    })
  }

  render() {
    console.log('polls', this.props.polls);
    console.log('skip:', this.state.skip);
    return (
      <div>
        <h2>My Polls</h2>
        {this.renderPolls()}
        <a href='#' onClick={() => this.loadMore(this.state.skip)}>Load More</a>
      </div>

    );
  }
}

function mapStateToProps({ polls }) {
  return { polls }
}

export default connect(mapStateToProps, actions)(MyPolls);

行动创作者:

export const fetchMyPolls = (skip) => async dispatch => {
  const res = await axios.get(`/api/mypolls/${skip}`);

  dispatch({ type: FETCH_MY_POLLS, payload: res.data });
}

投票路线:

app.get('/api/mypolls/:skip', requireLogin, (req, res) => {

    console.log(req.params.skip);

    Poll.find({ _user: req.user.id })
      .sort({ dateCreated: -1 })
      .skip(parseInt(req.params.skip))
      .limit(5)
      .then(polls => {
        res.send(polls);
      });
  });

整个github回购:https://github.com/drhectapus/voting-app

我了解可能实施此功能的方法可能是最佳解决方案,因此我可以接受任何建议。

1 个答案:

答案 0 :(得分:2)

看起来重新渲染是由于点击“加载更多”链接实际上导致反应路由器导航到新路由,导致整个Sub Export_Allcahrts_ppt() Dim mypowerpoint As PowerPoint.Application Dim mypowerpoint_pres As PowerPoint.Presentation Dim myslide As PowerPoint.Slide Dim mychart As ChartObject Set mypowerpoint = New PowerPoint.Application mypowerpoint.Visible = msoTrue Set mypowerpoint_pres = mypowerpoint.Presentations.Add Set myslide = mypowerpoint_pres.Slides.Add(1, ppLayoutBlank) For Each mychart In Sheet1.ChartObjects mychart.Copy myslide.Shapes.PasteSpecial ppPasteBitmap With myslide.Shapes(myslide.Shapes.Count) .Top = 100 .Height = 200 .Left = 30 End With Next End Sub 组件重新渲染。

只需将MyPolls替换为<a href='#' onClick={...}>

如果您不想使用<button onClick={...}>,还可以将button功能更改为

onClick