2017-01-12 15 views
1

Я изучаю реакцию и имею приложение, которое использовалось для работы со статическими данными, хранящимися в объекте javascript. Теперь я загружаю эти данные через ajax, используя axios.как передать данные ajax до компонентов в реакции

Это работает, и в настоящее время я храню данные в состоянии приложения, а затем передаю их компонентам после загрузки данных, но способ передачи данных в качестве опоры для каждого компонента не хорошо чувстовать.

Как каждый компонент может получить доступ к данным родительского приложения, не передавая его в качестве опоры для каждого компонента?

Вот мой код

class App extends Component { 

    constructor(props) { 
    super(props); 
    this.state = {appData: {}}; 
    } 

    componentDidMount() { 
    axios.get('/data/appData.json') 
    .then((result)=> { 
     const thisData = result.data; 
     this.setState({ 
     appData: result.data 
     }); 
    }) 
    } 

    componentWillUnmount() { 
    this.serverRequest.abort(); 
    } 

    render() { 

    const theData = this.state.appData; 
    if (Object.keys(theData).length > 0 && theData.constructor === Object){ //if the object is not empty 
     return (
     <div className="App"> 
      <AppHeader appData={theData} /> 
      <AppMenu appData={theData} /> 
      <MainCarousel appData={theData} /> 
      <HomeDetails appData={theData} /> 
      <Model3D appData={theData} /> 
      <AppMaps appData={theData} /> 
      <AppContact appData={theData} /> 
     </div> 
    ); 
    } else { 
     return (
     <div className="App"></div> 
    ) 
    } 

    } 
} 

И компонент, который будет использовать данные, выглядит следующим образом:

function AppHeader(props) { 
    return (
    <div className="App-header"> 
     <h2 className="App-title">{props.appData.copy.title}</h2> 
     <h4 className="App-subtitle">{props.appData.copy.subtitle}</h4> 
    </div> 
); 
} 

для функции или

class MainCarousel extends Component { 
    mixins: [Carousel.ControllerMixin]; 

    constructor(props) { 
    super(props); 
    } 

    render() { 
    const carouselItems = this.props.appData.carouselItems.map((carouselItem) => 
     <AppCarouselItem key={carouselItem.name.toLowerCase()} name={carouselItem.name} image={carouselItem.image} /> 
    ); 
    return (
     <div className="App-carousel"> 
     <Carousel autoplay={true} wrapAround={true}> 
      {carouselItems} 
     </Carousel> 
     </div> 
    ); 
    } 
} 

для класса.

+0

Это должно помочь: https://facebook.github.io/react/docs/context.html –

+0

Ну, как правило, вы только передаете данные, необходимые компоненту, что, как говорится, это именно то, что сокращает для http://redux.js.org/ – azium

ответ

1

Для ваших целей то, что вы делаете, вполне приемлемо, единственное, что я бы изменил, - это разделить состояние на объект для каждого компонента. Это предотвратит обновление каждого компонента при каждом обновлении одного из них.

Где вещи становятся беспорядочными, когда ваши дочерние компоненты обновляют состояние родителя. Здесь вам пригодится библиотека, например, Flux или Redux.

Если вы просто создаете простое приложение со статическими данными, отправляйте состояние на свой компонент в качестве реквизита.

 Смежные вопросы

  • Нет связанных вопросов^_^