В динамических внешних приложениях обычно требуется отображать различные пользовательские интерфейсы, когда приложение находится в разных состояниях. Примером может служить отображение приветственного сообщения для гостя или аутентифицированного пользователя.
Для гостя мы можем отобразить общее приветственное сообщение и форму регистрации:
В Solid мы можем использовать компонент <Show /> для условного показа содержимого. Компонент <Show /> принимает пропс when и необязательный пропс fallback.
Когда параметр when имеет значение true, JSX внутри компонента <Show /> отображается
Если параметр when равен false, то отображается JSX внутри fallback (если он задан).
В следующем примере показано, как можно использовать компонент <Show /> для условного отображения страницы входа в систему или приборной панели:
Когда значение props.isLoggedIn равно true, мы приветствуем вернувшегося пользователя и показываем <Dashboard />. Когда значение props.isLoggedIn равно false, мы отображаем содержимое fallback, которое представляет собой наше общее приветствие и форму <SignInForm />.
react
В React это распространенный паттерн для обработки потока управления путем раннего возврата из функции компонента. Например, для выполнения условного отображения аутентификации можно было бы сделать следующее:
В разделе Building UI with Components этого руководства мы отметили, что функции компонентов работают только один раз в Solid. Это означает, что JSX, возвращаемый при первоначальном возврате функции, является единственным JSX, который когда-либо будет возвращен функцией.
В Solid, если мы хотим условно отобразить JSX в компоненте, нам нужно, чтобы это условие находилось в возвращаемом JSX. Хотя это требует некоторой адаптации при переходе с React, мы пришли к выводу, что тонкий контроль, предоставляемый реактивной системой Solid, стоит того, чтобы пойти на этот компромисс.
angular
Вместо Show в Angular может использоваться ngIf. Аналогично, вместо fallback в ngIf будет использоваться предложение else, а также ng-template.
1 2 3 4 5 6 7 8 91011
<ng-container*ngIf="isLoggedin; else notLoggedIn"><div>Welcome back, {{firstName}}!</div><dashboard></dashboard></ng-container><ng-template#notLoggedIn><div>
Welcome to the application. Please sign in to
continue.
</div><sign-in-form></sign-in-form></ng-template>
vue
В Vue вышеописанное будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 91011
<templatev-if="isLoggedIn"><div>
Welcome to the application. Please sign in to
continue.
</div><SignInForm/></template><templatev-else><div>Welcome back, {{firstName}}!</div><Dashboard/></template>
В пользовательских интерфейсах часто требуется отображать списки данных. Такие списки могут быть любой длины, и поэтому мы не можем просто жестко закодировать каждый элемент. Вместо этого Solid предоставляет нам компонент <For />. Если вы кодили по примеру приложения "Книжная полка", то заметили, что нам уже приходилось использовать этот компонент.
Компонент <For /> принимает массив, по которому нужно выполнить цикл, в пропсе each:
Внутри компонента <For /> используется функция callback для перебора элементов. В данном случае мы создаем новый элемент списка <li> для каждой книги в нашем массиве books:
В React итерация по массивам в JSX осуществляется с помощью метода массива `map`:
```js
<>
{books.map((book) => {
return <li key={book}>{book}</li>;
})}
</>
```
Хотя это и работает в Solid, но не является оптимальным. Можно рассматривать `<For />` как оптимизированную версию `map`. При использовании `<For />` Solid способен интеллектуально определить, какие элементы массива необходимо обновить. Именно поэтому нам не нужно использовать `key`, как в React.
In the Adding Interactivity with State section of this tutorial, we found ourselves already needing the <For /> component. This allowed us to iterate over any number of books in on our bookshelf:
Теперь воспользуемся компонентом <Show />. Мы будем показывать нашу форму AddBook только в том случае, если пользователь хочет добавить книгу.
Мы создадим в компоненте Bookshelf булевый сигнал, который будет отслеживать, открыта форма или нет, и добавим кнопки для открытия и закрытия формы. Для условного отображения формы мы будем использовать компонент <Show />.
Когда showForm() имеет значение true, приложение отображает форму <AddBook /> и кнопку, позволяющую снова скрыть форму. Когда showForm() имеет значение false, отображается компонент fallback — кнопка для показа формы <AddBook />.