useEffect
сам по себе только запускается уже после рендера. const [todos, setTodos] = useState([]);
. {todos ? <TodoList todos={todos}/> : <LoadingComponent/>}
Сначала покажет какой-нить спиннер, потом подгруженный список. Promise.reslove(data)
и Promise.reject(error)
, а во-вторых: при возврате из then
\catch
даже они не нужны. interface ResponseData {
status: boolean;
data?: object;
}
function sendQuery(url: string, data: object): Promise<ResponseData> {
return fetch(url, {
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify(data)
}).then(response =>
response.json()
).then(data => ({
status: true,
data: data
})).catch(() => {
throw {
status: false
}
});
}
new Promise
, а потому выдаёт Promise<unknown>
. Т.е. каждый раз, когда вы используете new Promise
- надо использовать его с дженериком: new Promise<Type>
. require
не "берёт картинки из папки", require
обрабатывает картинки loader'om
и выдаёт в ответ результат. Статический результат, который попадает в бандл. require(`./img/${name}.png`);
- не значит "взять картинку по имени name
из папки img
во время исполнения", это значит "во время компиляции взять все картинки с маской './img/*.png',
обработать loader'ом
, получить для каждой статическую ссылку, и положить в бандл". loader'ы
по умолчанию превращают маленькие картинки в data:uri
строки, а большие перекладывают в папочку imgs
и переименовывают с хэшем, возвращая путь. Но это по-умолчанию, а так они способны много всякой магии творить.public
копируются в результирующую папку как есть и доступны по /name.png
без require
, просто через обычный html
и css
. computed
не будет пересчитаться при обновлении ref'ов или dom-значений. Он работает с реактивными данными.computed
и поместите в mounted
, вручную присваивая значения переменной в data
. Не забудьте добавить значения по умолчанию, а также обновлять их при необходимости(по событию resize или ещё какому, способныму повлиять на эти размеры)./catalog/:slug/:option?
./catalog/:slug/(.*)?
и ловить любые пути. const queryKey: AuthMessagesKeys = queryObject.message
function isAuthMessagesKey(str: string): str is AuthMessagesKeys {
return ['login', 'logout', 'session'].includes(str);
}