2017-06-21 15 views
3

私はホームスクリーン、ブログのマスターリスト、そしてブログの詳細ページを持つシンプルなアプリを持っています。ホーム画面からブログリストまでナビゲートして、期待どおりに戻ることができます。ブログ記事の1つをクリックすると、アプリはそのページに移動してブログ記事をレンダリングします。しかし、私がブログマスターリストに戻ると、ブログ投稿はブログリストの一番下になります。そして、同じことをホームページに戻すと、ブログの投稿はホームページのグラフィックの背後にあるDOMにあります。Reactコンポーネントが別のページに移動した後にDOMに残るのはなぜですか?

私は反応ルータ4.1を使用しています。

私のルート設定と関連がありますか?

import React, { Component } from 'react' 
import { BrowserRouter as Router, Route } from 'react-router-dom' 
import NavBar from './components/NavBar' 
import Blog from './pages/blog' 
import Home from './pages/home' 
import Post from './pages/post' 
import './css/App.css' 

class App extends Component { 
    render() { 
    return (
     <Router> 
      <div className="App"> 
      <NavBar /> 
      <Route exact path='/' component={Home} /> 
      <Route path='/blog' component={Blog} /> 
      <Route path='/post/:slug' component={Post} /> 
      </div> 
     </Router> 
    ) 
    } 
} 

export default App 

またはマイポストコンポーネントと?

import React from 'react' 
import fetch from 'isomorphic-unfetch' 
import NavBar from '../components/NavBar' 
import dateUtils from '../utilities/DateAndTime' 

const classNames = require('classnames') 


class Post extends React.Component { 

    constructor(props) { 
     super(props) 

     this.state = { 
      blogObject: null, 
      fetchBlogObject: false 
     } 

     this.fetchBlogObject = this.fetchBlogObject.bind(this) 
     this.createMarkup = this.createMarkup.bind(this) 
     this.assignStyleToCoverImage = this.assignStyleToCoverImage.bind(this) 
     this.formatDateString = this.formatDateString.bind(this) 

    } 

    componentWillMount() { 
     this.fetchBlogObject() 
    } 


    componentWillReceiveProps() { 
     this.fetchBlogObject() 
    } 

    fetchBlogObject() { 

      console.log('fetching') 

      this.setState({ fetchBlogObject: true }) 

      fetch(`*******************`) 
      .then(response => response.json()) 
      .then((responseJson) => { 
       console.log(responseJson) 
       this.setState({ blogObject: responseJson.object }) 
      }) 


    } 


    createMarkup(stringToConvertToHtml) { 
     return { __html: stringToConvertToHtml } 
    } 


    assignStyleToCoverImage() { 

     const style = { 
      background: `url(${this.state.blogObject.metadata.hero.url})`, 
      height: '35vh', 
      backgroundSize: 'cover', 
      backgroundPosition: 'center' 
     } 

     return style 

    } 


    formatDateString(dateString) { 
     console.log(dateString) 

     const d = `${dateUtils.returnMonthFromISODateString(dateString)} ${dateUtils.returnDateNumberFromISOString(dateString)}, ${dateUtils.returnFullYearFromISOString(dateString)} by Phil Andrews` 
     return d 
    } 

    render() { 


     const postContainerClasses = classNames({ 
      'post-container': true 
     }) 

     const postBodyClasses = classNames({ 
      'post-body': true 
     }) 

     return (

      <div> 
       <NavBar /> 

       {this.state.blogObject ? 

        <div className={postContainerClasses} > 
         <div className='header-image' style={this.assignStyleToCoverImage(this.state.blogObject)} /> 
         <div className='post-body-padding'> 
          <div className='post-header-info'> 
           <h1 className='post-title'>{this.state.blogObject.title}</h1> 
           <h4 className='post-date'>{this.formatDateString(this.state.blogObject.created_at)}</h4> 
          </div> 
          <div className={postBodyClasses} dangerouslySetInnerHTML={this.createMarkup(this.state.blogObject.content)} /> 
         </div> 
        </div> 

       : <div>Loading...</div> 

       } 

      </div> 

     ) 

    } 
} 

export default Post 

またはPOSTのページに移動するための私のブログ一覧ボタンアクションと?

<Link id={this.props.blogObject.slug} to={`/post/${this.props.blogObject.slug}`}> 
    <button className='blog-button' style={buttonStyle} id={this.props.blogObject.slug} /> 
</Link> 

答えて

0

は、私はそれが全体のコンポーネントをレンダリングし続ける理由はわからないが、私はpostコンポーネントに<NavBar />を取り除く場合は問題が消えます。

を動作していない:

return (

      <div> 
       <NavBar /> 

       {this.state.blogObject ? 

        <div className={postContainerClasses} > 
         <div className='header-image' style={this.assignStyleToCoverImage(this.state.blogObject)} /> 
         <div className='post-body-padding'> 
          <div className='post-header-info'> 
           <h1 className='post-title'>{this.state.blogObject.title}</h1> 
           <h4 className='post-date'>{this.formatDateString(this.state.blogObject.created_at)}</h4> 
          </div> 
          <div className={postBodyClasses} dangerouslySetInnerHTML={this.createMarkup(this.state.blogObject.content)} /> 
         </div> 
        </div> 

       : <div>Loading...</div> 

       } 

      </div> 

     ) 

ワーキング

return (

      <div> 

       {this.state.blogObject ? 

        <div className={postContainerClasses} > 
         <div className='header-image' style={this.assignStyleToCoverImage(this.state.blogObject)} /> 
         <div className='post-body-padding'> 
          <div className='post-header-info'> 
           <h1 className='post-title'>{this.state.blogObject.title}</h1> 
           <h4 className='post-date'>{this.formatDateString(this.state.blogObject.created_at)}</h4> 
          </div> 
          <div className={postBodyClasses} dangerouslySetInnerHTML={this.createMarkup(this.state.blogObject.content)} /> 
         </div> 
        </div> 

       : <div>Loading...</div> 

       } 

      </div> 

     ) 
関連する問題