#javascript #reactjs #material-ui
#javascript #reactjs #материал-пользовательский интерфейс
Вопрос:
Я использую react16 с компонентами Material-Ui. На моем корневом компьютере. Я хочу условно загрузить вкладку и представление в свойство. Мне удалось реализовать эту функциональность. Но код выглядит действительно уродливо, и, возможно, это можно упростить. Условие зависит от this.props.isSIInstalled
Компонент:
render() {
const {shouldSwipe} = this.props;
return (
<MuiThemeProvider theme={theme}>
<Tabs className=' electric' value={this.state.value}
onChange={this.handleChange.bind(this)} variant="scrollable" id={'tabMenu'}>
<Tab label={1} value={0}/>
<Tab label={2} value={1}/>
<Tab label={3} value={2}/>
{this.props.isSIInstalled
amp;amp; <Tab label={4} value={3}/>}
</Tabs>
{
this.props.isSIInstalled ?
<SwipeableViews index={this.state.value} onChangeIndex={this.handleChange.bind(this)} disabled={!shouldSwipe}>
<div>Item One</div>
<div>Item Two</div>
<div>Item Three</div>
<div>Item Four</div>
</SwipeableViews> :
<SwipeableViews index={this.state.value} onChangeIndex={this.handleChange.bind(this)} disabled={!shouldSwipe}>
<div>Item One</div>
<div>Item Two</div>
<div>Item Three</div>
</SwipeableViews>
}
</MuiThemeProvider>
)
}
Ответ №1:
В целом, что я сделал, так это использовал функцию map, которая является спасением в React, и переместил некоторые строки в другой файл, что делает код более аккуратным и читаемым.
return (
<MuiThemeProvider theme={theme}>
<div className="noScroll">
<Tabs className='byod-no-pinch-zoom electric' value={this.state.value}
onChange={this.handleChange.bind(this)} variant="scrollable" id={'tabMenu'}>
TAB_INFO.map(x => <Tab label={x.label} id={x.id} />)
{this.props.isSIInstalled
amp;amp; <Tab label={getSID('SID_RHMI_BYOD_SOURCE_EXPERIENCES')} value={3} />}
</Tabs>
{
this.props.isSIInstalled ?
<SwipeableViews index={this.state.value} onChangeIndex={this.handleChange.bind(this)} disabled={!shouldSwipe}>
<div className="modal-container byod-no-pinch-zoom">
<JourneyInfo webSocketClient={this.props.webSocketClient} />
</div>
['Item Two','Item Three','Item Four'].map( x=>
<div className="modal-container byod-no-pinch-zoom">
<div>{x}</div>
</div>
)
</SwipeableViews> :
<SwipeableViews index={this.state.value} onChangeIndex={this.handleChange.bind(this)} disabled={!shouldSwipe}>
<div className="modal-container byod-no-pinch-zoom">
<JourneyInfo webSocketClient={this.props.webSocketClient} />
</div>
<div className="modal-container byod-no-pinch-zoom" />
<div className="modal-container byod-no-pinch-zoom" />
</SwipeableViews>
}
</div>
</MuiThemeProvider>
)
}
Другой файл, обычно называемый strings.js или константы.
const export TAB_INFO = [
{
label: 'SID_RHMI_BYOD_INFO',
value: 0,
},
{
label: 'SID_RHMI_BYOD_MEDIA',
value: 1,
},
{
label: 'SID_RHMI_BYOD_CLIMATE',
value: 2,
},
]
Ответ №2:
Как я вижу, ваши условные компоненты почти одинаковы, и единственное отличие заключается в том, что вы показываете / скрываете четыре элемента, зависящих от this.props.isSIInstalled. Таким образом, вы можете упростить код следующим образом:
...
</Tabs>
<SwipeableViews index={this.state.value} onChangeIndex={this.handleChange.bind(this)} disabled={!shouldSwipe}>
<div className="modal-container byod-no-pinch-zoom">
<div>Item One</div>
</div>
<div className="modal-container byod-no-pinch-zoom">
<div>Item Two</div>
</div>
<div className="modal-container byod-no-pinch-zoom">
<div>Item Three</div>
</div>
{
this.props.isSIInstalled amp;amp; (
<div className="modal-container byod-no-pinch-zoom">
<div>Item Four</div>
</div>
)
}
</SwipeableViews>
Кроме того, если вы хотите отображать абсолютно разные представления на основе condition, вы можете выполнить следующее:
</Tabs>
{
this.props.isSIInstalled amp;amp; View1
}
{
!this.props.isSIInstalled amp;amp; View2
}
Комментарии:
1. Да, вы правы, единственное отличие заключается в загрузке четвертого представления. Я тоже подумал о вашем подходе. Но это выдает мне ошибку: ` Предупреждение: react-swipeable-view: один из предоставленных дочерних элементов недопустим: null. Мы ожидаем допустимый элемент React`
2. Что ж, это может быть уродливым взломом, но вы можете попробовать
{ this.props.isSIInstalled ? ( <div className="modal-container byod-no-pinch-zoom"> <div>Item Four</div> </div> ) : '' }
— вернуть пустую строку, если вам не нужно отображать этот элемент3. Также вы можете описать массив всех представлений: views = [{компонент: View1}, {компонент: View2, isHidden: !this.props.isSIInstalled}]. И создайте дочерние элементы SwipeableViews, подобные
views.filter(view => !view.isHidden).map(view => view.component)
. Таким образом, вы будете получать только допустимые ReactNodes