如何优雅地解决多个 React、Vue App 之间的状态共享

本文探讨了如何优雅地解决多个React和Vue应用间的状态共享问题,提出了一种原始但有效的方法——全局事件监听,并讨论了其优缺点。随后介绍了React的推荐做法——使用context API提升状态。文章还详细解释了如何通过单入口打包和创建自定义`WrapPortal`组件,实现组件在不同DOM节点挂载的同时保持在同一个React树下,从而实现状态共享。
摘要由CSDN通过智能技术生成

const store = currentEmitter.store

ee.on(ACTION.ADD_COUNT, store.count.addCount, store.count)

return window.myEmitter

}

这样一个非常原始的状态共享方式就完成啦,接下来我们就看看在 React 中是如何使用的吧

import React,{ useState, useEffect} from ‘react’

import {getMyEmitter, ACTION} from ‘./getMyEmitter’

// 使用

const emitter = getMyEmitter()

const CountDemo = ()=>{

return

{emitter.store.count.value}

}

// 触发事件

const ButtonDemo = ()=>{

return <button onClick={()=>{emitter.emit(ACTION.ADD_COUNT)}}>add count

}

优点

这样的解决方案比较原始,但是的确可以解决我们的面临的问题:

  • 解决多入口打包应用无法使用统一数据源问题,统一维护管理多应用数据状态

  • 单一数据源

缺点

但是缺点也非常的明显:

  • 数据暴露在全局 window 对象,不优雅、不安全

  • 使用事件触发的方式来同步数据好像不是 React 推荐做法

  • 一旦需要注册的事件变多,将难以管理事件和状态

二、单入口打包 + 传送门

React 推荐做法

在方案一中我们说了,使用事件触发的方式同步数据不是 React 推荐做法,那数据共享的推荐做法是什么呢?React 的推荐做法是 提升状态 到各个组件最近的父级节点,借助 React 官方文档 useContext demo 来简单理解:

// 需要共享的数据

import ReactDOM from “react-dom”;

import React, { createContext, useContext, useReducer } from “react”;

import “./styles.css”;

const ThemeContext = createContext();

const DEFAULT_STATE = {

theme: “light”

};

const reducer = (state, actions) => {

switch (actions.type) {

case “theme”:

return { …state, theme: actions.payload };

default:

return DEFAULT_STATE;

}

};

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值