Integración de Pinia para la Gestión de Estado en Uni-app

Pinia es una solución de gestión de estado para Vue.js que ofrece funcionalidades similares a Vuex, permitiendo el intercambio de estado global en toda la aplicación. Su integración en Uni-app es directa y no requiere instalaciones adicionales dentro del entorno HBuilder X.

Configuración Inicial en main.js

Para habilitar Pinia, es necesario importarlo y registrarlo como un plugin de la aplicaicón Vue. Sigue estos pasos en tu archivo main.js:

import { createSSRApp } from 'vue';
import { createPinia } from 'pinia'; // Importa la función createPinia

export function createApp() {
    const app = createSSRApp(App);
    app.use(createPinia()); // Utiliza la instancia de Pinia
    return {
        app,
        // No es necesario retornar Pinia en este contexto para Uni-app
    };
}

Definición de Stores (Almacenes de Estado)

Los stores definen el estado compartido, las mutaciones y las acciones. Se crean en archivos separados, típicamente dentro de un directorio stores.

// stores/computation.js
import { defineStore } from 'pinia';

// 'computation' es un identificador único para este store.
export const useComputationStore = defineStore('computation', {
    // El estado inicial del store.
    state: () => ({
        currentValue: 0,
        operationType: '+'
    }),

    // Métodos para modificar el estado.
    actions: {
        // Realiza una operación basada en el tipo de operación.
        performOperation(operand) {
            switch (this.operationType) {
                case '+':
                    this.currentValue += operand;
                    break;
                case '-':
                    this.currentValue -= operand;
                    break;
                case '*':
                    this.currentValue *= operand;
                    break;
                case '/':
                    if (operand !== 0) {
                        this.currentValue /= operand;
                    }
                    break;
                default:
                    console.warn('Operación no reconocida:', this.operationType);
            }
            console.log('Valor actualizado:', this.currentValue);
        },
        // Métodos específicos para cada operación (opcional, se pueden integrar en performOperation)
        add(operand) {
            this.currentValue += operand;
        },
        subtract(operand) {
            this.currentValue -= operand;
        },
        multiply(operand) {
            this.currentValue *= operand;
        },
        divide(operand) {
            if (operand !== 0) {
                this.currentValue /= operand;
            }
        }
    }
});

Uso del Store en Componentes

Para acceder y modificar el estado global, importa y utiliza la función del store dentro de tus componentes Vue. La reactividad está integrada automáticamente.

// pages/index.vue (o cualquier otro componente)
import { ref, computed } from 'vue';
import { useComputationStore } from '@/stores/computation.js'; // Ajusta la ruta si es necesario

export default {
    setup() {
        const computationStore = useComputationStore();
        const inputValue = ref(0);

        // Configuración para un selector de operaciones.
        const operationOptions = [{
            value: '+',
            text: 'Suma'
        }, {
            value: '-',
            text: 'Resta'
        }, {
            value: '*',
            text: 'Multiplicación'
        }, {
            value: '/',
            text: 'División'
        }];

        // Un computed property para manejar la lógica de la interfaz y la actualización del estado.
        const calculationResult = computed(() => {
            // Actualiza el estado base con el valor de entrada.
            // Nota: La lógica de actualización puede variar según el caso de uso.
            // Aquí se asume que el valor de entrada se establece como el nuevo valor base antes de la operación.
            computationStore.currentValue = parseFloat(inputValue.value);
            // Ejecuta la operación con un valor fijo (ej. 5).
            computationStore.performOperation(5);

            // Retorna una representación para la interfaz, si es necesario.
            // La lógica principal de actualización ya se realizó en las líneas anteriores.
            return `Resultado: ${computationStore.currentValue}`;
        });

        return {
            computationStore,
            inputValue,
            operationOptions,
            calculationResult
        };
    }
}

Ejemplo de Interfaz de Usuario (Template)

A continuación, se muestra un ejemplo de cómo se podría usar el store y sus datos en la plantilla de un componente Uni-app.

<template>
    <view>
        <uni-easyinput v-model="inputValue" type="number" inputBorder placeholder="Introduce un número"></uni-easyinput>

        <uni-data-checkbox v-model="computationStore.operationType" :localdata="operationOptions" mode="tag"></uni-data-checkbox>

        <view>
            Valor ingresado: {{ inputValue }}
            Operación seleccionada: {{ computationStore.operationType }}
            Valor calculado: {{ computationStore.currentValue }}
            <!-- El computed property puede ser llamado directamente si es necesario, pero la lógica principal se ejecuta en setup -->
            <!-- <view>{{ calculationResult }}</view> -->
        </view>
    </view>
</template>

Etiquetas: pinia Vue uni-app gestión de estado JavaScript

Publicado el 8-4 08:07