2017-04-18 97 views
0

我是一個非常新的反應... 我有一個父組件,代表我的webapp的背景。當用戶導航到不同的路由時,我使用Match-from react-router來處理。比賽後改變父母背景

新的路由呈現PageView組件,我想擁有不同的背景圖片。因此,要做到這一點,我設置它的背景圖像的父母從父傳遞一個函數來他的孩子的道具,然後調用它的孩子從componentDidMount()

這不工作,並給了我Maximum call stack exceeded錯誤

這裏是我的父組件:

class App extends Component { 
    constructor() { 
    super() 
    this.state = { 
     backgroundImage: '../public/img/initial.jpg' 
    } 

    this.changeBackground = this.changeBackground.bind(this) 
    } 
    changeBackground (backgroundImage) { 
    this.setState({ 
     backgroundImage 
    }) 
    } 
    render() { 
    return (
     <BrowserRouter> 
     <Provider store={store}> 
      <div className='app' style={{backgroundImage: `url(${this.state.backgroundImage})`}}> 
      <div className='overlay'> 
       <Match exactly pattern='/' component={() => <Landing />} 
       /> 
       <Match 
       pattern='/healthcare' 
       component={(props) => <PageView descriptionText='Healthcare Solutions' 
        backgroundImage='../public/img/5.png' changeParentBackground={this.changeBackground} {...props} />} 
       /> 
       <Match 
       pattern='/officeofthefuture' 
       component={(props) => <PageView descriptionText='Office of the Future' 
        backgroundImage='../public/img/1.png' changeParentBackground={this.changeBackground} {...props} />} 
       /> 
      </div> 
      </div> 
     </Provider> 
     </BrowserRouter> 
    ) 
    } 
} 

這裏是我的孩子組成的瀏覽量

class PageView extends Component { 
    componentDidMount() { 
    const { backgroundImage, changeParentBackground } = this.props 
    changeParentBackground(backgroundImage) 
    } 
    render() { 
    const { descriptionText } = this.props 
    console.log(this.props.changeParentBackground) 
    return (
     <div className='outerDiv'> 
     <LeftDesign show /> 
     <RightDesign descriptionText={descriptionText} /> 
     </div> 
    ) 
    } 
} 

RightDesign:

class RightDesign extends Component { 
    render() { 
    const { descriptionText } = this.props 
    return (
     <div className='rightDiv'> 
     <div id='bigCircle'> 
      <div className='bigCircleTextDiv'> 
      <h1 className='bigCircleText'>{descriptionText}</h1> 
      </div> 
     </div> 
     </div> 
    ) 
    } 
} 

LeftDesign

class LeftDesign extends Component { 
    constructor (props) { 
    super(props) 
    const { show } = this.props 
    this.state = {show} 
    } 
    render() { 
    return (
     <div className='leftDivContainer'> 
     <div className='leftDiv'> 
      {this.state.show && <WelcomeMsg />} 
     </div> 
     </div> 
    ) 
    } 
} 
+0

這段代碼看起來不錯,我認爲問題出現在LeftDesign或RightDesign組件中,您是否也可以顯示這些組件? –

+0

@MayankShukla請參閱已編輯的問題我添加了組件 – coder4lyf

+0

因此,您可以讀取父級的Location屬性對象以確定您所在的頁面。將'this.props.location.pathname'拆分'/',並拉第二個數組項以查找第一級路由字符串,並使用switch語句確定背景圖像。 –

回答

0

我剛纔評論對這樣的解決方案。

它使用CSS背景圖像和轉換來切換圖像,該圖像基於位置路徑名的第二項的字符串,該字符串對應於應用程序的第一級路線。

function getBackground(array) { 
    switch(array[1]) { 
    case 'healthcare': 
    return 'www.foo.com/image/1.jpg'; 
    case 'officeofthefuture': 
    return 'www.foo.com/image/2.jpg'; 
    default: 
    return 'www.foo.com/image/default.jpg' 
    } 
} 

export default class Parent extends Component { 
    render() { 
    let { location } = this.props; 

    // Split the pathname string into an array of sub-paths 
    let locationArray = location ? location.pathname.split('/') : []; 

    // Determine the Background URL 
    let backgroundUrl = getBackground(locationArray); 
    // Define the Parent Style 
    const parentStyle = { 
    transition: 'all 0.2s ease-out', 
    backgroundImage: "url('"+backgroundUrl+"')", 
    backgroundPosition: 'center', 
    backgroundSize: 'contain', 
    backgroundRepeat: 'no-repeat' 
    }; 
    return <div style={parentStyle}> 
      {this.props.children} 
      </div> 
    } 
} 
+0

謝謝!這工作..但有一個問題。當我刷新任何路由時,我收到以下警告:warning.js:36警告:React試圖在容器中重複使用標記,但校驗和無效。這通常意味着您正在使用服務器呈現以及生成的標記服務器並不是客戶期望的,React注入了新的標記來補償哪些工作,但是你已經失去了服務器渲染的很多好處,而是要弄清楚爲什麼生成的標記是......「如何解決? – coder4lyf

+0

你使用服務器端渲染(通用/同構)嗎? –

+0

Universal rendering – coder4lyf