Неверное значение отображается при вызове родительской функции из дочернего Reactjs

Я пытаюсь вызвать родительскую функцию из дочернего компонента с динамическим значением, но значение всегда показывает 80. Вот код:

Родитель:

filterdata = (child) =>{
        alert(child) // this is always showing 80
        this.setState({
            max:child
        })

    }

Внутри render():(characters данные получены из axios)

<Pagination pages = {Math.ceil(this.state.characters.length/10)} filter = {this.filterdata} />

Внутри Pagination.js

import React, { Component } from 'react'

class Pagination extends Component {
    
    render() {
        
        var indents = [];
for (var i = 0; i < this.props.pages; i++) {
  indents.push( <li key = {i} className = "page-item"><a class = "page-link"  onClick = {() => this.props.filter((i+1)*10)}>{i+1}</a></li>);
}

        return (
            
            <div>

  <ul class = "pagination justify-content-center">

{indents}
  
  </ul>

                
            </div>
        )
    }
}

export default Pagination

Я думаю, что вы не должны делать цикл в рендере, лучше сделать это в функции, вызываемой при монтировании компонента

VersifiXion 22.12.2020 15:22

@MarcCharpentier, как это сделать, потому что вчера я начал учиться реагировать

aryanknp 22.12.2020 15:24

Но я получаю правильную нумерацию страниц от 1 до 7

aryanknp 22.12.2020 15:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как сказал Марк, я не думаю, что вам следует делать цикл внутри рендера.

import React, { Component } from 'react'

class Pagination extends Component {
    constructor(props) {
        super(props);
        this.state = { indents: [] };
    }
    componentDidMount() {
        vat indents = [];
        for (var i = 0; i < this.props.pages; i++) {
            indents.push(<li key = {i} className = "page-item"><a class = "page-link"  onClick = {() => this.props.filter((i+1)*10)}>{i+1}</a></li>);
        }
        this.setState({ indents: indents });
    }
    render() {
        return (
            <div>
                <ul className = "pagination justify-content-center">
                    {indents}
                </ul>
            </div>
        )
    }
}

export default Pagination

Кроме того, вы используете class вместо className для элемента ul.

Ваш второй пример не будет работать. Страницы — это число, а не массив.

David Frederick 22.12.2020 15:49

Сначала отображается неожиданный токен, ожидался конструктор

aryanknp 22.12.2020 15:50

@DavidFrederick хорошая мысль. Я полностью пропустил это. Я удалю это.

Dillan Wilding 22.12.2020 15:51

@aryanagarwal исправил это. С моей стороны это была плохая работа по копированию/вставке. Код должен был быть внутри функции рендеринга, а я случайно вставил его раньше.

Dillan Wilding 22.12.2020 15:54
Like Marc said, I don't think you should do the loop inside render, но вы все еще пишете цикл внутри рендера, и ваш код такой же, как у меня
aryanknp 22.12.2020 15:56

@aryanagarwal Я отвечаю более чем на один вопрос одновременно, разговариваю и теряю то, что делал. Да, я исправил это. Надеюсь, в этот раз я ничего не пропустил.

Dillan Wilding 22.12.2020 16:02

@DillanWilding Спасибо за твои усилия, чувак.

aryanknp 22.12.2020 16:05
Ответ принят как подходящий

Я бы изменил ваш компонент, чтобы он выглядел так для краткости. Однако, как говорили другие, вы можете передать логику генерации li методу в вашем классе позже, если класс станет больше. Однако это не то, что вызывает вашу проблему.

Я не уверен, что вызывает константу 80, но этот код работает для меня.

в App.js

import Pagination from 'wherever it comes from';
import React from 'react';

class App extends Component {
  state = { max: null }

  render() {
    return (
      <div className = "App">
        <Pagination pages = {5} filter = {(val) => {
          console.info(val);
          this.setState({ max:val });
        }} />
      </div>
    )

  }
}

Пагинация.js

import React, { Component } from 'react';

class Pagination extends Component {
    render() {
        return (
            <div>
                <ul className = "pagination justify-content-center">
                    {Array(this.props.pages)
                        .fill()
                        .map((el, index) => {
                            const valueForFilter = (index + 1) * 10;
                            return (
                                <li key = {index} className = "page-item">
                                    <a class = "page-link" href = "#" onClick = {() => this.props.filter(valueForFilter)}>
                                        {index + 1}
                                    </a>
                                </li>
                            );
                        })}
                </ul>
            </div>
        );
    }
}

export default Pagination;

Большое спасибо, чувак, еще один вопрос, это Array(this.props.pages).fill() создает массив?

aryanknp 22.12.2020 16:04

@aryanagarwal Да. Array() принимает число, определяющее длину массива, затем fill() принимает все, что вы хотите заполнить, или вы можете оставить его пустым, чтобы заполнить его нулем. Вы не можете сопоставить массив перед использованием .fill(), если вы используете Array() для его создания.

David Frederick 22.12.2020 16:07

Другие вопросы по теме