restate / v1.0.0
ಪ್ರಾರಂಭ
restate ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ, ಮೊದಲ ಮೌಲ್ಯವನ್ನು ಕಾಂಪೊನೆಂಟ್ಗಳ ನಡುವೆ ಹಂಚಿಕೊಳ್ಳಿ, ಮತ್ತು ಅದೇ ಸ್ಟೋರ್ ಅನ್ನು React ಹೊರಗೆ ಬಳಸಿ.
ಈ ಪುಟದಲ್ಲಿ
ಇನ್ಸ್ಟಾಲೇಶನ್ನಿಮ್ಮ ಮೊದಲ ಹಂಚಿಕೊಂಡ ಸ್ಟೇಟ್ಮೌಲ್ಯ ನವೀಕರಿಸುವುದುReact ಹೊರಗೆ ಬಳಕೆTypeScriptReact Nativeಎಲ್ಲ ಪ್ಲಾಟ್ಫಾರ್ಮ್ಗಳಲ್ಲಿ ಒಂದೇ ಘೋಷಣೆಇನ್ಸ್ಟಾಲೇಶನ್
restate React 16.8 ಮತ್ತು ಹೊಸ ಆವೃತ್ತಿಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ. TypeScript ಘೋಷಣೆಗಳು ಜೊತೆಗೆ ಬರುತ್ತವೆ, ಬೇರೆ ರನ್ಟೈಮ್ ಅವಲಂಬನೆಗಳಿಲ್ಲ.
npm install @kkwaenggwari/restateನಿಮ್ಮ ಮೊದಲ ಹಂಚಿಕೊಂಡ ಸ್ಟೇಟ್
ಕಾಂಪೊನೆಂಟ್ಗಳ ಹೊರಗೆ ಒಮ್ಮೆ ಸ್ಟೋರ್ ರಚಿಸಿ. restate ಹಿಂತಿರುಗಿಸುವ ಮೌಲ್ಯ ಒಂದು ಹುಕ್, ಮತ್ತು set, get ನಂತಹ ಮೆಥಡ್ಗಳಿರುವ ಆಬ್ಜೆಕ್ಟ್ ಕೂಡ.
Editor ಮತ್ತು CharacterCount ನಡುವೆ props ಆಗಲಿ Provider ಆಗಲಿ ಇಲ್ಲ. ಒಂದರಲ್ಲಿ ಟೈಪ್ ಮಾಡಿದರೆ ಇನ್ನೊಂದು ನವೀಕರಣಗೊಳ್ಳುತ್ತದೆ.
import { restate } from '@kkwaenggwari/restate';
export const useDraft = restate('');
export function Editor() {
const text = useDraft();
return <textarea value={text} onChange={(event) => useDraft.set(event.target.value)} />;
}
export function CharacterCount() {
const count = useDraft((text) => text.length);
return <span>{count} characters</span>;
}ಮೌಲ್ಯ ನವೀಕರಿಸುವುದು
set ಹೊಸ ಮೌಲ್ಯ ಅಥವಾ ಹಿಂದಿನ ಮೌಲ್ಯದ ಫಂಕ್ಷನ್ ಸ್ವೀಕರಿಸುತ್ತದೆ. reset ನೀವು ಘೋಷಿಸಿದ ಮೌಲ್ಯಕ್ಕೆ ಹಿಂತಿರುಗುತ್ತದೆ.
ಮೌಲ್ಯವನ್ನು ಬದಲಾಯಿಸಲಾಗದ್ದು ಎಂದು ಪರಿಗಣಿಸಿ: ಹಳೆಯದನ್ನು ಬದಲಿಸುವ ಬದಲು ಹೊಸ ಆಬ್ಜೆಕ್ಟ್ ಅಥವಾ ಅರೇ ಹಿಂತಿರುಗಿಸಿ, ಆಗ ಸೆಲೆಕ್ಟರ್ಗಳು ಬದಲಾವಣೆ ನೋಡುತ್ತವೆ.
push ಮೂಲಕ cart.items ಗೆ ವಸ್ತು ಸೇರಿಸಿ useCart.set(cart) ಕಾಲ್ ಮಾಡುತ್ತೀರಿ. ಯಾಕೆ ಏನೂ ರೆಂಡರ್ ಆಗುವುದಿಲ್ಲ?
ಸ್ಟೋರ್ ಅದೇ ಆಬ್ಜೆಕ್ಟ್ ಪಡೆಯುತ್ತದೆ, ಮತ್ತು Object.is ಯಾವುದೇ ಬದಲಾವಣೆ ಕಾಣುವುದಿಲ್ಲ. ಹೊಸ ಆಬ್ಜೆಕ್ಟ್ ಹಿಂತಿರುಗಿಸಿ, ಉದಾಹರಣೆಗೆ useCart.set(cart => ({ ...cart, items: [...cart.items, item] })).
useCount.set(10); // replace the value
useCount.set((count) => count + 1); // compute from the previous value
useCount.reset(); // back to the declared initial valueReact ಹೊರಗೆ ಬಳಕೆ
ಅದೇ ಸ್ಟೋರ್ ಈವೆಂಟ್ ಹ್ಯಾಂಡ್ಲರ್ಗಳು, ಸೇವೆಗಳು ಮತ್ತು ಪರೀಕ್ಷೆಗಳಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ. get ಪ್ರಸ್ತುತ ಮೌಲ್ಯ ಓದುತ್ತದೆ; subscribe ಪ್ರತಿ ಬದಲಾವಣೆಯ ನಂತರ ನಿಮ್ಮನ್ನು ಕಾಲ್ ಮಾಡಿ, ಕೇಳುವುದನ್ನು ನಿಲ್ಲಿಸುವ ಫಂಕ್ಷನ್ ಹಿಂತಿರುಗಿಸುತ್ತದೆ.
import { useCart } from './stores/cart';
// Any module, event handler or test can use the same store.
const current = useCart.get();
useCart.set((cart) => ({ ...cart, items: [...cart.items, 'Pen'] }));
const stop = useCart.subscribe((cart, previous) => {
console.log(previous.items.length, '→', cart.items.length);
});
stop();TypeScript
ಸ್ಟೇಟ್ ಟೈಪ್ ಅನ್ನು ಒಮ್ಮೆ ಕೊಡಿ. ಸೆಲೆಕ್ಟರ್ಗಳು, set ಮತ್ತು ಪ್ರತಿ ಮೆಥಡ್ ಅದರಿಂದ ಟೈಪ್ ಪಡೆಯುತ್ತವೆ.
import { restate } from '@kkwaenggwari/restate';
type Cart = { items: string[]; coupon: string };
export const useCart = restate<Cart>({ items: [], coupon: '' });
const count = useCart((cart) => cart.items.length); // number
useCart.set((cart) => ({ ...cart, coupon: 'SPRING' }));React Native
React Native ನಲ್ಲಿ ಮೆಮೊರಿ ಸ್ಟೋರ್ಗಳಿಗೆ ಬೇರೇನೂ ಬೇಕಿಲ್ಲ. ಸ್ಟೇಟ್ ಉಳಿಸಲು react-native-mmkv ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ; React Native ಪ್ರವೇಶ ಬಿಂದು ಅದನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಲೋಡ್ ಮಾಡುತ್ತದೆ.
bare ಪ್ರಾಜೆಕ್ಟ್ಗಳಲ್ಲಿ ಇನ್ಸ್ಟಾಲ್ ನಂತರ iOS ಗಾಗಿ pod install ರನ್ ಮಾಡಿ. Expo ನಲ್ಲಿ development build ಬಳಸಿ, ಏಕೆಂದರೆ MMKV ನೇಟಿವ್ ಮಾಡ್ಯೂಲ್.
npm install @kkwaenggwari/restate react-native-mmkv@4 react-native-nitro-modulesಎಲ್ಲ ಪ್ಲಾಟ್ಫಾರ್ಮ್ಗಳಲ್ಲಿ ಒಂದೇ ಘೋಷಣೆ
ಉಳಿಸಲಾಗುವ ಸ್ಟೋರ್ ಬ್ರೌಸರ್ನಲ್ಲಿ IndexedDB ಮತ್ತು React Native ನಲ್ಲಿ MMKV ಬಳಸುತ್ತದೆ. ಘೋಷಣೆ ಮತ್ತು ನಿಮ್ಮ ಕಾಂಪೊನೆಂಟ್ಗಳು ಹಾಗೆಯೇ ಉಳಿಯುತ್ತವೆ.
import { persistedRestate } from '@kkwaenggwari/restate';
// IndexedDB on the web, MMKV on React Native. Same declaration.
export const useDraft = persistedRestate('', { key: 'draft' });