umi -- 插件

news/2024/12/2 19:55:04/

umi插件

plugin-access

启用方式: 有src/access.ts时启用
des:约定了 src/access.ts 为我们的权限定义文件,该文件需要默认导出一个方法,导出的方法会在项目初始化时被执行。该方法需要返回一个对象,对象的每一个值就对应定义了一条权限。

// src/access.ts
export default function(initialState){// initialState是通过初始化状态插件@umijs/plugin-initial-state 提供的数据,你可以使用该数据来初始化你的用户权限const { userId, role } = initialState// 每个key对应一个布尔值,表示权限return {canReadFoo: true,canUpdateFoo: role === 'admin',canDeleteFoo: foo => {return foo.ownerId === userId;},}
}
  • 路由权限配置
    配合 Layout 插件可以很简单的实现针对某些页面的权限控制。如下所示,只有拥有了 canReadPageA (在 src/access.ts 中定义)权限,用户才可以访问该页面。否则会默认渲染 Layout 插件内置的权限错误页面。
    // config/route.ts
    export const routes =  [{path: '/pageA',component: 'PageA',access: 'canReadPageA', // 权限定义返回值的某个 key}
    ]
    
  • Hooks --> useAccess
import React from 'react';
import { useAccess } from 'umi';
const PageA = props => {const { foo } = props;const access = useAccess();if (access.canReadFoo) {// 如果可以读取 Foo,则...}return <>TODO</>;
};
export default PageA;
  • 组件 -->
    des: 组件拥有 accessible 和 fallback 两个属性,当 accessible 为 true 时会渲染子组件,当 accessible 为 false 会渲染 fallback 属性对应的 ReactNode。
import React from 'react';
import { useAccess, Access } from 'umi';
const PageA = props => {const { foo } = props;const access = useAccess(); return (<div><Accessaccessible={access.canReadFoo}fallback={<div>Can not read foo content.</div>}>Foo content.</Access><Accessaccessible={access.canUpdateFoo}fallback={<div>Can not update foo.</div>}>Update foo.</Access><Accessaccessible={access.canDeleteFoo(foo)}fallback={<div>Can not delete foo.</div>}>Delete foo.</Access></div>);
};

plugin-dva

  • 约定式的model组织方式
    规则:
    src/models 下的文件
    src/pages 下,子目录中 models 目录下的文件
    src/pages 下,所有 model.ts 文件

    + src+ models/a.ts+ pages+ foo/models/b.ts+ bar/model.ts
    
  • dva model校验
    默认,匹配找到的文件,会做一次校验,校验通过后,才会被添加到最终到 dva model 列表。(model 内如果没有声明 namespace,会以文件名作为 namespace)

  • 配置plugin-dva

export default {// 下值均为默认值dva:{immer:false, // (方便修改 reducer)。hmr: false, // (热模块更新)skipModelValidate:false, // (是否跳过 model 验证。)extraModels: [] // (配置额外到dva model)}
}
  • dva运行时配置(通过src/app.tsx文件配置dva创建时的参数)
import { createLogger } from 'redux-logger';
import { message } from 'antd';
export const dva = {config: {onAction: createLogger(),onError(e: Error) {message.error(e.message, 3);},},
};
  • umi接口
    des:常用方法可从 umi 直接 import。
import { connect } from 'umi';
  • connect – 绑定数据到组件。
  • getDvaApp – 获取 dva 实例
  • useDispatch – hooks 的方式获取 dispatch
  • useSelector – hooks 的方式获取部分数据
  • useStore – hooks 的方式获取 store
  • 查看项目中包含了哪些 model
    $ umi dva list model (没有安装umi的使用 npx umi dva list model)

  • 类型
    通过 umi 导出类型:ConnectRC,ConnectProps,Dispatch,Action,Reducer,ImmerReducer,Effect,Subscription,和所有 model 文件中导出的类型

plugin-initial-state

des: 约定一个地方生产和消费初始化数据。
启用:有 src/app.ts 并且导出 getInitialState 方法时启用(该插件不可直接使用,必须搭配 @umijs/plugin-model 一起使用)
配置:

// src/app.ts
export async function getInitialState() {const data = await fetchXXX();return data;
}//该配置是一个 async 的 function。会在整个应用最开始执行,返回值会作为全局共享的数据。Layout 插件、Access 插件以及用户都可以通过 useModel('@@initialState') 直接获取到这份数据
  • API
  1. useModel
import { useModel } from 'umi';
export default () => {// refresh : 重新执行 getInitialState 方法,并获取新数据// setInitialState : 手动设置 initialState 的值,手动设置完毕会将 loading 置为 falseconst { initialState, loading, error, refresh, setInitialState } = useModel('@@initialState');return <>{initialState}</>
};

plugin-model

启用:src/models 目录下有 hooks model 时启用。(与dva的差别为dva导出的是对象,hooks model导出函数,所谓 hooks model 文件,就是自定义 hooks 模块)
des: 文件名则对应最终 model 的 name,通过插件提供的 API 来消费 model 中的数据。

// 定义hooks model
import { useState, useCallback } from 'react'
export default function useAuthModel() {const [user, setUser] = useState(null)const signin = useCallback((account, password) => {// signin implementation// setUser(user from signin API)}, [])const signout = useCallback(() => {// signout implementation// setUser(null)}, [])return {user,signin,signout}
}
import { useModel } from 'umi';
export default () => {const { user, fetchUser } = useModel('useAuthModel', model => ({ user: model.user, signout: model.signout,signin: model.signin }));return <>hello</>
};
// useModel的两个参数:
// namespace - 就是 hooks model 文件的文件名,如上面例子里的 useAuthModel
// updater - 可选参数。在 hooks model 返回多个状态,但使用组件仅引用了其中部分状态,并且希望仅在这几个状态更新时 rerender 时使用(性能相关)

http://www.ppmy.cn/news/262132.html

相关文章

Moamen and XOR

C. Moamen and XOR 莫阿门和伊扎特在玩游戏。他们创建了一个由n个非负整数组成的数组a其中每个元素都小于2k。 当a1&a2&a3&…&an≥a1⊕a2⊕a3⊕…其中&为按位与运算&#xff0c;⊕为按位异或运算。 请计算出Moamen数组a的中奖数量。 由于结果可能非常大&am…

umi.js

umi使用步骤 相关配置 在.umirc.ts文件中配置hash为true时&#xff0c;打包完dist目录下的js和css文件会生成随机hash值 配置base则会改变首页文件的访问路径,配置的时候还要一起配置一个publicPath&#xff0c;一般和base相同&#xff0c;添加这个的目的就是在dist生成的ind…

CubeMX的简介

在Cube工具还没出来之前&#xff0c;在ST的MCU开发都是用标准固件库&#xff0c;标准库自推出以来受到ST的使用者的推崇&#xff0c;现在很多公司也都在使用。但是ST官方在2013年后就没有更新版本&#xff0c;ST官方也全力推HAL&#xff08;Hardware Abstraction Layer&#xf…

Ymodem

目录 一、数据帧格式 1.1 起始帧 1.2 数据帧 1.3 结束帧 二、文件传输流程 2.1 传输符号表 三、CRC校验源码 一、数据帧格式 1.1 起始帧 格式1&#xff08;128byte&#xff09;&#xff1a;SOH 00 FF filename[ ] filezise[ ] NUL[ ] CRCH CRCL 格式2&#xff08;1k …

memmove

memmove void *memmove(void *dst, const void *src, size_t len);从src中复制len个字符到dst中&#xff0c;能保证复制的数据的准确性&#xff0c;不会影响dst中超出len的部分 #include <stdio.h> #include <ctype.h> #include <memory.h> #include <s…

tmux。。

Ctrlb 激活控制台&#xff1b;此时以下按键生效 面板操作 ”将当前面板平分为上下两块%将当前面板平分为左右两块x关闭当前面板!将当前面板置于新窗口&#xff1b;即新建一个窗口&#xff0c;其中仅包含当前面板Ctrl方向键以1个单元格为单位移动边缘以调整当前面板大小Alt方向…

UMI简介

关于UMI的一些东西&#xff0c;概念&#xff0c;位置&#xff0c;如何处理 UMI是什么 UMI全称&#xff1a;Unique Molecular Identifiers。 又称分子条形码技术&#xff0c;是对原始样本基因组打断后的每一个片段都加上一段特有的标签序列&#xff0c;用于区分同一样本中成千上…

cimoc 最新版_Cimoc官方版

Cimoc怎么更新&#xff1f;Cimoc官方最新版是一款非常不错的漫画阅读软件&#xff0c;Cimoc官方版里具有海量的优质小说资源&#xff0c;用户可一键搜索查询自己喜爱的漫画阅读&#xff0c;同时支持离线下载阅读&#xff0c;线上阅读等功能&#xff0c;让你随时免费阅读漫画&am…