React Native中的全局状态

Jam*_*een 12 javascript reactjs react-native redux react-redux

我正在开发一个React Native应用程序.

我想保存登录人员的用户ID,然后检查用户是否在每个组件中登录.

所以我要找的是饼干,会话或全球状态.

我已经读过我应该使用Redux,但这似乎过于复杂,并且很难使它工作react-navigation.它迫使我为几乎所有东西定义动作和缩减器,尽管我唯一想要的是能够访问所有组件中的单个全局状态/变量.

有没有其他选择,还是我应该重新构建我的整个应用程序以使用Redux?

Rap*_*ada 12

我通常创建一个包含以下内容的global.js:

module.exports = {
   screen1: null,
};
Run Code Online (Sandbox Code Playgroud)

并在屏幕上获取状态值

import GLOBAL from './global.js'

render() {

    GLOBAL.screen1 = this;

}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在任何地方使用它,如下所示:

GLOBAL.screen1.setState({
    var: value
});
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的; 不要因为简单而小看它。我永远都在弄弄Redux只是为了获得基本相同的功能,但是使用20倍的代码和很多魔术(`connect`东西真的很烂)。 (5认同)
  • 您可以提出更可靠的解释吗?我不确定您在render(){Global.screen1state = this}中做什么 (2认同)
  • 我是新手。你如何用函数组件来做到这一点? (2认同)

小智 7

自 React 16.8.0(2019 年 2 月 6 日)更新引入 Hooks。

不强制使用外部库,如MobxRedux。(在介绍 Hook 之前,我使用了这两种状态管理解决方案)

只需 10 行源码就可以创建全局状态

import React, {createContext, useContext, useReducer} from 'react';
export const StateContext = createContext();
export const StateProvider = ({reducer, initialState, children}) =>(
  <StateContext.Provider value={useReducer(reducer, initialState)}>
    {children}
  </StateContext.Provider>
);
export const useStateValue = () => useContext(StateContext);
Run Code Online (Sandbox Code Playgroud)

使用全局状态扩展您的应用程序:

import { StateProvider } from '../state';

const App = () => {
  const initialState = {
    theme: { primary: 'green' }
  };

  const reducer = (state, action) => {
    switch (action.type) {
      case 'changeTheme':
        return {
          ...state,
          theme: action.newTheme
        };

      default:
        return state;
    }
  };


  return (
    <StateProvider initialState={initialState} reducer={reducer}>
        // App content ...
    </StateProvider>
  );
}
Run Code Online (Sandbox Code Playgroud)

有关详细说明,我建议阅读这个精彩的媒体


Bru*_*ine 5

我通常这样做全局:

我创建了一个 globals.js

module.exports = {
  USERNAME: '',
};
Run Code Online (Sandbox Code Playgroud)

类似的东西来存储用户名,然后你只需要导入:

GLOBAL = require('./globals');
Run Code Online (Sandbox Code Playgroud)

如果您想存储数据,假设您想保存用户名,只需执行以下操作:

var username = 'test';
GLOBAL.USERNAME = username;
Run Code Online (Sandbox Code Playgroud)

就这样,您只需要在您想要的页面上导入 GLOBAL 并使用它,只需使用if (GLOBAL.username == 'teste').

  • 这种方式无法正常工作并且不会触发像这样的更改。状态 (5认同)

mil*_*rac 4

在状态管理方面,Redux有一些替代方案。我建议你看看 Jumpsuit 和 Mobx。然而,不要指望它们比 Redux 更容易。状态管理基本上是一件神奇的事情,大部分小发明都发生在幕后。

但无论如何,如果您觉得需要一些全局状态管理,那么值得您花时间掌握其中一种解决方案,无论是 Redux 还是 Mobx 等。我不建议AsyncStorage为此目的使用或任何 hack 的东西。

  • 状态管理本质上并不神奇。它可以非常简单,同时最大限度地有效,而无需在幕后进行任何操作,请参阅@RaphaelEstrada 的上述答案。当*单个 javascript 对象可以同样有效地完成这项工作时,您建议使用整个代码库,其中大部分您永远不会使用。* (2认同)