组件渲染已触发,但DOM未更新

菲利波·卡拉布雷斯(Filippo Calabrese)

我的第一个React应用程序遇到了问题。实际上,我有一个组件层次结构(我正在创建一个多媒体电影画廊),单击选项卡(由Movie组件表示)时,这些组件必须显示单个电影的特定描述(SingleMovieDetails)。问题在于,仅在第一次单击时更新DOM,然后即使SingleMovieDetails道具发生更改,DOM仍会锁定在第一个渲染的电影上。

这是我到目前为止编写的代码...

//Movie component
import React from "react";
import styles from "./Movie.module.scss";
import PropTypes from "prop-types";

class Movie extends React.Component{
  constructor(props){
    super(props);
    this.imgUrl = `http://image.tmdb.org/t/p/w342/${this.props.movie.poster_path}`;
  }

  render(){
    if(!this.props.size)
    return <div onClick={this.props.callbackClick(this.props.movie.id)}
                name={this.props.movie.id}
                className={styles.movieDiv}
                style={{backgroundImage: `url(${this.imgUrl})`}}></div>;
    return <div onClick={() => this.props.callbackClick(this.props.movie.id)}
                name={this.props.movie.id}
                className={styles.movieDivBig}
                style={{backgroundImage: `url(${this.imgUrl})`}}></div>;
  }
}

Movie.propTypes = {
  movie: PropTypes.any,
  callbackClick: PropTypes.any
};
export default Movie;

SingleMovieDetails.js

import React from "react";
import styles from "./SingleMovieDetails.module.scss";

import Movie from "../Movie";
import SingleMovieDescription from "../SingleMovieDescription";
import MovieCast from "../MovieCast";
import SingleMovieRatings from "../SingleMovieRatings";

class SingleMovieDetails extends React.Component{
  constructor(props){
    super(props);
    console.log(props);
    this.state = props;
    console.log('constructor', this.state.movie)
  }

  render(){
    console.log('SMD', this.state.movie)
    return (
        <>
          <div className={styles.container}>
            <div className={styles.flayer}>
               <Movie size={'big'} movie={this.state.movie}/>
            </div>
            <div className={styles.description}>
              <SingleMovieDescription movie={this.state.movie}/>
              <MovieCast></MovieCast>
            </div>
            <div className={styles.ratings}>
              <SingleMovieRatings />
            </div>
          </div>
        </>
    );
  }
}

export default SingleMovieDetails;

MovieCarousel.js

import React from "react";
import PropTypes from "prop-types";
import Movie from "../Movie";
import styles from "./MovieCarousel.module.scss";
import SingleMovieDetails from "../SingleMovieDetails";

class MovieCarousel extends React.Component {
  constructor(props) {
    super(props);
    this.state = [];
    this.callbackClickMovie = this.callbackClickMovie.bind(this);
  }

  callbackClickMovie(id) {
    const singleMovieApi = `https://api.themoviedb.org/3/movie/${id}?api_key=b6f2e7712e00a84c50b1172d26c72fe9`;
    fetch(singleMovieApi)
      .then(function(response) {
        return response.json();
      })
      .then(data => {
        this.setState({ selected: data });
      });
  }

  render() {
    let details = null;
    if (this.state.selected) {
      details = <SingleMovieDetails movie={this.state.selected} />;
    }
    let counter = 6;
    let movies = this.props.movies.map(el => {
      let element = (
        <Movie movie={el} callbackClick={this.callbackClickMovie} />
      );
      counter--;
      if (counter >= 0) return element;
      return;
    });
    let content = (
      <>
        <h2 className={styles.carouselTitle}>{this.props.title}</h2>
        {movies}
        {details}
      </>
    );
    return content;
  }
}

MovieCarousel.propTypes = {
  children: PropTypes.any
};
export default MovieCarousel;

如果有人可以帮助我,我将不胜感激。我已经呆了两天,但我真的无法处理

玛雅克·舒克拉(Mayank Shukla)

这是因为在SingleMovieDetails组件中,您是在状态中存储props值,而不是在props更改时更新状态。constructor不会再被调用,因此state始终具有初始值。

您可以通过以下两种方法解决此问题:

  1. 直接使用props值,而不是以状态(首选方式)存储数据。像这样:

    class SingleMovieDetails extends React.Component {
      constructor(props) {
        super(props);
      }
    
      render() {
         return (
           <>
           <div className={styles.container}>
            <div className={styles.flayer}>
               <Movie size={'big'} movie={this.props.movie}/>
            </div>
            <div className={styles.description}>
              <SingleMovieDescription movie={this.props.movie}/>
              <MovieCast></MovieCast>
            </div>
            <div className={styles.ratings}>
              <SingleMovieRatings />
            </div>
          </div>
         </>
        );
      }
    }
    
  2. 使用getDerivedStateFromProps,并在更改道具时更新状态值。

Movie组件也存在相同的问题,请将此行放入render方法中,否则它将始终显示相同的图像:

const imgUrl = `http://image.tmdb.org/t/p/w342/${this.props.movie.poster_path}`

并使用此imgUrl变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从组件外部更新已渲染的ReactJS组件的正确方法

来自分类Dev

更新DOM与渲染角度视图

来自分类Dev

React-Router子路径渲染未触发正确的组件

来自分类Dev

渲染后获取React.refs DOM节点宽度,仅在width的值已更改时才触发重新渲染

来自分类Dev

反应渲染状态子组件变量未更新?

来自分类Dev

React.js:组件未渲染

来自分类Dev

React高阶组件会强制重新渲染已包裹的组件

来自分类Dev

React组件渲染两次且未触发useEffect

来自分类Dev

为什么未渲染我的updatedText组件?

来自分类Dev

vue-router出现问题,未渲染我的组件并且没有错误[已解决]

来自分类Dev

组件未渲染-动态路由反应

来自分类Dev

Vue组件未使用道具渲染

来自分类Dev

路线未渲染组件

来自分类Dev

在DOM中渲染React组件

来自分类Dev

角度检测组件的DOM完成渲染的时间

来自分类Dev

警告:渲染方法应该纯粹是props和state的函数;不允许从渲染器触发嵌套组件更新

来自分类Dev

子组件未渲染道具

来自分类Dev

强制反应功能组件触发重新渲染

来自分类Dev

子组件未渲染-反应

来自分类Dev

组件未渲染

来自分类Dev

从该组件外部更新已渲染的ReactJS组件的正确方法

来自分类Dev

DOM已更新,但其视图未呈现?

来自分类Dev

DOM未更新

来自分类Dev

Vuejs DOM 未更新

来自分类Dev

更新减速器中的状态如何触发组件的重新渲染?

来自分类Dev

VueJS 组件 DOM 在 AJAX Promise 后未更新

来自分类Dev

React 组件正在渲染但在状态更新时未更新

来自分类Dev

反应渲染功能未更新

来自分类Dev

组件的值未更新