NinaFFF
@NinaFFF
начинающий программист

Почему не работает реактивность VUE3 CompositionAPI?

Пожалуйста подскажите, почему не срабатывает реактивность между не связанными компонентами:

ModalsController.js:
import { ref } from 'vue';
export const useModal = (init = false)=>{
  const isShowModal = ref(init);
  const openModal = () => {
    isShowModal.value = true;
  };
  
  const closeModal = () => {
    isShowModal.value = false;
  };
  return {
    isShowModal, openModal, closeModal
  }
}


Header.vue:
<template>
    
  <button @click="openModal">OpenModal</button>
 {{isShowModal}} 
    <button @click="closeModal">CloseModal</button>
</template>

<script setup>

import {useModal} from "./ModalsController.js";
const { isShowModal,openModal,closeModal } = useModal();
  
  

</script>


Modal.vue:
<template>
 
  <div v-if="isShowModal"> Modal window </div>
  
</template>

<script setup>
 import {useModal} from "./ModalsController.js";
const {isShowModal} = useModal();

</script>


Причем все работает если я создаю вместо функции простую переменную вот так:
ModalsController.js:
import { ref } from 'vue';
export const isShowModal = ref(false);

и соответственно меняю ее в хедере. Но это очень не удобно, т.к. есть еще много функций (переключение и.т.п.)
Заранее всем спасибо за помощь, вот тут я выложила в Playground для теста:
Не рабочий вариант
Рабочий вариант
  • Вопрос задан
  • 287 просмотров
Решения вопроса 1
@GrayHorse
Во-первых, код можно было бы и отформатировать как-нибудь: первый вариант, второй.

Не работает, потому что для каждого компонента при вывозе useModal() создаются свои личные isShowModal, openModal, closeModal переменные.

Если не пытаться сделать из Vue подобие React Hooks, то вот: рабочий вариант.
(Из расчета, что компонент будет в одном экземпляре.)

Формальности ради: если компонент планируется использовать больше одного раза, то modal-state.js нужно оформить в виде класса, и передавать экземпляр* этого класса компоненту в виде пропса.
Сейчас же modal-state.jsпо сути синглтон.

*Который все равно нужно будет хранить где-то (в каком-то js файле), если планируется доступ из нескольких компонентов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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