es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo enviar un componente de Vue con su correspondiente Vuex y CSS para poder usarlo en diferentes proyectos.

Hola, tengo 2 proyectos, uno es core y el otro es plugins [ambos proyectos tienen su propia carpeta y package.js]. Mi intención es que el plugin funcione sin compilar desde core de manera independiente.

Estructura del proyecto: solo se muestra la vista y no las carpetas

<Proyecto core> <!-- Proyecto core o proyecto 1 -->
  <iframe src="plugin/dist/index.html"> <!-- Proyecto plugins o proyecto 2 -->
<Proyecto core>

Ahora me encuentro en una situación en la que necesito trasladar por completo css y la tienda vuex al plugin.

Aquí es cómo configuro el componente principal en el objeto body cargado para que pueda usarse en plugins:

let coreComp1 = import('/path');
parent.document.components = coreComp1; // similar a jquery $('body').data('components',coreComp1)

Ahora en los plugins puedo acceder así:

<compx></compx>
...
{
components:{
 compx: ()=> parent.document.components  //<-- observe this line
}
}

Ahora el componente del core se renderiza correctamente sin los métodos css y vuex.

Los métodos vuex en mi componente principal son así:

 {
   methods:{
      doAssetUpdate(){
         this.updateAssets().then(...)  <!-- **obteniendo el error:** Cannot read properties of undefined -->
     },
     ...mapActions("assets", ["updateAssets"]),
   }
 }

Pregunta: teniendo en cuenta el escenario anterior, ¿cómo enviar el componente con el vuex y css utilizados?

Por favor ayúdame, ¡gracias de antemano!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para enviar los componentes utilizando el almacén vuex y css usados, sigue estos pasos:

    1. En primer lugar, asegúrate de que tu proyecto de plugins tenga los paquetes npm vue y vuex instalados. Si no tienes, instálalos usando los siguientes comandos:
      npm install vue --save
      npm install vuex --save
      
    2. En tu proyecto core, asegúrate de que tienes todos los archivos css necesarios importados en el componente principal App.vue. Si estás utilizando un archivo css separado, asegúrate de importarlo utilizando el siguiente código:
      <style src="./ruta/al/archivo/css.css"></style>
      

      Si tienes css escrito en el componente App.vue, asegúrate de incluirlo en el componente mismo.

    3. A continuación, asegúrate de que el almacén vuex de tu proyecto core se exporte correctamente para que pueda ser utilizado en plugins. En tu archivo store/index.js del proyecto core, exporta el almacén de esta manera:

      import Vue from 'vue';
      import Vuex from 'vuex';
      // Importa otros módulos si los hay
      
      Vue.use(Vuex);
      
      const store = new Vuex.Store({
       // tus módulos de almacén aquí
      });
      
      // Exporta el almacén
      export default store;
      

    4. En el componente CoreComponent.vue, asegúrate de que hayas importado correctamente el almacén vuex y mapeado las acciones y/o getters que estás utilizando en el componente. Por ejemplo,
      <template>
       <div>
         <!-- tu código de componente aquí -->
       </div>
      </template>
      
      <script>
      import { mapActions } from 'vuex';
      import store from '../store';
      
      export default {
       name: 'CoreComponent',
       methods: {
         // mapea cualquier acción que estés utilizando en el componente
         ...mapActions('assets', ['updateAssets']),
         doAssetUpdate() {
           this.updateAssets().then(...);
         },
       },
       // Asegúrate de agregar el objeto del almacén al componente
       store,
      }
      </script>
      
      <style scoped="">
      /* tu css de componente aquí */
      </style>
      
    5. A continuación, debes empaquetar el código de tu proyecto core en un solo archivo que incluya todas las dependencias necesarias de vue y vuex. Para hacer esto, puedes utilizar webpack para crear un paquete de biblioteca:
      webpack --config webpack.core.config.js --output-library myCoreLibrary
      

      Este comando creará un archivo myCoreLibrary.js que incluirá todo el código necesario para tu proyecto core, junto con sus dependencias.

    6. Finalmente, puedes usar el archivo myCoreLibrary.js en tu proyecto plugins agregándolo al archivo index.html de la siguiente manera:

      <script src="./ruta/a/myCoreLibrary.js"></script>
      <script>
      let coreComp1 = myCoreLibrary.CoreComponent;
      parent.document.components = coreComp1;
      </script>
      

      Ahora, puedes utilizar el componente en plugins junto con su almacén vuex y estilos css:

      <template>
       <div class="plugin-component">
         <compx></compx> <!-- Tu componente principal aquí -->
       </div>
      </template>
      
      <script>
      import { mapGetters } from 'vuex';
      import store from './ruta/a/core/store';
      import coreComp1 from './ruta/a/myCoreLibrary';
      
      export default {
       name: 'PluginComponent',
       components: {
         compx: coreComp1,
       },
       computed: {
         // Mapea cualquier getter que estés utilizando del almacén vue principal
         ...mapGetters({
           assets: 'assets/getAssets',
         }),
       },
       store,
      }
      </script>
      
      <style scoped="">
      /* tu css de componente aquí */
      .plugin-component {
       /* Agrega cualquier estilo para el componente del plug-in aquí */
      }
      </style>
      

    Al seguir estos pasos, deberías poder enviar tus componentes core junto con su almacén vuex y estilos css en tu proyecto plugins sin necesidad de compilarlos juntos.

Comments are closed.