Разработка цифровых продуктов на современных технологиях и фреймворках.
Обсудить проект @YuraAndreev
Post #314
667
- 🔥 13
- 👍 5
- ❤ 3
DE @deepdigital
Showing posts older than #315 · Back to latest


// пример использованияТаким образом, ISR позволяет оптимально сочетать скорость статической генерации и гибкость обновления данных. Рекомендуем для сайтов с часто меняющимся контентом!
export const getStaticProps = async () => {
return {
props,
revalidate: 10, // ревалидировать каждые 10 секунд
}
}
// On-demand
await res.revalidate('/some-page')


type User = {
name?: string;
}
type ReadonlyUser = Readonly<User> // { readonly name?: string; }
const user: ReadonlyUser = {
name: 'Jack'
}
// Cannot assign to 'name' because it is a read-only property.
user.name = 'John'
Обратите внимание на знак вопроса у свойства name. Мы намеренно сделали его необязательным, но Readonly оставит его таковым, так как, являясь гомоморфным, он не изменяет остальные модификаторы.type User = {
readonly name: string;
age: number;
};
type OptionalUser = Partial<User>; // { readonly name?: string; age?: number; }
const user: OptionalUser = {}; // Ok!
Required противоположен Partial. Он превращает члены объекта в обязательные, удаляя модификатор ?.type User = {
readonly name?: string;
age?: number;
};
type RequiredUser = Required<User>; // { readonly name: string; age: number; }
/**
* Type '{}' is missing the following properties
* from type 'Required<User>': name, age
*/
const user: RequiredUser = {}
И последний — Pick. Фильтрует объектный тип по свойствам/методам и формирует из него новый тип. Если вы знаете, как работает тип Omit, то это противоположная ему процедура. Первый дженерик принимает в себя фильтруемый тип, а второй — перечисление свойств/методов, которые требуется отфильтровать (перечисляются через оператор | ):type User = {
readonly name: string;
age: number;
height: number;
};
// { readonly name: string; age: number; }
type PickUser = Pick<User, 'name' | 'age'>;
const user: PickUser = {
name: 'Jack'
}
// Cannot assign to 'name' because it is a read-only property.
user.name = 'John'


const arr = new Array(10000).fill(0).map((_, i) => i);➡Почему так происходит: for для работы своих итераций требуется каждый раз создавать переменную с текущим индексом, в то время как forEach обращается к элементу массива по его внутреннему индексу, а это гораздо быстрее.
function forFn() {
let res;
for (let i = 0; i < arr; i++) res = arr[i];
}
function forEachFn() {
let res;
arr.forEach(item => res = item);
}
function calculateLoopTime(callback) {
const time = performance.now();
callback();
console.log(performance.now() - time);
}
calculateLoopTime(forFn); // от 0.3s до 0.7s
calculateLoopTime(forEachFn); // от 0 до 0.3s



useQuery предлагают инструменты для управления этим процессом.isLoading. Он показывает, выполняется ли запрос данных. Если обратиться к data без проверки isLoading, это может вызвать ошибку, так как данные могут быть еще недоступны.const { isLoading, error, data } = useQuery('myData', fetchData);
Правильное использование isLoading включает проверку его значения перед применением данных, как показано в примере:function MyComponent() {
const { isLoading, error, data } = useQuery('myData', fetchData);
if (isLoading) return 'Загрузка...';
if (error) return `Произошла ошибка: ${error.message}`;
return (
<div>
<h1>{data.title}</h1>
<p>{data.description}</p>
</div>
);
}
Здесь, если isLoading = true, компонент просто отображает сообщение «Загрузка...», а использование данных начинается только после их успешной загрузки.isLoading не всегда необходима и в некоторых случаях можно использовать опциональную цепочку (optional chaining). Однако это может быть опасно. Если данные еще не получены, а мы пытаемся передать их в компонент, ожидающий конкретные данные, это может привести к ошибке. Вот пример:function MyOtherComponent({ title, description }) {
return (
<div>
<h1>{title}</h1>
<p>{description}</p>
</div>
);
}
function MyComponent() {
const { data } = useQuery('myData', fetchData);
return (
<MyOtherComponent title={data?.title} description={data?.description} />
);
}
В этом случае, если данные еще не получены, опциональная цепочка вернет undefined для data?.title и data?.description, что может вызвать ошибку в MyOtherComponent.isLoading может показаться излишней, это важный шаг для обеспечения стабильности и надежности вашего приложения, и его не следует игнорировать.


