2017-11-29 10 views
0

ヘルプ!私の子供のコンポーネントは、私の反応アプリで更新されていません!子コンポーネントが反応で更新されない

cartNumberをページコンポーネントに持っていき、ヘッダコンポーネントに渡されますが、数字は表示されません。ここで

親コンポーネント

class Shop extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     merchants: [], 
     error: null, 
     loading: true, 
     order: [] 
    }; 
    } 

    componentWillMount() { 
    Meteor.call("merchants.getMerchants", (error, response) => { 
     if (error) { 
     this.setState(() => ({ error: error })); 
     } else { 
     this.setState(() => ({ merchants: response })); 
     } 
    }); 
    } 

    componentDidMount() { 
    setTimeout(() => this.setState({ loading: false }), 800); // simulates loading of data 
    } 

    goBack =() => this.props.history.push("/"); 
    goCart =() => { 
    try { 
     Orders.insert(this.state.order), this.props.history.push("/cart"); 
    } catch (error) { 
     throw new Meteor.Error("there was an error", error); 
    } 
    }; 

    onAddToCart(cartItem) { 
    let { order } = this.state; 
    order.push(cartItem); 
    console.log(order.length); 
    } 

    render() { 
    const { loading } = this.state; 
    const { merchants, error } = this.state; 
    const { data } = this.state; 
    const { order } = this.state; 

    const getProductsFromMerchant = ({ products, brands }) => 
     products.map(({ belongsToBrand, ...product }) => ({ 
     ...product, 
     brand: brands[belongsToBrand] 
     })); 

    const products = merchants.reduce(
     (acc, merchant) => [...acc, ...getProductsFromMerchant(merchant)], 
     [] 
    ); 

    if (loading) { 
     return (
     <Page 
      pageTitle="Shop" 
      history 
      goBack={this.goBack} 
      goCart={this.goCart} 
     > 
      <div className="loading-page"> 
      <i 
       className="fa fa-spinner fa-spin fa-3x fa-fw" 
       aria-hidden="true" 
      /> 
      <br /> <br /> 
      <span>Loading...</span> 
      </div> 
     </Page> 
    ); 
    } 

    return (
     <Page 
     pageTitle="Shop" 
     history 
     goBack={this.goBack} 
     goCart={this.goCart} 
     cartNumber={order.length} 
     > 
     <div className="shop-page"> 
      {products.map(({ id, ...product }) => 
      <Product 
       {...product} 
       key={id} 
       history 
       onAddToCart={this.onAddToCart.bind(this)} 
      /> 
     )} 
     </div> 
     </Page> 
    ); 
    } 
} 

export default Shop; 

はヘッダコンポーネント

export const Page = ({ 
    children, 
    pageTitle, 
    history, 
    goBack, 
    goCart, 
    cartNumber 
}) => 
    <div className="page"> 
    <Header goBack={goBack} goCart={goCart} history cartNumber> 
     {pageTitle} 
    </Header> 
    <main> 
     <MuiThemeProvider> 
     {children} 
     </MuiThemeProvider> 
    </main> 
    <Footer /> 
    </div>; 

export default Page; 

が含まれていますし、最終的にこれは私がにcartNumberを持参するヘッダーでページコンポーネントです。

const Header = ({ children, goBack, goCart, cartNumber, pageTitle }) => 
    <header> 
    <button onClick={goBack} className="back-button"> 
     {/* Image added here to show image inclusion, prefer inline-SVG. */} 
     <img alt="Back" src={`/icon/header/back-white.svg`} /> 
    </button> 
    <h1> 
     {children} 
    </h1> 
    <div className="right-content"> 
     ({cartNumber}) 
     <i 
     className="fa fa-shopping-cart fa-2x" 
     aria-hidden="true" 
     onClick={goCart} 
     /> 
    </div> 
    </header>; 
export default withRouter(Header); 
+0

を、私はそれを見逃しているかもしれないが、あなたが状態を変更しているように見えます直接。これは間違ったアプローチです - あなたが想定しているように 'setState'を使ってください。 –

+0

また: <ヘッダGOBACK = {GOBACK} goCart = {goCart}履歴cartNumber> {PAGETITLE} ことがあってはならない <ヘッダGOBACK = {GOBACK} goCart = {goCart}履歴cartNumber = {cartNumber} > {pageTitle} –

+0

なぜ、あなたのすべてのsetState呼び出しでfat arrow関数を使用していますか? – Ted

答えて

1

あなたはブール値としてcartNumberを渡している:

<Header goBack={goBack} goCart={goCart} history cartNumber> 

は値として渡す:

<Header goBack={goBack} goCart={goCart} history={history} cartNumber={cartNumber}> 
+0

ああ、ありがとう。親コンポーネントが状態を変更しても、正しく更新されるのにはまだ問題があります。私はそれをどのようにすることができるか知っていますか? – Ricky

+0

あなたのコードの中に 'orders'状態を更新するものはありません。状態を変更した場合は、 –

+0

の後に常に 'setState()'を実行する必要があります。ありがとうございました。どうもありがとうございます! – Ricky

関連する問題