Skip to content

AntdUI组件库

随着商业化的趋势,企业级产品中需求多且功能复杂,而且变动和并发频繁,常常需要设计者与开发者能快速做出响应。同时这类产品中有存在很多类似的页面以及组件,可以通过抽象得到一些稳定且高复用性的内容。
常见的 U|组件库:Ant Design,Material Ul等

1. 安装AntdUI组件库

Ant Design v4版本的维护期已于2023年年底正式结束, 我们可以不指定版本直接安装最新V5版本。除了安装antd之外,往往还需要使用阿里开发的图标库,配合使用:

cmd
npm i antd 
npm i @ant-design/icons

antd默认支持基于ES modules的tree shaking,也就是说antd默认支持按需加载。不像Vue中需要配置按需加载。

jsx
import { Button } from 'antd'
import { PlusCircleFilled } from '@ant-design/icons'

function App() {

  return (
    <div>
      hello App
      <Button type='primary' icon={<PlusCircleFilled/>}>按钮</Button>
    </div>
  )
}

export default App

运行效果:
Alt text

2. 使用Message组件

Message有两种使用方式:

  1. 使用messageApi
  2. 直接使用message

2.1 使用messageApi

官网示例提供的写法就是messageApi:

jsx
// message不是组件,提供了静态方法
import { Button, message } from 'antd'
import { PlusCircleFilled } from '@ant-design/icons'

function App() {
  // messageApi用于输出内容, contextHolder用于指定挂靠DOM的位置
  const [messageApi, contextHolder] = message.useMessage();
  const handleClick = () => {
    messageApi.info("Hello, Ant Design!")
  }
  return (
    <div>
      hello App
      {contextHolder}
      <Button type='primary' icon={<PlusCircleFilled/>} onClick={handleClick}>弹出消息</Button>
    </div>
  )
}
export default App

运行效果:
Alt text

2.2 直接使用message

还有一种更简洁的写法,不使用message的钩子函数:

jsx
// message不是组件,提供了静态方法
import { Button, message } from 'antd'
import { PlusCircleFilled } from '@ant-design/icons'

function App() {
  const handleClick = () => {
    message.info("Hello, Ant Design!")
  }
  return (
    <div>
      hello App
      <Button type='primary' icon={<PlusCircleFilled/>} onClick={handleClick}>弹出消息</Button>
    </div>
  )
}

export default App

运行效果:
Alt text 为何提供了简单的写法,还要提供使用messageApi复杂写法呢。原因在于跨组件通信的时候,有可能在弹消息拿不到消息:

jsx
import { createContext, useContext } from 'react'
import { Button, message } from 'antd'
import { PlusCircleFilled } from '@ant-design/icons'

function Title() {
  const msg = useContext(Context)
  console.log('msg', msg)
  return (
    <h3>{msg}</h3>
  )
}
const Context = createContext('')

function Head() {
  const handleClick = () => {
    message.info(<Title />)
    // messageApi.info(<Title />)
  }
  return (
    <>
      hello App
      <Button type="primary" icon={<PlusCircleFilled />} onClick={handleClick}>弹出消息</Button>
    </>
  )
}

function App() {
  return (
    <Context.Provider value="hello">
      <Head/>
    </Context.Provider>
  )
}

export default App

运行效果:
Alt text 可以看到弹窗拿不到Title组件的内容,这时候就需要messageApi来实现:

jsx
import { createContext, useContext } from 'react'
import { Button, message } from 'antd'
import { PlusCircleFilled } from '@ant-design/icons'

function Title() {
  const msg = useContext(Context)
  console.log('msg', msg)
  return (
    <h3>{msg}</h3>
  )
}
const Context = createContext('')

function Head() {
  const [messageApi, contextHolder] = message.useMessage()
  const handleClick = () => {
    messageApi.info(<Title />)
  }
  return (
    <>
      {contextHolder}
      hello App
      <Button type="primary" icon={<PlusCircleFilled />} onClick={handleClick}>弹出消息</Button>
    </>
  )
}

function App() {
  return (
    <Context.Provider value="hello">
      <Head/>
    </Context.Provider>
  )
}
export default App

Alt text

3. 使用App包裹组件

好在Antd提供最终解决办法,可以简便而没有问题的使用message组件-App包裹组件,提供message.xxx、Modal.xxx、notification.xxx的静态方法,可以简化useMessage等方法需要手动植入contextHolder的问题。

jsx
import { createContext, useContext } from 'react'
// 避免重名,App名称改为AppComponent
import { Button, App as AppComponent} from 'antd'
import { PlusCircleFilled } from '@ant-design/icons'

function Title() {
  const msg = useContext(Context)
  console.log('msg', msg)
  return (
    <h3>{msg}</h3>
  )
}

const Context = createContext('')

function Head() {
  const {message} = AppComponent.useApp()
  const handleClick = () => {
    message.info(<Title />)
  }
  return (
    <>
      hello App
      <Button type="primary" icon={<PlusCircleFilled />} onClick={handleClick}>弹出消息</Button>
    </>
  )
}

function App() {

  return (
    <Context.Provider value="hello">
      {/*使用AppComponent组件包裹一下,由Antd提供message能力*/}
      <AppComponent>
        <Head/>
      </AppComponent>
    </Context.Provider>
  )
}
export default App

运行效果:
Alt text