2016-07-26 1 views
2

Я создаю веб-приложение с React с использованием классов ES6. У меня есть файл IndexPage.js, который добавляет данные в базу данных и файл AdminLandingPage.js, который считывает все данные, находящиеся в настоящее время в базе данных в своей функции componentDidMount().Как передать состояние в реактиве от одного класса к другому?

В основном оба работают отдельно. Я хочу, чтобы иметь возможность сохранять данные в состоянии (массиве) в IndexPage, а затем передать это состояние другому файлу, где я могу проверить, есть ли в нем массив данных и установить состояние таблицы (что позволяет мне не нужно обновлять страницу).

IndexPage имеет это в это конструктор:

constructor(props) { 
    super(props); 

    this.state = {newbugs: []}; 
} 

Здесь я добавляю данные в базу данных и установка состояния массива newbugs:

addBug = (newBug) => { 
    BugsApi.addBugData(newBug, data => { 
    this.setState({newbugs: data}) 
    }) 
} 

В моей AdminLandingPage конструктор у меня есть:

constructor(props) { 
    super(props); 

    this.state = {bugs: []}; 
} 

И функция componentDidMount(), где я читаю все данные curre ntly в базе:

componentDidMount() { 

    BugsApi.getBugData(data => { 
     this.setState({bugs: data}) 
    }) 
} 

^Здесь я хотел бы передать в newbugs состояния массива из моего чека IndexPage, если у него есть данные в нем, а затем обновить ошибки состояния массива в этом классе.

Сообщите мне, если я могу быть более ясным с моим вопросом. Я застрял часами на этом сейчас. Благодаря!

+1

вы должны прочитать документы, это как реагировать 101 материала здесь я просто гугл вашего точный вопрос дословно и получил это: https://facebook.github.io/react/tips/communicate-between- components.html – JordanHendrix

ответ

3

state должно быть передано между компонентами как props. Например:

class IndexPage extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = {newbugs: []}; 
    } 

    ... 

    render() { 
    return (
     <AdminLandingPage bugs={this.state.newBugs}/> 
    ) 
    } 
} 

class AdminLandingPage extends React.Component { 

    ... 

    componentDidMount() { 
    // `newBugs`constant holds the bugs passed down from IndexPage 
    const newBugs = this.props.bugs; 
    BugsApi.getBugData(data => { 
     this.setState({bugs: data}) 
    }) 
    } 

    ... 
} 

Здесь IndexPage проходит state.newBugs вниз к его дочерний компонент AdminIndexPage как bugs опора

+0

в этом примере вы проходите мимо состояния. Я согласен в целом с тем, что ваше высказывание, но это первое предложение вводит в заблуждение. «Состояние должно быть передано между компонентами в качестве реквизита» было бы яснее – JordanHendrix

+1

Вы правы, я отредактирую ответ –

+0

Только проблема с этим - я не хочу отображать страницу администратора внутри индексной страницы.Если бы я разместил ' ', где у вас есть это, он отобразит весь компонент внутри него. – Dan

0

я в основном согласен с кодом, который был предоставлен на Red Mercury, за исключением затем установить состояние внутри вашей AdminLandingPage. После того, как реквизит доступен внутри компонента, вам не понадобится состояние в компоненте AdminLandingPage, если только что-то еще вы не пытаетесь сделать, о котором не упоминалось.

class IndexPage extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = {newbugs: []}; 
    } 

    render() { 
    return (
     <AdminLandingPage bugs={this.state.newBugs}/> 
    ); 
    } 
} 

const AdminLandingPage = (props) { 
    console.log(props.bugs); 
    return (
    ... 
); 
} 
+0

Есть ли способ, которым я могу это сделать, admin page внутри индексной страницы? Я просто хочу передать реквизит, но не отображать компонент. – Dan

+0

Лучший способ сделать это (у которого есть большая кривая обучения, в зависимости от того, насколько вы комфортно настроены с помощью React) с Redux. Redux - отличный способ управлять состоянием приложения приложения React. – Matt