2016-09-20 37 views
2

Im試圖顯示React中的一個或另一個組件。點擊時我可以顯示一個組件,但我無法顯示其他組件。顯示組件是否爲true,否則顯示其他組件(在React中)

陣營代碼:

import React, { Component } from 'react' 
import { Motion, spring } from 'react-motion' 

import Header from '../../components/services/Header' 
import ServiceSelector from '../../components/services/ServiceSelector' 
import PriceCalculator from '../../components/services/PriceCalculator' 
import VVSRequest from '../../components/services/VvsRequest' 
import VVSFeatures from '../../components/services/VVSFeatures' 
import GalleryPreview from '../../components/services/GalleryPreview' 
import Footer from '../../components/services/Footer' 

require('styles/_servicesPage/services.css') 
require('styles/_servicesPage/serviceSelector.css') 
var ReactCSSTransitionGroup = require('react-addons-css-transition-group'); 

export default class Services extends Component { 

    componentWillMount() { 
    this.state = { 
     showPriceCalculator: false 
    } 
    } 

    handleClick(e) { 
    const userChoice = e.target.className 
    this.setState({ userChoice }) 
    } 

    toggleDiv(toggle) { 
    console.log('te',toggle); 
    this.setState({showPriceCalculator: toggle}) 
    } 

    render() { 
    var styleVar = { 
     backgroundImage: 'url(assets/images/services/service_bg.jpg)' 
    } 

    return (
     <div> 
     <Header /> 
     <ServiceSelector toggleDiv={this.toggleDiv.bind(this)}/> 

     {this.state.showPriceCalculator ? 
      <PriceCalculator toggleDiv={this.toggleDiv.bind(this)}/> : <VVSFeatures />} 

      {/*<VVSFeatures /> 
      <VVSRequest />*/} 

     <GalleryPreview /> 
     <Footer /> 
     </div> 
    ) 
    } 
} 

在負載它顯示了

<VVSFeatures /> 

,因爲它應該

但狀態被設置爲

showPriceCalculator: true 

然後後是再次設置爲false,noth發生(應該再次出現)

它以正確的狀態值恢復,但沒有任何反應。 什麼可能是錯的?

謝謝!

+0

你100%肯定的狀態是正確的?另外,我不知道你在哪裏使用'handleClick',但'this.setState({userChoice})'可能會覆蓋你的狀態。也許在渲染內部放置一個console.log的狀態,這樣你就可以在每一點看到它來仔細檢查?代碼的哪部分將其設置爲false? – ajmajmajma

+0

你怎麼知道'它以正確的狀態退縮'?你可以在'render(){'之後做'console.log('showPriceCalculator:',this.state.showPriceCalculator)',讓我們知道你看到了正確的值嗎? –

+0

是的,我在渲染方法內註銷了狀態,當我從ServiceSelector將其設置爲true時,我打印出true,並且當我將它從PriceCalculator組件設置爲false時,它將打印爲false。 – AlfredO

回答

-1

我將值設置爲「真」作爲參數,即一個字符串不是布爾

-1

切換值可能來自ServiceSelector組件或PriceCalculator,我認爲這會導致不一致的結果。考慮ServiceSelector調用this.props.toggleDiv(true)時的情況,然後PriceCalculator組件也調用this.props.toggleDiv(true)。你實際上並沒有切換。控制的狀態分散在不同的地方。事實上,你不需要從任何這些組件發送任何切換參數。

你可以只

toggleDiv() { 
    this.setState({showPriceCalculator: !this.state.showPriceCalculator}) 
    } 
+0

你好downvoter,你能否解釋downvote的原因? –

+0

我同意,命名是有點關閉。原因是如果我按一個div,它應該只能設置爲true,反之亦然。但是這不能幫助父組件不重新渲染組件的問題! (ps,它沒有downvote) – AlfredO

0

我已經爲你準備了這裏的工作演示:http://codepen.io/PiotrBerebecki/pen/yaVaLK

會爲您打算如何使用該解決方案的工作?

class Services extends React.Component { 
    constructor() { 
    super(); 
    this.state = { 
     showPriceCalculator: false 
    }; 
    } 

    handleClick(e) { 
    const userChoice = e.target.className 
    this.setState({ 
     userChoice 
    }) 
    } 

    toggleDiv() { 
    this.setState({ 
     showPriceCalculator: !this.state.showPriceCalculator 
    }) 
    } 

    render() { 
    return (
     <div> 
     <div>Header</div> 
     <ServiceSelector toggleDiv={this.toggleDiv.bind(this)} /> 

     {this.state.showPriceCalculator ? <div toggleDiv={this.toggleDiv.bind(this)}>PriceCalt</div> : <div>VVSFeatures</div>} 

     </div> 
    ); 
    } 
} 


class ServiceSelector extends React.Component { 
    toggleDiv() { 
    this.props.toggleDiv() 
    } 

    render() { 
    return (
     <p onClick={this.toggleDiv.bind(this)}>Click here - ServiceSelector</p> 
    ) 
    } 
} 
+1

它與以前的答案一起工作,但感謝您的努力! – AlfredO

+0

太好了。很高興你找到了解決方案。 –

相關問題