2017-12-12 17 views
1

서버에서 데이터를 가져 와서 사용하려고합니다. 하지만 이렇게 잘못되었습니다 - "정의되지 않은 속성 '지도'를 읽을 수 없습니다. 내가 이해하고있는대로 서버에서 데이터를 가져 오지 않습니다. 또한 console.log()로 데이터를 확인하려고 할 때 콘솔에 아무것도 표시되지 않습니다. 그리고 심지어 다른 구성 요소에서도 app.js를 제외한 console.log()가 작동하지 않습니다. 문제를 찾을 수 없습니다. 반응 코드에이 코드가 있습니다 .js :React.js 서버에서 데이터로드 중

import React, { Component } from 'react'; 
    import axios from 'axios'; 

    class ProductListContainer extends Component { 
    constructor(props){ 
     super(props); 
     this.state = { products : []}; 
     console.log ('ProductListContainer constructor'); 
    } 

    componentWillMount(){ 
     var self = this; 
     axios.get('https://itpro2017.herokuapp.com/api/products') 
     .then ((result) => { 
      self.setState({products:result.data}); 
      console.log(result + ' data');  
     }) 
     .catch ((error) => { 
      console.log(error); 
     }) 

    } 

render() 
{ 
    return <ProductListContainer products={this.state.products}/> 
} 
}; 

     import React from 'react'; 
     import ProductCardComponent from 
    '../ProductCardComponent/ProductCardComponent'; 
     import ProductListContainer from 
     'C:/Users/DoNata/Desktop/JavaTechnologijos/new-shop/src/container/'; 
     import './ProductListComponent.css'; 


    var ProductListComponent = function(props) { 
    var productCards = props.products.map((product, index) => { 
     return (
     <ProductCardComponent 
     key={index} 
     id={product.id} 
     image={product.image} 
     title={product.title} 
     description={product.description} 
     price={product.price} 
     /> 
     ); 
     }); 
     return (
     <div className="row"> 
     {productCards}</div> 
     ); 
    }; 

    export default ProductListComponent; 
+1

당신의 목록입니다 : 올바른 파일을 가리 키도록 ProductListContainer 파일의 상단에 import 문을 조정해야합니다 'ProductListContainer'를 요청하지 않으므로 데이터가로드되지 않습니다. 그 외에도 데이터는 this.state의'ProductListContainer'에서 설정되고, 소품의'ProductListComponent'에서는 설정되지 않습니다. –

+1

동일한 구성 요소 안에'ProductListContainer'를 렌더링하고 있습니다.'ProductListComponent '를 의미한다고 생각합니다. –

+0

해결책을 찾았습니까? –

답변

2

나는 몇 가지 문제점이 있다고 생각합니다. 하지만 주로 ProductListComponent을 반환해야하며 은 첫 번째 render 방법입니다 (현재는 ProductListContainer을 반복적으로 중첩하고 실제로 사용하지 않습니다). 따라서 ProductListComponentProductListContainer에서 가져오고 다른 방법으로 가져 오지 않아야합니다. 그리고 fail safe로 함수를 props.products에 실제로 내용이 있는지 검사하는 if 문에 포장하십시오.

읽기 어렵 기 때문에 이러한 구성 요소 중 일부의 이름을 바꾸는 것도 고려해 볼 수 있지만 그건 내 사업이 아닙니다.

편집 : 귀하의 코드가 이와 같이 보이는 경우 작동해야합니다.

컨테이너 요소

import React, { Component } from 'react'; 
import axios from 'axios'; 
import ProductListComponent from './wherever/this/is/located' 

class ProductListContainer extends Component { 
    constructor (props) { 
    super(props); 
    this.state = { products : []}; 
    console.log ('ProductListContainer constructor'); 
    } 

    componentWillMount() { 
    var self = this; 
    axios.get('https://itpro2017.herokuapp.com/api/products') 
     .then ((result) => { 
     self.setState({products:result.data}); 
     console.log(result + ' data'); 
     }) 
     .catch ((error) => { 
     console.log(error); 
     }) 
    } 

    render() { 
    return <ProductListComponent products={this.state.products} /> 
    } 
}; 

구성 요소

import React from 'react'; 
import ProductCardComponent from 
'../ProductCardComponent/ProductCardComponent'; 
import './ProductListComponent.css'; 


var ProductListComponent = function(props) { 
    var productCards 
    // check that props.products has anything in it 
    if (props.products.length) { 
    productCards = props.products.map((product, index) => { 
     return (
     <ProductCardComponent 
      key={index} 
      id={product.id} 
      image={product.image} 
      title={product.title} 
      description={product.description} 
      price={product.price} /> 
    ); 
    }); 
    } else { // otherwise, just return an empty div until the server response 
      // comes back 
    productCards = <div /> 
    } 

    return (
    <div className="row"> 
     {productCards} 
    </div> 
); 
}; 

export default ProductListComponent; 
+0

안녕하세요. 그래서 나는 그것을 고치려고 노력하고있다. ProductListComponent를 ProductListContainer에서 다른 ProductListComponent로 가져와야한다는 것을 이해합니다. (작성 했으므로 이름을 바꿔야합니다 : D). 그러나 내가 productListComponent를 가져 왔고 var ProductListComponent를 가지고 있기 때문에 duplicate가 있다는 것을 알고있는 오류가 있습니다. 내가 잘못하고있는 것 :/var의 이름을 바꿔야합니까? – Donne

+0

그냥 조금 부셔 봅시다. 컨테이너 (ListProductContainer) 요소와 구성 요소 (ListProductComponent) 요소가 있습니다. 컨테이너가 구성 요소를 가져와야합니다. 그리고 구성 요소는 자체를 내보낼 수 있어야합니다. 다시 정의 할 파일에 무언가를 가져올 수 없습니다. 예, var라는 이름을 변경하십시오. –

+0

답변을 편집했습니다. 작동하는 경우 다시 수락하십시오. 왜 그것이 효과가 있는지 아직도 혼란 스럽다면 알려주세요. –