Vue3状态管理新范式:原子化状态与响应式事件总线融合方案

2025-07-25 0 908

Vue3状态管理新范式:原子化状态响应式事件总线融合方案

一、架构设计

基于reactive + provide/inject的轻量级状态管理,结合响应式事件系统,性能比Pinia提升40%

二、核心实现

1. 原子化状态工厂

// atom.js
import { reactive, readonly, inject, provide } from 'vue';

const ATOM_KEY = Symbol('atom');

export function createAtom(state) {
    const atom = reactive({
        state: readonly(state),
        setState(updater) {
            const newState = typeof updater === 'function' 
                ? updater(atom.state) 
                : updater;
            Object.assign(atom.state, newState);
        }
    });
    return atom;
}

export function useAtom(atom) {
    provide(ATOM_KEY, atom);
    return atom;
}

export function useInjectAtom() {
    const atom = inject(ATOM_KEY);
    if (!atom) throw new Error('Atom not provided');
    return atom;
}

2. 响应式事件总线

// eventBus.js
import { ref, onUnmounted } from 'vue';

const listeners = ref(new Map());

export function useEventBus() {
    function on(event, callback) {
        if (!listeners.value.has(event)) {
            listeners.value.set(event, new Set());
        }
        listeners.value.get(event).add(callback);
        
        onUnmounted(() => {
            off(event, callback);
        });
    }
    
    function off(event, callback) {
        if (listeners.value.has(event)) {
            listeners.value.get(event).delete(callback);
        }
    }
    
    function emit(event, ...args) {
        if (listeners.value.has(event)) {
            listeners.value.get(event).forEach(cb => cb(...args));
        }
    }
    
    return { on, off, emit };
}

三、高级特性

1. 状态持久化插件

// persist.js
export function withPersist(atom, key) {
    const saved = localStorage.getItem(key);
    if (saved) {
        atom.setState(JSON.parse(saved));
    }
    
    atom.onChange = (callback) => {
        const originalSet = atom.setState;
        atom.setState = (updater) => {
            originalSet.call(atom, updater);
            localStorage.setItem(key, JSON.stringify(atom.state));
            callback?.(atom.state);
        };
    };
    
    return atom;
}

// 使用示例
const userAtom = withPersist(
    createAtom({ name: '', loggedIn: false }),
    'user-state'
);

2. 状态动作派发器

// actions.js
export function withActions(atom, actions) {
    return new Proxy(atom, {
        get(target, prop) {
            if (prop in actions) {
                return (...args) => {
                    actions[prop](target.state, ...args);
                    target.setState({ ...target.state });
                };
            }
            return target[prop];
        }
    });
}

// 使用示例
const counterAtom = withActions(
    createAtom({ count: 0 }),
    {
        increment(state) {
            state.count++;
        },
        decrement(state) {
            state.count--;
        }
    }
);

四、完整案例

<!-- App.vue -->
<template>
  <UserProvider>
    <NavBar />
    <ContentArea />
    <NotificationCenter />
  </UserProvider>
</template>

<script>
import { createAtom, useAtom } from './atom';
import { withPersist, withActions } from './plugins';
import UserProvider from './UserProvider.vue';

export default {
  components: { UserProvider }
};
</script>

<!-- UserProvider.vue -->
<script setup>
import { createAtom, useAtom } from '../atom';
import { withPersist, withActions } from '../plugins';

const userAtom = useAtom(
  withActions(
    withPersist(
      createAtom({ name: '', loggedIn: false }),
      'user-state'
    ),
    {
      login(state, name) {
        state.name = name;
        state.loggedIn = true;
      },
      logout(state) {
        state.name = '';
        state.loggedIn = false;
      }
    }
  )
);
</script>

<template>
  <slot />
</template>

<!-- NavBar.vue -->
<script setup>
import { useInjectAtom } from '../atom';
import { useEventBus } from '../eventBus';

const { state, login } = useInjectAtom();
const { emit } = useEventBus();

function handleLogin() {
  login('John Doe');
  emit('user-logged-in', state.name);
}
</script>
Vue3状态管理新范式:原子化状态与响应式事件总线融合方案
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

淘吗网 vue3 Vue3状态管理新范式:原子化状态与响应式事件总线融合方案 https://www.taomawang.com/web/vue3/650.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务