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

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

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

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

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

6 ответов

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

Код компонента: <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); }; Но пока не перенес логику из хука в компонент, не мог понять этого 😅 Спасибо за помощь))

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта