antd pro 的使用总结(2)

1d.ts 

declare 关键字 主要用来生命全局变量。

更多关于declare 的知识:官方文档

注意:nameSpace 的一些知识

declare namespace

namespace 是 ts 早期时为了解决模块化而创造的关键字,中文称为命名空间。

由于历史遗留原因,在早期还没有 ES6 的时候,ts 提供了一种模块化方案,使用 module 关键字表示内部模块。但由于后来 ES6 也使用了 module 关键字,ts 为了兼容 ES6,使用 namespace 替代了自己的 module,更名为命名空间。

随着 ES6 的广泛应用,现在已经不建议再使用 ts 中的 namespace,而推荐使用 ES6 的模块化方案了,故我们不再需要学习 namespace 的使用了。

namespace 被淘汰了,但是在声明文件中,declare namespace 还是比较常用的,它用来表示全局变量是一个对象,包含很多子属性。

2 setState 异步性质

setState之后,组件不会立即执行更新state,而是将setState的改变的效果进入队列,并在某个特定的时间节点合并,一起刷新state。

具体可见 setSatte 为什么是异步

因此,对于有的时候需要在一个setState之后进行想立即获取最新的state是不可能的,为了解决这个问题,可以使用 setState 的第二个参数, 

setState(partialState[,callBack]);

这里的 callBack 是 state 导致的页面重新渲染的回调,相当于 componentDidUpdate.

3 antd-pro 的跨域问题解决

借助代理服务器

配置:在 config.ts 文件下

proxy: {
    '/test': { // 代表以“/test” 开头的所有请求,都会经过这个代理服务器
      target: 'http://192.168.88.140:32300', //url 的前缀,也就是目标服务器
      changeOrigin: true, //是否允许一个域名对应对个地址
      pathRewrite: {
        '': '',  //url中的一些预处理,如 "^test":"" 会将所有以test开头的字符串置空
      },
    },
  },

4 接口继承

  • 类与类之间只能进行单继承,想要实现多继承需要使用 Mixins 的方式

  • 接口继承类也只能进行单继承,想要实现多继承需要使用 Mixins 的方式 Mixins 方式模拟多继承的缺陷:

    • 只能在继承一级父类的方法和属性

    • 如果父类中含有同一种方法或属性,会根据赋值的顺序,先赋值的会被覆盖掉

  • 接口与接口之间可以直接进行多继承

  • 类实现接口可以进行多实现,每个接口用 , 隔开即可


作者:暖生
链接:https://juejin.im/post/5c386a156fb9a049fb43e109
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一个接口可以继承多个接口,从而创建出多个接口合成的接口。

 

5 createLogger 的引入

src 目录下新建 app.js 文件,写入下面内容:


import { createLogger } from 'redux-logger';

export const dva = {
    config: {
        onError(err) {
            err.preventDefault();
        },
        onAction: createLogger(),
    },
};

暂时不知道为什么这样用,github 上issue 也没有解决

6 数组的 reduce 方法

array.reduce 是一个数组元素迭代方法,例子:

var arr = [1,2,3,4,5,6,7,8,9,10];
arr.reduce(function(total, currentVal, currentIndex, array){
    console.log("total",total);
    console.log("currentVal", currentVal);
    console.log("currentIndex", currentIndex);
    console.log("array", array);
    return total-currentVal;
},100);

结果:

暂时没有发现在哪里可以应用,可能会在某些算法笔试题中用到吧

7 antd 的格栅布局

将整个横向区域按照24等分进行划分

gutter:设置每个区域间隔

col:设置每列所占的格栅数

具体可以参照:官网

8 覆盖组件的样式

由于引入的 antd 组件类名没有被 css modules 转化,所以被覆盖的类名必须被放在 :global 中

.customSelect {
    :global {
        .ant-select-selection{
            /**样式override style*/
        }
    }
}
//对应jsx文件
import styles  from "./style.less";
<div className={styles.customSelect}>
    <div className="ant-select-selection"></div>
</div>

这里在global 外边在套一层 className 为了包裹 ant-select-selection 类名,防止对其他类名造成影响。

另外一种方法:

外部如何覆盖局部样式

当生成混淆的 class 名后,可以解决命名冲突,但因为无法预知最终 class 名,不能通过一般选择器覆盖。我们现在项目中的实践是可以给组件关键节点加上 data-role 属性,然后通过属性选择器来覆盖样式。

// dialog.js
  return <div className={styles.root} data-role='dialog-root'>
      <a className={styles.disabledConfirm} data-role='dialog-confirm-btn'>Confirm</a>
      ...
  </div>
// dialog.css
[data-role="dialog-root"] {
  // override style
}

因为 CSS Modules 只会转变类选择器,所以这里的属性选择器不需要添加 :global。

 

 

 

