const Navigation: React.FunctionComponent = () => {
const routeList: RouteItem[] = [
{ name: 'Главная', path: '/' },
{ name: 'Оценки', path: '/grade' }
]
function getClassName({ isActive }: { isActive: boolean }): string {
return `${styles.link} ${isActive ? styles.active : 0}`
}
return (
<ul className={styles.list}>
{
routeList.map((route) => (
<li key={route.path} className={styles.item}>
<NavLink to={route.path} className={getClassName} data-scroll>
{route.name}
</NavLink>
</li>
))
}
</ul>
)
}
function getClassName({ isActive }: { isActive: boolean }): string {
return classNames(styles.link, {
[styles.active]: isActive
})
}
::before
и ::after
, куда в правило content
запихиваешь содержимое кнопки. ::before
позиционируем таким образом, чтобы мы его видели в центре кнопки, а ::after
за его пределами. При наведении на кнопку ::before
уводишь наверх, а ::after
выводишь на середину кнопки.::before
и ::after
, а делая на вложенных элементах, типа такого:<button class="button">
<div class="button-primary-text">
<span class="button-symbol">D</span>
<span class="button-symbol">O</span>
<span class="button-symbol">N</span>
<span class="button-symbol">A</span>
<span class="button-symbol">T</span>
<span class="button-symbol">E</span>
</div>
<div class="button-secondary-text">
<span class="button-symbol">D</span>
<span class="button-symbol">O</span>
<span class="button-symbol">N</span>
<span class="button-symbol">A</span>
<span class="button-symbol">T</span>
<span class="button-symbol">E</span>
</div>
</button>
:nth-child
задать некоторые задержки для символов внутри кнопки, а сам текст двигать с помощью transform: translate(...)
transition
, но, например, когда я смотрел всякие дизайнерские сайты на awwwards, то подобная анимация была сделала именно через дублирование import React from 'react'
export type CommentItem = {
id: number
comment: string
createdComment: any
// eslint ругается на тип "any"
// лучше от него потом избавиться
}
export type CommentList = CommentItem[]
const Comment = () => {
const [comments, setComments] = React.useState<CommentList>([])
return (
<div>
{/*
для comment-объекта можно не устанавливать тип, поскольку
среда разработки поймёт что это объект массива с типом CommentList (то есть CommentItem)
*/}
{comments.map((comment) => (
<>
<p>{comment.id}</p>
<p>{comment.comment}</p>
<p>{comment.createdComment}</p>
</>
))}
</div>
)
}
export default Comment
useState
? <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
React
с обычным JavaScript
и решил использовать сразу его с TypeScript
. JSX
код действительно крайне странный, но даже если учитывать этот факт - не понимаю о какой вложенности типов идет речь)React
сразу с типизацией, то лучше вернуться к обычному JavaScript
и хорошенько понять как работают компоненты, их состояния и пропсы, которые эти компоненты принимают - по прошлому Вашему вопросу было понятно что Вы с этим пока не очень хорошо разобрались.React
же имеется отличная обновленная документация, где сразу после небольшой теории ты можешь на практике последовательно сделать небольшую игру "Крестики-Нолики".JavaScript
, где ты описываешь то, с какими данными ты сейчас работаешь и что они содержат. type Slide = {
img: string;
alt: string;
}
type Slider = {
data: Slide[]; // data - массив объектов типа Slide
}
Box
, который принимает как props
развернутый объект box
:type Box = {
name: string;
date: string;
image: string;
};
// можно сразу указать что props будет иметь тип Box, но я так не привык делать
// всегда описываю тип Props для объекта props
type Props = Box;
export default function Box(props: Props) {
const {name, date, image} = props;
}
{data.map((box) => (
<Box
name={box.name}
date={box.date}
image={box.image}
/>
))}
{data.map((box) => (
// поля объекта box сразу стали полями props
// и про key не забудь внутри цикла map
<Box key={?} {...box} />
))}
Box
, который принимает как props
обычный объект, где box
является вложенным объектом:type Box = {
name: string;
date: string;
image: string;
}
type Props = {
box: Box;
};
export default function Box(props: Props) {
const {name, date, image} = props.box;
}
{data.map((box) => (
// объект box передается как props.box
// и про key не забудь внутри цикла map
<Box key={?} box={box} />
))}
React.memo
(если его, конечно, нужно использовать). li
внутри ul.menu
(любая вложенность):ul.menu li {
// code
}
li
непосредственно внутри ul.menu
(первый уровень вложенности):ul.menu > li {
// code
}
как правильно записать порядок