React. JSX
Хоть JSX внешне похож на html-разметку, на самом деле это JS-код и он умеет всё то, что умеет обычный JS-код. Например, использовать переменные.
Переменные в JSX берутся в фигурные скобки.
Например.
Было:
const TodoList = () => {
return (
<ul>
<li>Learn React</li>
<li>Create Awesome App</li>
</ul>
);
};
Стало:
const TodoList = () => {
const items = ['Learn React', 'Create Awesome App'];
return (
<ul>
<li>{items[0]}</li>
<li>{items[1]}</li>
</ul>
);
};
В JSX можно использовать функции. Например, если мы решили добавить в приложение отображение даты и времени, это может выглядеть так:
const App = () => {
return (
<div>
<span>{(new Date()).toString()}</span>
<AppHeader/>
<SearchPanel/>
<TodoList/>
</div>
);
};
Результат:
В фигурных скобках добавляем реакт-элементы
const App = () => {
const login = <span>Log in please</span>
return (
<div>
{login}
<AppHeader/>
<SearchPanel/>
<TodoList/>
</div>
);
};
Реакт-компоненты, а также объекты (массивы, функции) в фигурные скобки в реакт добавлять нет смысла. Но можно добавлять результат вызова функции, об этом шла речь выше, а также примитивные типы данных - строки, числа, булевы значения.
Полезная особенность - если выражение в фигурных скобках null или undefined, ошибки не будет и выражение просто проигнорируется.
Благодаря этому свойству можно добавлять в JSX небольшие фрагменты логики. Предположим, мы хотим добавлять элемент login только если пользователь не залогинен.
Добавляем в код переменную isLog присваиваем ей значение false, меняем значение на true, если пользователь вошёл в систему и добавляем в JSX тернарный оператор: {isLog ? null : login}
const App = () => {
let isLog = false;
const login = <span>Log in please</span>
return (
<div>
{isLog ? null : login}
<AppHeader/>
<SearchPanel/>
<TodoList/>
</div>
);
};
Таким образом мы можем отображать или скрывать компоненты в зависимости от значения переменной.
Но это касается только небольших фрагментов логики, если речь о полноценном коде, ему место не в JSX, а в JS-файле.
В фигурных скобках можно передавать не только дочерние элементы, но и атрибуты.
Например, в строке
<input placeholder = 'search' />;
search является атрибутом
мы можем написать
const searchText = 'search, please'
И передать элемент searchText в фигурных скобках.
<input placeholder = {searchText} />;
Важно помнить. что кавычки при этом не требуются.
Значениями атрибутов могут быть любые переменные, в том числе объекты, массивы. Для обычных html тегов это не имеет смысла, так как тег в качестве значения атрибута ожидает строку, но для кастомных реакт-компонентов мы можем передать в качестве атрибута массив.
Например, так:
<TodoList items={['item1', 'item2']} />
Еще одна особенность атрибутов - их следует писать с маленькой буквы camel-case
Нужно запомнить два атрибута, которые в JSX пишутся не так, как в html
1. className вместо class
2. htmlFor вместо for (не очень частый атрибут, добавляется к тегу label)
В фигурных скобках можно передавать стили:
const AppHeader = () => {
const headStyle = {
fontSize: '40px'
}
return <h1 style={headStyle}>My Todo List</h1>;
};
Так мало кто делает, но так делать можно
Значение в фигурных скобках всегда true
И оно всегда превращается в строку, поэтому запуск код-иньекций невозможен