umi状态管理

umi 框架中的状态,主要分为两种,umi 自带的数据流和 dvajs

数据流插件

umi 框架中默认支持数据流插件,数据流可以认为是一个轻量级的状态管理,通过 hooks 管理一个全局状态,通过 callback 进行状态更新。

定义model

在 umi 项目 models 文件下添加 model 文件并定义对应的字段和更新数据的方法:

// src/models/counterModel.ts
import { useState, useCallback } from 'react';

export default function Page() {
  const [counter, setCounter] = useState(0);

  const increment = useCallback(() => setCounter((c) => c + 1), []);
  const decrement = useCallback(() => setCounter((c) => c - 1), []);

  return { counter, increment, decrement };
};

页面中使用状态,通过 useModel(‘counterModel’) 引入,直接试用即可。

import { useModel } from '@umijs/max';
import { Button } from 'antd';
import { ReactDOM } from "react"
export default function Counter(){
    const {counter, increment, decrement} = useModel('counterModel')
    return (
        <>
            <div className="text-4xl">{counter}</div>
            <div className='flex '>
            <Button className='mr-4' onClick={increment}>增加</Button>
            <Button onClick={decrement}>减少</Button>
            </div>
            <h3 className=' text-3xl'>dva</h3>

        </>
    )
}

Dva

使用 dvajs 状态管理框架,dvajs 这个框架已经好几年没有更新了,应该没有人维护了,dvajs 底层是 redux,可以换成 redux,redux 还是很活跃的。使用前要开启 dva,.umirc.ts 中添加配置项 dva: { }。

创建model

在 umi models 目录下,这里我用了官网的例子

export default {
    namespace: 'todos',
    state: [],
    reducers: {
      add(state, { payload: todo }) {
        return state.concat(todo);
      },
      remove(state, { payload: id }) {
        return state.filter(todo => todo.id !== id);
      },
      update(state, { payload: updatedTodo }) {
        return state.map(todo => {
          if (todo.id === updatedTodo.id) {
            return { ...todo, ...updatedTodo };
          } else {
            return todo;
          }
        });
      },
    },
  };
和页面进行连接

在页面中使用 state,首先需要将状态与页面进行关联。

import { connect } from '@umijs/max';
import { Button } from 'antd';
import { ReactDOM } from "react"
const DvaCounter = ({ dispatch, todos}) => {
    
    return (
        <>
            <div className="text-4xl">{todos}</div>
            <div className='flex '>
            <Button className='mr-4' onClick={()=>dispatch({type: "todos/add", payload:"abc"})}>增加</Button>
            <Button onClick={()=>dispatch({type: "todos/add", payload:"abc"})}>减少</Button>
            </div>
            <h3 className=' text-3xl'>dva</h3>

        </>
    )
}

export default connect(({ todos }) => ({
    todos,
  }))(DvaCounter)

状态使用比较简单,复杂的项目还是建议用 redux 来管理状态。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值