TeleState 个性

1、hooks api的状态共享。

2、可在组件外,通过dispatch更改state.

3、无需provider,不必思考组件是否在provider作用域下。

4、体积仅4k.

5、typescript friendly.

毛病

暂不反对class组件,需本人应用函数式组件进行高阶来进行反对。

无奈部分状态共享。如menu组件menu-item共享menu的状态,因为多个menu实例的状态并不相同,则只能应用context+provider计划.

实现原理

通过 setState queue 来散发状态。

装置

npm i tele-state

第一步,创立一个状态联动的 hooks "useTeleState"

src/moduleA/store.ts

import React, { useEffect } from 'react'import { createTeleState } from 'tele-state'const { useTeleState } = createTeleState(1)export {    useTeleState}

step2 - 在组件中应用该hooks,api与useState相似

src/moduleA/componentTest.tsx

import {useTeleState} from './store'  function ComponentA(){    const [ count ] = useTeleState()    console.log('B----------', count)    return <>{count}</>  }  function ComponentB(){    const [ count, setCount ] = useTeleState()    console.log('A----------', count)    useEffect( () =>{      setCount(count+1) // ComponentA will update too.    }, [] )    return <button onClick={() => setCount(count+1)}>add {count}</button>  }

组件外读取/更改状态

src/store.ts

  const {       useTeleState,       dispatch, // 在组件外更改状态,状态同步更新,组件异步渲染.      getState,  // 在组件外获取以后状态  } = createTeleState(1)  export const addCount = () => {      // 在组件外更改状态,状态同步更新,组件异步渲染.      dispatch( preCount => preCount+1 )      // 在组件外获取以后状态.      const count = getState()      fetch(`/api/bean?count=${count}`)  }    export {      useTeleState  }

理论我的项目中,创立多个teleState,每个teleState在各自业务/功能模块下申明状态。后续在我的项目拆分时,也很容易

与当初支流计划的比照

hooks + context

基本原理是将state与dispatch都保留在context的Provider中,利用useContext api 获取provider中的state与dispatch. 在此基础上的封装则有easy-peasy等。

    // 创立context    const countContex = createContext({count: 1, setCount: (count: number) => {}})        // 将dispatch 与 state放入provider    const StoreProvider = ({children}: {children:ReactElement}) => {      const [count, setCount] = useState(1)      return <countContex.Provider value={{count, setCount }}>          {children}      </countContex.Provider>    }        // 应用useContext    const ComponentA = () => {      const { count, setCount} = useContext(countContex)      // ....    }

该计划绝对与teleState 毛病:

1、在组件外获取/更新状态不是很不便。

2、在应用状态时,须要思考Provider的作用域问题.

mobx

当初mobx 的api设计是面向对象的,大量应用装璜器模式。当初hooks使得拥抱函数式组件。显得略显难堪。在此也不做过多评估

redux

长处:redux标准了数据流。
毛病:对状态治理进行集中管理,不利于懒加载。