In the context of Vue applications, a "composable" is a function that leverages Vue's Composition API to encapsulate and reuse stateful logic.
ref
из функцииimport { ref } from 'vue'
const totalActive = ref(0)
export default function useVariablesSelectedMenu() {
// Функция для обновления переменной
const setColumnActivePages = (newValue: number) => {
totalActive.value++
}
return {
setColumnActivePages,
totalActive,
}
}
export const Footer = (props?: IFooterProps) => {
const body = props?.button ? (
<>
<RNHoleView style={styles.background} holes={[hole]}>
<View style={styles.maskBorder}></View>
</RNHoleView>
{props.button}
</>
) : (
<View style={styles.background}></View>
);
return (
<View style={styles.container}>
{body}
</View>
);
};
Ключевой вопрос: а надо ли это всё вообще? Почему бы просто темплейт стринг не использовать и вставлять значения сразу? Без этих костылей.
template('Hello, {user.name}', { user: { name: 'Bob' } });
docker compose up --force-recreate
. Вам точно нужен dev режим в контейнере? const deleteBook = async () => {
const bookId = selectedBook.value.id;
const token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwY2Y5Nzk0Yi1jYjczLTcyQ";
const { data, error, refresh } = await useFetch<{ results: Book[] }>(
`https://api.storage/${bookId}`,
{
headers: {
Authorization: `Bearer ${token}`,
},
method: "delete",
server: false,
}
);
if (error.value){
console.error(error.value)
} else {
isBookDeleted.value = true;
showBookDetails.value = false;
}
refresh();
};
1) Самый простой, с заголовком
Content-Type: multipart/form-data
. Для этого нужно файлы собрать в объект FormData, а затем оправить через fetch, либо XMLHttpRequest. При таком решении прогресс получится отслеживать только на XMLHttpRequest.2. Более сложный, через стримы. Любым способом формируете объект ReadableStream, затем отправляете через fetch с опцией duplex: "half" (работает с Chrome > 105). В этом случае можно отслеживать сколько было считано из стрима.
В вашем случае скорее всего подойдет любой из способов, однако если файл большой, то обычно его на клиенте разбивают на чанки, а потом на строне бэкенда склеивают обратно. Например так: