К основному контенту

Не работает watch для <script setup> во VueJS

Создавая новый проект на VueJS, решил попробовать использовать <script setup>. Все шло хорошо, объем кода прилично сократился. Но вот пришла беда, откуда не ждали - перестал работать watch.

В проекте используется InertiaJS и, в частности, flash сообщения. Задача была - выводить всплывающее сообщение, например, при успешном удалении записи. При этом InertiaJS не перезагружает всю страницу, а только измененную ее часть.

Старая структура документа вида:

<script>
export default defineComponent({
    data(){},
    computed:{},
    watch:{
        'this.$page.props.value.flash.message': function (val) {
            // <show toast>
        }
    }
})
</script>

А вот в новом формате и с использованием CompositionAPI работать отказалась.

Непродолжительные поиски ответа привели к тому, что конструкция 'this.$page.props.value.flash.message' не является реактивной и решение оказалось довольно простым: нужно сделать эту конструкцию реактивной через использование функции ref. В коде ниже сделано computed свойство для упрощения кода.

<script setup>
const _foo = ref((usePage().props.value.flash as any).message)
 
const pageFlashMessage = computed(() => {
    return (usePage().props.value.flash as any).message
})
 
watch(() => pageFlashMessage, () => {
    if (pageFlashMessage.value) {
        useToast().success(pageFlashMessage.value)
    }
}, {deep: true})

</script> 

Комментарии

Популярные сообщения из этого блога

Прямые ссылки на файлы Google диска

В предыдущей статье я рассказал, как подключить свой JavaScript файл к блогу BLOGSPOT . Но для того, что бы их подключить нужны прямые ссылки на файл, а Google диск при предоставлении общего доступа к файлу выдает ссылку на предварительный просмотр, которая никак напрямую не ссылается на файл. Для Google диска прямая ссылка на файл - это ссылка на скачивание. Ниже описаны два способа создания ссылки на скачивание на примере файла prism.js.

События для ведения таблиц

Как и всегда, в пылу проекта внезапно родилась Z табличка. Главный нюанс был в том, что она должна была хранить пароли для авторизации на стороннем сервере. Естественно, никто не хотел хранить пароли в открытом виде, а двустороннее шифрование SAP не умеет без сторонних пакетов и надстроек. Далее, все как обычно - придумали алгоритм, сделали табличку. Дело осталось за малым - нужно шифровать пароли, которые вводит пользователь. Делать отдельную программу нет смысла, поскольку ее функционал мало чем будет отличаться от сгенерированного. Вот здесь на помощь приходят события! С их помощью можно, наверное, все. По крайней мере, я не нашел чего-либо, что нельзя сделать с данными через события.

OOP ALV GRID с HTML шапкой

В этой статье хочу постараться подробно описать и привести пример, как можно создать ALV отчет с таблицей на весь экран и с HTML шапкой вверху. Я не буду описывать начальный этап, где пишется селекционный экран или делается выборка данных. Будем считать, что основа у нас есть и нам нужно просто вывести данные. Главной изюминкой является то, что нужно вывести ALV GRID на экран без использования каких-либо дополнительных элементов на экране. Step-By-Step Шаг 1. Создание окна Создаем самое простое окно с номером 100. На него не нужно кидать никаких контейнеров. Оно нам нужно только для модулей PAI и PBO и вывода на него ALV GRID.