Как повторно отобразить родительский компонент из дочернего компонента

родительский компонент имеет тег p, который анимирует его внутренний текст. анимация работает, когда я обновляю страницу.

вот родительский компонент:

import React, { Component } from 'react';
import Child from './Child';

class Parent extends Component {
    rerender=()=>{
        this.forceUpdate()
    }
    render() {
        return (
            <div>
                <p className='animate-left'>Animation</p>
                <Child rerender = {this.rerender}/>
            </div>
        );
    }
}

export default Parent;

вот дочерний компонент:

import React, { Component } from 'react';

class Child extends Component {
    clickHandler=()=>{
        this.props.rerender()
    }
    render() {
        return (
            <div>
                <button onClick = {this.clickHandler}>Click</button>
            </div>
        );
    }
}

export default Child;

я хочу снова анимировать/перерисовать родительский компонент, нажав кнопку дочернего компонента. Как это сделать?

Можете ли вы предоставить animate-left подробно?

sdym 14.12.2020 09:47

@ Yung-DaLinLynda, я использую CSS-фреймворк под названием «W3.CSS». я удаляю «w3-» из имени класса. В css нет проблем. когда я обновляю страницу, анимация работает хорошо. но когда я нажимаю кнопку, она не работает. w3schools.com/w3css/…

Asif Biswas 14.12.2020 09:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
3 231
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны иметь state в родительском компоненте и передать это состояние дочернему компоненту:

import React, { Component } from "react";
import Child from "./Child";

class Parent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      counter: 0
    };
  }
  rerender = () => {
    this.forceUpdate();
  };
  forceUpdate = () => {
    this.setState((state) => ({
      counter: state.counter + 1
    }));
  };
  render() {
    console.info("got rendered");
    return (
      <div>
        <p className = "animate-left" key = {this.state.counter}>Animation</p>
        <Child rerender = {this.rerender} />
      </div>
    );
  }
}

export default Parent;

и в дочернем компоненте обновить это состояние:

import React, { Component } from "react";

class Child extends Component {
  clickHandler = () => {
    this.props.rerender();
  };
  render() {
    return (
      <div>
        <button onClick = {this.clickHandler}>Click</button>
      </div>
    );
  }
}

export default Child;

это не работает. но когда я нажимаю кнопку, печать console.info отображается, но анимация не работает

Asif Biswas 14.12.2020 10:09

Каково содержание класса animate-left?

Alan Omar 14.12.2020 10:12

.animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}}

Asif Biswas 14.12.2020 10:16

чтобы заставить анимацию добавить key = {this.state.counter} к тегу p, я отредактирую свой ответ.

Alan Omar 14.12.2020 10:56

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