Я использую this.context для получения данных контекста внутри методов жизненного цикла, но когда я не оборачиваю компонент с помощью Consumer, тогда, когда изменяются данные контекста, мой компонент не перерисовывается.
Поэтому вместоэто:
render() {
console.log('companies render');
const { modal, singleCompanyData, loading } = this.state;
const { itemsPerPage } = this.props;
const columns = [
{ key: 'id', title: 'ID' },
{ key: 'title', title: 'Title' },
{ key: 'city', title: 'City' },
{ key: 'btn', title: 'Action' }
];
return (
<SharedDataConsumer>
{({ companies }) => (
<React.Fragment>
<Companies
columns={columns}
data={companies}
addCompany={this.addCompany}
totalRecords={companies.length}
loading={loading}
itemsPerPage={itemsPerPage}
/>
<AM2Modal open={modal} handleModalClose={this.handleModalClose}>
<CompaniesEdit
singleCompanyData={singleCompanyData}
handleModalClose={this.handleModalClose}
inputChangeEvent={this.inputChangeEvent}
/>
</AM2Modal>
</React.Fragment>
)}
</SharedDataConsumer>
);
}
Мне нужно использовать что-то вроде этого, чтобы отформатировать эти данные перед рендерингом:
render() {
console.log('companies render');
const { modal, singleCompanyData, loading } = this.state;
const { companies } = this.context;
const { itemsPerPage } = this.props;
const newComp = companies.map(value => ({
...value,
btn: this.actionBtns(value.id)
}));
const columns = [
{ key: 'id', title: 'ID' },
{ key: 'title', title: 'Title' },
{ key: 'city', title: 'City' },
{ key: 'btn', title: 'Action' }
];
return (
<React.Fragment>
<Companies
columns={columns}
data={newComp}
addCompany={this.addCompany}
totalRecords={companies.length}
loading={loading}
itemsPerPage={itemsPerPage}
/>
<AM2Modal open={modal} handleModalClose={this.handleModalClose}>
<CompaniesEdit
singleCompanyData={singleCompanyData}
handleModalClose={this.handleModalClose}
inputChangeEvent={this.inputChangeEvent}
/>
</AM2Modal>
</React.Fragment>
);
}
Но таким образом, компонент не обновляется после изменения контекста -контекстные данные асинхронны.
Я провел исследование и увидел этот пример, в котором они переносят экспорт и передают данные контекста как реквизиты, но не уверены, правильно ли это работает с последним API контекста?
Полный код здесь.