全民绳索营救小游戏
115.23MB · 2025-10-21
React 共享状态:告别“祖传”Props,拥抱“真香”体验!?
各位掘友,请脑补这个经典剧情:
你正在快乐地写着 React 组件,突然发现:卧槽!这个 state 居然要在另一个组件里用到?!?
于是你开始了传统艺能三选一:
是不是已经开始 emo 了?别急,今天我就要安利一个让你直呼"真香"的解决方案!
隆重介绍:react-shared-states ?(此处应有掌声)
GitHub 指路:react-shared-states
来看个效果炸裂的 demo:
import { useSharedState } from "react-shared-states";
function ComponentA() {
const [count, setCount] = useSharedState("counter", 0);
return <button onClick={() => setCount(count + 1)}>A: {count}</button>;
}
function ComponentB() {
const [count, setCount] = useSharedState("counter", 0);
return <button onClick={() => setCount(count + 1)}>B: {count}</button>;
}
// No provider needed!
function App() {
return (
<>
<ComponentA />
<ComponentB />
</>
);
}
点击 A,B 自动更新!就问你神不神奇?只需要一个相同的 key,世界大同!
这波操作堪称:一行代码,全球同步 ?
某天,我基友兴冲冲地用起了 useBetween 这个库,代码写得飞起:
const userData = useBetween(useUserData); // 一次请求,随处使用
效果拔群!堪称 Firebase 好搭档!
然后......React 19 发布了,他的项目炸了!?
为什么?因为他发现了这段让人瞳孔地震的代码:
const ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
// 注意:这是危险操作,请勿模仿!
好家伙!作者直接用了 React 的私密接口,现在 React 19 删了这接口,库就原地爆炸了!
于是我基友只能含泪回归 Redux,从"真香"变成"真伤"?
React 其实早就给了我们正经方案:useSyncExternalStore!
看这个炫酷的示例:
let counter = 0;
let listeners = [];
const subscribe = (listener) => {
listeners.push(listener);
return () => listeners = listeners.filter(l => l !== listener);
};
const getSnapshot = () => counter;
const setCounter = (value) => {
counter = value;
listeners.forEach(listener => listener());
};
function CounterComponent() {
const value = useSyncExternalStore(subscribe, getSnapshot);
return <button onClick={() => setCounter(value + 1)}>{value}</button>;
}
这才是官方认证的优雅姿势!从此告别 hack,走向人生巅峰!
有时候你只想在小圈子里共享状态?安排!
<SharedStatesProvider>
<YourComponent />
</SharedStatesProvider>
想来点更骚的操作?多个组件树共享同一状态?
<SharedStatesProvider scopeName="modal">
<ModalContent />
</SharedStatesProvider>
<Portal>
<SharedStatesProvider scopeName="modal">
<FloatingToolbar />
</SharedStatesProvider>
</Portal>
即使在不同 React 树中,也能同步状态,就问你6不6!
const fetchUser = () => fetch("/api/me").then(r => r.json());
function Profile() {
const { state, trigger } = useSharedFunction("current-user", fetchUser);
useEffect(() => { trigger(); }, []);
if (state.isLoading && !state.results) return <p>Loading...</p>;
if (state.error) return <p>Error!</p>;
return <h1>{state.results.name}</h1>;
}
一次请求,全家享用!自动缓存+去重,性能优化直接拉满!
const { state, trigger } = useSharedSubscription(
"user-123",
(update, onError, onComplete) => {
const unsubscribe = firebase.onSnapshot(doc(db, "users", "123"), (snapshot) => {
update(snapshot.data());
}, onError, onComplete);
return unsubscribe;
}
);
第一个组件建立连接,其他组件白嫖数据!用完自动断开,绝不内存泄漏!
import { sharedStatesApi } from "react-shared-states";
sharedStatesApi.set("theme", "dark"); // 随时随地修改状态
console.log(sharedStatesApi.get("theme"));
SSR、调试、非 React 代码都能用,就问你贴不贴心!
如果你也:
那么......还不快去给个 Star!⭐️
GitHub 传送门:react-shared-states
因为说真的......React 状态管理从未如此简单,如此有趣!?
(小声说:用了这个,你可能就再也回不去了......)
冲击小米 SU7 Ultra 纪录:保时捷最速四门轿车 Panamera Turbo GT 曝光,V8 引擎、预估 800 马力
《原神》6.1复刻角色一览