169 похожих чатов

Ребят, привет) Снова нужен совет) Ситуация: есть базовый компонент BaseInput и связанный

хук useInput.
Задача: внутри хука useInput менять значение вводимых символов и оставлять только цифры, а потом возвращать новое значение inputValue в компонент и обновлять modelValue на inputValue.
Проблема: есть рассинхронизация между modelValue у инпута и отображаемыми значениями. То есть у modelValue всё корректно отображается, а на экране неправильно. Например, если вводить буквы, то modelValue не будет обновляться, но буквы будут появляться на экране. Причем если вместо букв ввести цифру, то значения modelValue и инпута на экране синхронизируются.

Вопрос: из-за чего может быть такое поведение?

Интересный факт: если внутри хука в регулярном выражении менять символы не на пустую строку, а на пробел, например, то всё нормально будет работать 🙄

6 ответов

24 просмотра
Василий-Калмыков Автор вопроса

Код компонента: <script setup lang="ts"> import useInput from '~/composables/input'; /** Пропсы компонента */ interface Props { /** ID поля */ id: string; /** Имя поля */ name: string; /** Значение поля */ modelValue: string; /** Тип поля */ type?: string; /** Замещающий текст */ placeholder?: string; /** Тип автозаполнения */ autocomplete?: string; /** Разрешенные символы */ pattern?: string; /** Обязательно ли заполнять поле */ isRequired?: boolean; } /** Пропсы */ // eslint-disable-next-line @typescript-eslint/no-unused-vars const props = defineProps<Props>(); // eslint-disable-next-line @typescript-eslint/no-unused-vars const emits = defineEmits(['update:modelValue']); /** Переключить интенсивность цвета у заполнителя поля телефона */ const togglePhonePlaceholderIntense = (event: Event) => { const target = event.target as HTMLInputElement; if (target.type === 'tel') { target.classList.toggle('input--intense-placeholder'); } }; /** Обработать ввод */ const handleInput = (event: Event) => { const { inputValue } = useInput(event.target as HTMLInputElement); emits('update:modelValue', inputValue.value); }; </script> <template> <input :id="id" :name="name" :value="modelValue" :type="type" :placeholder="placeholder" :autocomplete="autocomplete" :pattern="pattern" :required="isRequired" class="input" @input="handleInput" @focusin="togglePhonePlaceholderIntense" @focusout="togglePhonePlaceholderIntense" /> </template> Код хука: import { ref } from 'vue'; /** Хук для управления полем ввода */ export default function useInput(target: HTMLInputElement) { const inputValue = ref(''); const handleTelInput = () => { inputValue.value = target.value.replace(/\D/g, ''); }; if (target.type === 'tel') { handleTelInput(); } return { inputValue, }; }

Василий Калмыков
Код компонента: <script setup lang="ts"> import us...

начнем с того, что у тебя структура вообще неверная: твой композабл на самом деле не композабл, это просто обычная функция, которую ты вызываешь в обработчике и на каждое изменение создаешь новый реф, так не нужно делать композабл должен вызываться 1 раз в корне сетапа, а не в обработчиках

Василий-Калмыков Автор вопроса
Artyom Tuchkov
начнем с того, что у тебя структура вообще неверна...

Насчёт структуры понял, спасибо) Наверное, лучше вообще удалить этот композабл и писать логику сразу в компоненте?

Василий Калмыков
Насчёт структуры понял, спасибо) Наверное, лучше ...

пока выглядит так, что да, он особо и не нужен, т.к. даже реф оттуда не переиспользуется лучше пока вынести все это в компонент, а потом уже смотреть, понадобится ли тебе в разных компонентах одна и та же логика

Василий-Калмыков Автор вопроса
Василий-Калмыков Автор вопроса
Artyom Tuchkov
пока выглядит так, что да, он особо и не нужен, т....

В общем разобрался: я в обработчике обновлял стороннюю реактивную переменную, а не target.value) А надо было так: const handleInput = (event: Event) => { const target = event.target as HTMLInputElement; if (target.type === 'tel') { target.value = target.value.replace(/\D/g, ''); } emits('update:modelValue', target.value); }; Но пока не перенес логику из хука в компонент, не мог понять этого 😅 Спасибо за помощь))

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта