当前位置: 首页 > 软件库 > 程序开发 > 常用工具包 >

react-fax-store

基于 React 的轻量级状态库
授权协议 MIT
开发语言 JavaScript TypeScript
所属分类 程序开发、 常用工具包
软件类型 开源软件
地区 国产
投 递 者 宋鸿
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

基于 React v16 的 Context 简单封装的轻量级状态库。

安装

npm install --save react-fax-store

使用

import {createStore} from 'react-fax-store';

const Store = createStore(() => ({text: 'fax-store'}));

function App(){
    const data = React.useContext(Store.Context); // {text: 'fax-store'} subscribe state
    const state = store.useState(); // {text: 'fax-store'} subscribe state
    const text = store.useSelector( state => state.text ); // fax-store subscribe only state.text change
    const store = store.useStore();
    store.getState(); // {text: 'fax-store'}
    store.setState({
        text : 'react-fax-store'
    });
    // or 
    const update = store.useUpdate();
    update({
        text : 'react-fax-store'
    });

    return <Store.Consumer>{ state => console.log(state) }</Store.Consumer>
}

<Store.Provider>
    <App />
</Store.Provider>

createStore(initialValue: () => {}): Store;

创建Store对象

import {createStore} from 'react-fax-store';

createStore(() => {
    return {
        ...
    }
})

Store

Provider

<Store.Provider>
    ...
</Store.Provider>

Consumer

<Store.Provider>
    ...
    <Store.Consumer>
        {state => {
            return <div>{state}</div>
        }}
    </Store.Consumer>
    ...
</Store.Provider>

useState

订阅整个数据

function Info(){
    const state = Store.useState();
    return <div>{state}</div>
}

useSelector

订阅指定数据

function Info(){
    const state = Store.useSelector(state => {
        return {
            username: state.username
        }
    });
    return <div>{state.username}</div>
}

useUpdate

更新数据

function Action(){
    const update = Store.useUpdate(prevState => {
        return {
            username: prevState.username + '_xc'
        }
    });
    return <button onClick={update}>Add</button>
}

useProvider

别名:useStore

获取由Provider提供的store数据对象

const store = Store.useStore();
store.getState();
// or
store.setState(...)

Context

可直接通过React.useContext获取数据

const state = React.useContext(Store.Context);

interface

export type withHooks = <T>(c:T) => T;

export type createStore = <T extends Record<string | number | symbol, any>>(
	initialValue: () => T
): Store<T>

export type Update<T = {}> = <K extends keyof T>(
	state: ((prevState: Readonly<T>) => Pick<T, K> | T | null) | Pick<T, K> | T | null
) => void;
 type Subscriber<T = {}> = (prevState: Readonly<T>, nextState: Readonly<T>) => void;
 type UseSelector<T = {}> = <S extends (state: T) => any>(selector: S) => ReturnType<S>;
 type UseUpdate<T = {}> = () => Update<T>;
 type UseState<T = {}> = () => T;
 type UseProvider<T> = () => Provider<T>;
 type Consumer<T = {}> = React.FC<ConsumerProps<T>>;
 type Context<T> = React.Context<T>;

 interface ConsumerProps<T = {}> {
	children: (state: T) => React.ReactElement | null;
}

 interface Provider<T = {}> extends React.Component<{}, T> {
	getSubscribeCount(): number;
    subscribe(subscriber: Subscriber<T>): () => void;
    getState(): T;
}

 interface Store<T = {}> {
	Context: Context<T>;
	Provider: new (props: {}) => Provider<T>;
	Consumer: Consumer<T>;
	useProvider: UseProvider<T>;
	useStore: UseProvider<T>;
	useState: () => T;
	useSelector: UseSelector<T>;
	useUpdate: UseUpdate<T>;
}

Example

store.js

import {createStore} from 'react-fax-store';

export default createStore(() => {
    return {
        name: 'react-fax-store';
    }
});

index.js

import React from 'react'
import Store from './store';

function Info(){
    const state = Store.useState();
    return <div>{state.name}</div>
}

function App(){
    return (
        <Store.Provider>
            <Info />
        </Store.Provider>
    );
}

export default App;
  • 创建redux中的store 1. 安装Redux 安装我就不写在这; 百度一下你就知道; 百度上面有很多; 2. 创建store 1. 在src目录下创建一个名字叫store的文件夹 2. 在store文件夹下创建一个名字叫index.js的文件 3. 在store文件夹下创建一个名字叫reducer.js的文件 4. 开始写代码 store文件夹下的index.js&&reducer文件

  • // 刷新页面的时候 持久化的数据有重新存储到 reducer中 import { createStore, combineReducers, compose, applyMiddleware } from 'redux' import promise from 'redux-promise' import thunk from 'redux-thunk' // 数据持久化 import { pe

 相关资料
  • 我正在使用请求npm包,它只是一个包装在HTTP调用中的promise。我过去对promise有过意见。我如何获得一个promise返回一个值,以便我可以在react中使用它,或者获得一个promise在该promise中设置一个react状态变量?我需要一个API调用的特定数字来设置一个react状态变量。 对于这样的代码... 而且

  • 问题内容: 我一直在学习Redux,尚不清楚的部分是,如何确定使用React State与Redux Store之间的关系,然后分派动作。从到目前为止的阅读来看,看起来我可以使用React状态代替Redux存储,并且仍然可以完成工作。我了解使用Redux存储的关注点分离,只有一个容器组件,其余的作为无状态组件,但是我对如何确定何时使用React state Vs redux存储的决定不清楚。有人可

  • 主要内容:React 实例,React 实例,React 实例,React 实例React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。 React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。 以下实例创建一个名称扩展为 React.Component 的 ES6 类,在 render() 方法中使用 this.state 来修改当前的时

  • 到目前为止,我们已经使用React作为静态渲染引擎。现在,我们将添加状态使React组件更加动态。 特性(props)和状态(state)之间的主要区别是,状态是内部的并由组件自身所控制,而特性是外部的并由任何渲染组件所操作。 让我们在实例中来看看: 在上述代码中,有3个关键接口:getInitialState、this.state和this.setState。 getInitialState用来

  • 本文向大家介绍基于VuePress 轻量级静态网站生成器的实现方法,包括了基于VuePress 轻量级静态网站生成器的实现方法的使用技巧和注意事项,需要的朋友参考一下 什么是VuePress VuePress由两部分组成:一个基于Vue的轻量级静态网站生成器,以及为编写技术文档而优化的默认主题。 它是为了满足Vue自己的子项目文档的需求而创建的。 VuePress为每一个由它生成的页面提供预加载的