const [selected, setSelected] = useState('all');
let filterdTodos;
switch(selected) {
case 'all':
filterdTodos = todos;
break;
case 'checked':
filterdTodos = todos.filter(t => t.checked);
break;
case 'notChecked':
filterdTodos = todos.filter(t => !t.checked);
break;
}
const [selected, setSelected] = useState('all');
const filterdTodos = useMemo(() => {
switch(selected) {
case 'all':
return todos;
case 'checked':
return todos.filter(t => t.checked);
case 'notChecked':
return todos.filter(t => !t.checked);
}
}, [selected, todos])
<select className="todos__filter" onChange={(event) =>setSelected(event.target.value)}>
...
{filterdTodos.map(...)}
products
должны быть ref
. Сейчас они не реактивны(никак не реагируют на изменения). При этом ты присваииваешь массиву value. То что это хоть как-то работало - очередное чудо.export const useAllMainFiltersStore = defineStore('allMainFilters', () => {
const products = ref([]);
try {
async function getStoreData() {
sidebarResizeStore.updateSidebarVisibility()
const data = await productsData();
products.value = data;
}
getStoreData()
} catch (error) {
console.error('Error:', error);
}
return {
products,
}
})
const route = useRoute();
// продукт делаем вычисляемым, чтоб не городить вотчеров
const product = computed(() => getProductById(route.params.id));
function getProductById(id) {
console.log('products component: ', mainFiltersStore.products) //при первой загрузке всё ок, при перезагрузке страницы всё ломается и пустой массив в придачу
return products.find(product => product.id == id);
}
watch(product, current => {
// проверяем что продукт есть
if (current) fetchComments(current.id);
}, { immediate: true })
inline
, тут используется кастомный иконсет settings
. __vueParentComponent
.:)this.$parent
для родительского компонента или ты можешь использовать ref для выбора конкретного. props
из родителя и не городи огород.getFormattedData
тоже должен быть дженерик и собсно его(дженерик) прокидывать в нижестоящие.type Type1 = 1;
type Type2 = 2;
type Type3 = 3;
type ContainsType<T extends UniversalType = UniversalType> = {type: T};
type UniversalType = Type1 | Type2 | Type3;
class Cls {
async getFormattedData<T extends UniversalType>(data: ContainsType<T>): Promise<T> {
const anyDataObject = this.validateData(data);
const result = this.formatDataByType(anyDataObject);
return result;
}
validateData<T extends UniversalType = UniversalType>(data: ContainsType<T>): T {
return data.type
}
formatDataByType<T extends UniversalType = UniversalType>(data: T): T {
return data
}
}
const foo = await new Cls().getFormattedData({type: 2}); // 2
const anyDataObject: Type1 | Type2 | Type3 = ...
if (anyDataObject === 2) {
// тут anyDataObject для ts считается Type2
}
но это уже никак не повлияет на выходной тип.Math.random()
. input
нет свойства length
.var intxt=document.querySelector('input').length;
intxt === undefined
console.log
вообще-то должен был тебе это показать.if(intxt.length<5){
тут ты пытаешься получить свойство length
у unefined
о чем тебе и пишет ошибка.var intxt=document.querySelector('input');
....
if(intxt.value.length<5){
....
} else {
import img from './assets/img.jpeg'
public
и брать их как есть по прямым путям относительно корня без всяких хэшей.interface MutableRefObject<T> {
prev: null | HTMLParagraphElement;
}
declare module 'lib-name' {
interface MutableRefObject<T> {
prev: null | HTMLParagraphElement;
}
}
declare module 'lib-name/full/path/to/declaration.ts' {
interface MutableRefObject<T> {
prev: null | HTMLParagraphElement;
}
}
interface MySuperMutableRefObject extends MutableRefObject<T> {
prev?: null | HTMLParagraphElement;
}
async function multiStep() {
await step1();
if (stop) throw new Error(stop);
await step2();
if (stop) throw new Error(stop);
await step3();
if (stop) throw new Error(stop);
}
и никак красивее не сделать. function* multiStep() {
yield step1();
yield step2();
yield step3();
}
Ctrl++
. Если ты хочешь тупо такое же масштабирование, то не надо*. import { ref, h } from 'vue';
function loadScript(options, root = document.head) {
return root.appendChild(Object.assign(document.createElement('script'), options));
}
const Comp = defineComponent(() => {
const root = ref(null);
onMounted(() => {
loadScript(
{
innerHTML: `
!(function (a, m, o, c, r, m) {
(a[o + c] = a[o + c] || {
setMeta: function (p) {
this.params = (this.params || []).concat([p]);
},
}),
(a[o + r] =
a[o + r] ||
function (f) {
a[o + r].f = (a[o + r].f || []).concat([f]);
}),
a[o + r]({
id: "....",
hash: "....",
locale: "ru",
}),
(a[o + m] =
a[o + m] ||
function (f, k) {
a[o + m].f = (a[o + m].f || []).concat([[f, k]]);
});
})(window, 0, "amo_forms_", "params", "load", "loaded");
`
},
root.value
);
loadScript(
{
id: 'amoforms_script_...',
async: 'async',
charset: 'utf-8',
src: 'https://forms.amocrm.ru/forms/assets/js/amoforms.js?...'
},
root.value
);
});
return () => h('div', { ref: root });
});