• 比React—Redux和Redux好用100倍的原子级状态管理器,是我们公司自己封装的npm包,如果感兴趣可以研究研究,会大大提高开发效率


    简介

    react-store

    一. 安装

    在package.json的dependencies中引入

    二. 配置

    2.1 在store/index.ts中引入

    2.3 在顶层通过StoreProvider注入状态

    三. 使用

    3.1 在函数组件中使用,借助useModel

    3.2 在class组件中使用,借助connectModel

    3.3 在组件外使用, 借助getModel

    简介

    大家都遭受rudex的毒打吧,基础掌握不好,会出现很多问题,然而React封装的React-Redux也没有好哪去呀!

    我们公司使用的这个是自己上传的npm包,基于react-contextreact原子化状态管理器,具有完整的ts类型推测。

    react-store

    基于react-contextreact原子化状态管理器,具有完整的ts类型推测。使用方法及其简单!

    一. 安装

    package.json的dependencies中引入

    1. {
    2.    "react-store": "https://h5-fc-code.oss-cn-hangzhou.aliyuncs.com/package/react-store/react-store-1.1.0.tgz"
    3. }

    然后执行安装依赖操作

      npm i react-store -S

    二. 配置

    2.1 在store/index.ts中引入

    1. import { useState } from 'react'
    2. /** 1. 引入react-store */
    3. import createStore from 'react-store'
    4. /** 2. 定义各个原子化状态 */
    5. // user
    6. const userModel = () => {
    7.  const [ userInfo, setUserInfo ] = useState<{ name: string }>({ name: 'name' })
    8.  return { userInfo, setUserInfo }
    9. }
    10. // other
    11. const otherModel = () => {
    12.  const [ other, setOther ] = useState<number>(20)
    13.  return { other, setOther }
    14. }
    15. /** 3. 组合所有状态 */
    16. const store = createStore(() => ({
    17.  user: userModel(),
    18.  other: otherModel(),
    19. }))
    20. /** 向外暴露useModel, StoreProvider, getModel, connectModel */
    21. export const { useModel, StoreProvider, getModel, connectModel } = store

    2.3 在顶层通过StoreProvider注入状态

    1. // src/main.ts
    2. import React from 'react'
    3. import ReactDOM from 'react-dom'
    4. import App from '@/App'
    5. // 1. 引入StoreProvider
    6. import { StoreProvider } from '@/store'
    7. // 2. 使用StoreProvider包裹App组件
    8. ReactDOM.render(
    9.  <StoreProvider>
    10.    <App />
    11.  </StoreProvider>,
    12.  document.getElementById('root')
    13. )

    三. 使用

    3.1 在函数组件中使用,借助useModel

    1. import React from 'react'
    2. import { useModel } from '@/store'
    3. function FunctionDemo() {
    4.  /** 通过useModel取出user状态 */
    5.  const { userInfo, setUserInfo } = useModel('user')
    6.  /** 在点击事件中调用setUserInfo改变状态 */
    7.  const onChangeUser = () => {
    8.    setUserInfo({
    9.      name: userInfo.name + '1',
    10.   })
    11. }
    12.  // 展示userInfo.name
    13.  return (
    14.    <button onClick={onChangeUser}>{userInfo.name}--改变user中的状态</button>
    15. )
    16. }
    17. export default FunctionDemo

    3.2 在class组件中使用,借助connectModel

    1. import React, { Component } from 'react'
    2. import { connectModel } from '@/store'
    3. // 定义class组件props
    4. interface IClassDemoProps {
    5.  setOther: React.Dispatch<React.SetStateAction<string>>
    6.  other: number
    7.  num: number
    8. }
    9. class ClassDemo extends Component<IClassDemoProps> {
    10.  // 通过this.props获取到方法修改状态
    11.  onChange = () => {
    12.    this.props.setOther(this.props.other + 1)
    13. }
    14.  render() {
    15.    console.log(this.props.num)
    16.    // 通过this.props获取到状态进行展示
    17.    return <button onClick={this.onChange}>{this.props.other}</button>
    18. }
    19. }
    20. // 通过高阶组件connectModel把other状态中的属性和方法注入到类组件中
    21. export default connectModel('other',state => ({
    22.  other: state.other,
    23.  setOther: state.setOther
    24. }))(ClassDemo)

    3.3 在组件外使用, 借助getModel

    1. import { getModel } from '@/store'
    2. export const onChangeUser = () => {
    3. // 通过getModel读取user状态,进行操作
    4.  const user = getModel('user')
    5.  user.setUserInfo({
    6.    name: user.userInfo.name + '1'
    7. })
    8. }
    9. // 1秒后执行onChangeUser方法
    10. setTimeout(onChangeUser, 1000)

    大家可以测试下真的很好用,一个子爽!

  • 相关阅读:
    【无标题】Web-Tomcat
    unity gb28181 rtsp 视频孪生图像拉流和矫正插件(一)
    JS的this关键字详解
    熔断原理分析与源码解读
    驱动开发:内核实现进程汇编与反汇编
    iview form 动态表单
    Hadoop的HDFS的集群安装部署
    Appium —— 初识移动APP自动化测试框架Appium
    有一说一,外包公司到底值不值得去?
    scipy 窗函数进行设计FIR滤波器
  • 原文地址:https://blog.csdn.net/m0_60622481/article/details/128037614