#javascript #html #reactjs #redux #react-redux
Вопрос:
Я работаю над приложением react, в котором у меня есть 3 логические переменные в магазине redux, и я хочу переключаться между 3 компонентами для визуализации с использованием этих логических значений.Как я могу это сделать?
Вот мой код:
<Grid>
<Grid.Row>
<Grid.Column width={1} />
<Grid.Column width={14}>
this.props.openCreateForm?<Form/>:</>
this.props.openViewPopup?<ViewPopup/>:</>
this.props.openCredsPopup?<CredsPopup/>:</>
</Grid.Column>
<Grid.Column width={1} />
</Grid.Row>
</Grid>
Внутри Grid.Column
я хочу отобразить только 1 из этих трех компонентов.Все логические значения находятся в состоянии redux.
Error
react-dom.development.js:24036 Uncaught Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
Как я могу это сделать?Я получаю ошибку по этому поводу
Спасибо
Комментарии:
1. Какую ошибку вы получаете?
2. Как вы получаете свое состояние от redux? крючки или подключенные компоненты?
3. Я использую
mapStatetoProps
для получения значений4. так и должно быть
{this.props.openCreateForm?<Form/>:</>}
. была ли это опечатка, о которой идет речь?5. Когда вы используете синтаксис JSX , компилятору потребуется, чтобы встроенный код JavaScript был заключен в
{ }
Ответ №1:
Вам нужно заключить их в { }
const { openCreateForm, openViewPopup, openCredsPopup } = this.props
<Grid.Column width={14}>
{ openCreateForm ? <Form/> :
openViewPopup ? <ViewPopup/> :
openCredsPopup ? <CredsPopup/> : </> }
</Grid.Column>
или, если вам не нужна вложенная троичная,
<Grid.Column width={14}>
{ this.props.openCreateForm amp;amp; <Form/> ||
this.props.openViewPopup amp;amp; <ViewPopup/> ||
this.props.openCredsPopup amp;amp; <CredsPopup/> || </> }
</Grid.Column>
Ответ №2:
const { openCreateForm, openViewPopup, openCredsPopup } = this.props
<Grid>
<Grid.Row>
<Grid.Column width={1} />
<Grid.Column width={14}>
{openCreateForm amp;amp; <Form/>}
{openViewPopup amp;amp; <ViewPopup/>}
{openCredsPopup amp;amp; <CredsPopup/>}
</Grid.Column>
<Grid.Column width={1} />
</Grid.Row>
</Grid>
Используйте деструктуризацию, чтобы получить значение реквизита, и используйте оператор amp;amp; для условного рендеринга. Это работает, потому что в JavaScript значение true amp;amp; expression всегда равно выражению, а значение false amp;amp; expression всегда равно false.
См. здесь: https://reactjs.org/docs/conditional-rendering.html#inline-if-with-logical—operator