### 回答1: 要设置动态菜单,你需要在 Ant Design Pro使用路由配置来定义你的菜单。在路由配置中,你可以为每个页面定义一个菜单项,并且可以根据需要设置它们的子菜单。 以下是一个简单的例子,展示如何使用路由配置来设置动态菜单: ```javascript // src/config/router.config.js export default [ { path: '/dashboard', name: 'Dashboard', icon: 'dashboard', component: './Dashboard', }, { path: '/users', name: 'Users', icon: 'user', component: './Users', }, { path: '/settings', name: 'Settings', icon: 'setting', routes: [ { path: '/settings/profile', name: 'Profile', component: './Profile', }, { path: '/settings/account', name: 'Account', component: './Account', }, ], }, ]; ``` 在上面的配置中,我们定义了三个顶级菜单项:Dashboard、Users 和 Settings。Settings 菜单项有两个子菜单项:Profile 和 Account。 然后,我们需要将这些路由配置传递给 ProLayout 组件,该组件将渲染菜单和其他布局元素: ```javascript // src/layouts/BasicLayout.js import ProLayout from '@ant-design/pro-layout'; import routerConfig from '../config/router.config'; export default function BasicLayout(props) { return ( <ProLayout route={routerConfig} location={props.location} {...props} > {props.children} </ProLayout> ); } ``` 在上面的代码中,我们将路由配置传递给 ProLayout 组件,并将其设置为 `route` 属性的值。这将告诉 ProLayout 组件如何渲染你的菜单。 现在,你可以在你的页面组件中访问 `menuData` 属性,该属性包含有关当前菜单的信息。例如,你可以使用 `menuData` 属性来确定哪个菜单项当前处于活动状态: ```javascript // src/pages/Dashboard.js import { useLocation } from 'umi'; export default function Dashboard() { const location = useLocation(); const activeMenu = location.pathname; return ( <div> <h1>Dashboard</h1> <p>Active menu: {activeMenu}</p> </div> ); } ``` 在上面的例子中,我们使用 `useLocation` 钩子来获取当前页面的位置,并使用它来确定哪个菜单项当前处于活动状态。 ### 回答2: antdpro是一款基于Ant Design的React前端开发框架,可以用来快速搭建UI界面和管理系统。设置动态菜单是指根据用户权限或其他条件,在页面加载时动态生成菜单项。 首先,我们需要从后端获取用户的权限信息或菜单数据。可以通过接口请求获取数据或在登录时将数据存储在本地。 接下来,在Ant Design Pro框架中,可以在config目录下的menu.js文件中配置菜单。这个文件可以定义路由、菜单项等信息。在这个文件中,可以使用JavaScript的语法来动态生成菜单项。 例如,可以使用.map()方法遍历权限数据或菜单数据,并根据数据生成菜单项。根据数据的结构,可以设置菜单项的标题、路径、图标等属性。可以根据数据中是否有子菜单的字段,来判断是否需要生成子菜单项。 在菜单项的路径配置中,可以使用动态路由的方式,将菜单项和具体的页面组件相对应。这样,当用户点击菜单项时,就可以跳转到对应的页面。 然后,在布局组件(通常是BasicLayout)中,可以根据菜单的配置信息,使用Ant Design Pro提供的Menu组件来渲染菜单。可以根据路由信息,自动高亮显示当前页面对应的菜单项。 最后,在菜单配置完成后,就可以启动项目,访问页面,就能看到动态生成的菜单了。根据用户的权限或其他条件,在页面加载时,会根据菜单配置自动显示对应的菜单项。 总结起来,通过配置菜单数据,使用Ant Design Pro提供的组件来渲染菜单,再根据用户权限或其他条件动态生成菜单项,就可以实现antdpro设置动态菜单的功能。 ### 回答3: 在antdpro中设置动态菜单需要以下步骤: 1. 定义菜单数据:首先,我们需要定义菜单的数据结构。菜单可以使用树形结构,每个节点包含菜单项的信息,比如菜单名称、图标、路由等。 2. 获取菜单数据:接下来,我们需要从后端获取菜单数据。可以使用Ajax或者Fetch等方式从后端获取菜单数据。 3. 将菜单数据存储到状态中:获取到菜单数据后,我们需要将数据存储到React组件的状态中。可以使用useState或者useReducer等Hooks来管理菜单数据的状态。 4. 渲染动态菜单:在组件的渲染方法中,使用遍历函数(如map)将菜单数据映射到菜单组件中。antdpro提供了Menu和SubMenu两个组件来渲染菜单结构。可以根据菜单数据的层级关系来嵌套使用这两个组件。 5. 添加路由和点击事件:对于菜单中的每个菜单项,我们通常需要添加路由和点击事件。可以使用React Router来定义路由,同时在点击事件中也可以使用history.push()来实现路由跳转。 6. 权限管理:动态菜单通常还需要与用户的权限管理相结合。可以根据用户的角色或权限设置不同的菜单项显示或隐藏。可以在渲染菜单时,通过条件判断来控制菜单项的显示与隐藏。 以上就是在antdpro中设置动态菜单的大致步骤。通过定义菜单数据、获取菜单数据、存储菜单数据、渲染动态菜单以及添加路由和点击事件等步骤,我们可以实现一个灵活、可扩展的动态菜单功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值