claudiopb
claudiopb

Reputation: 1100

Paginaton with ReactJS

I have this pagination app. And it is working successfully. You can see the app working in this link: https://codepen.io/PiotrBerebecki/pen/pEYPbY

class TodoApp extends React.Component {
  constructor() {
    super();
    this.state = {
      todos: ['a','b','c','d','e','f','g','h','i','j','k'],
      currentPage: 1,
      todosPerPage: 3
    };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick(event) {
    this.setState({
      currentPage: Number(event.target.id)
    });
  }

  render() {
    const { todos, currentPage, todosPerPage } = this.state;

    // Logic for displaying current todos
    const indexOfLastTodo = currentPage * todosPerPage;
    const indexOfFirstTodo = indexOfLastTodo - todosPerPage;
    const currentTodos = todos.slice(indexOfFirstTodo, indexOfLastTodo);

    const renderTodos = currentTodos.map((todo, index) => {
      return <li key={index}>{todo}</li>;
    });

    // Logic for displaying page numbers
    const pageNumbers = [];
    for (let i = 1; i <= Math.ceil(todos.length / todosPerPage); i++) {
      pageNumbers.push(i);
    }

    const renderPageNumbers = pageNumbers.map(number => {
      return (
        <li
          key={number}
          id={number}
          onClick={this.handleClick}
        >
          {number}
        </li>
      );
    });

    return (
      <div>
        <ul>
          {renderTodos}
        </ul>
        <ul id="page-numbers">
          {renderPageNumbers}
        </ul>
      </div>
    );
  }
}


ReactDOM.render(
  <TodoApp />,
  document.getElementById('app')
);

So I would like to change the initial array to a associative array, by putting a new key 'elements' like you can see below:

 "todos": {
  "elements":
['a','b','c','d','e','f','g','h','i','j','k']
},

How can I catch these datas after this change? I have tried this way:

const currentTodos = todos.map((t, index)=>{         
            t.elements.map((e,index)=>{             
                e.slice(indexOfFirstTodo, indexOfLastTodo);           
            })    
        })

And it didn't work

Upvotes: 0

Views: 96

Answers (2)

Ahsan Sohail
Ahsan Sohail

Reputation: 670

With this model todos is an object not an array and map() is the javascript function for array.

"todos": {
  "elements":
['a','b','c','d','e','f','g','h','i','j','k']
},

This will help you implement pagination with javascript skip take methods with javascript arrays

[Edit] Answer from the link best suited for your case

var ary = [0,1,2,3,4,5,6,7];
alert(ary.splice(0,3).join(','));

Upvotes: 0

UjinT34
UjinT34

Reputation: 4997

slice copies a portion of an array. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

You moved your array from todos to todos.elements. So you need to use slice on todos.elements:

const currentTodos = todos.elements.slice(indexOfFirstTodo, indexOfLastTodo);

Upvotes: 1

Related Questions