组件复用
antd 组件复用示例
如图所示,在内容管理路由组件和发布文章组件都有Select选择器
将该功能单独封装成组件,复用的组件应当完善和健壮。
这个组件是From表单的受控组件。
antd的自定义表单控件的说明From
说明:
自定义或第三方的表单控件,也可以与 Form 组件一起使用。只要该组件遵循以下的约定:
1.提供受控属性 value 或其它与 valuePropName 的值同名的属性
2.提供 onChange 事件或 trigger 的值同名的事件。
From表单
1 2 3 4 5 6 7 8 9 10 11 12
| import { Channels } from '@/components/Channels' export default function Article() { ... return( <Form> <Form.Item label="频道:" name="channel_id"> <Channels/> </Form.Item> </Form> ) }
|
复用的组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import { Select } from 'antd' import { useEffect } from 'react' import { useDispatch, useSelector } from 'react-redux' import { getChannels } from '@/store/actions'
export const Channels = ({ ...rest }) => { console.log(rest) const dispatch = useDispatch() const { channels } = useSelector((value) => value.article) useEffect(() => { dispatch(getChannels()) }, [dispatch]) return ( <Select placeholder="请选择文章频道" > {channels.map((items) => ( <Select.Option key={items.id} value={items.id}> {items.name} </Select.Option> ))} </Select> ) }
export const Channels = ({ value,onChange,width }) => { const dispatch = useDispatch() const { channels } = useSelector((value) => value.article) useEffect(() => { dispatch(getChannels()) }, [dispatch]) return ( <Select style={ { width, } } placeholder="请选择文章频道" value={value} // 指定当前选中的条目 onChange={onChange} //选中 option,或 input 的 value 变化时,调用此函数 > {channels.map((items) => ( <Select.Option key={items.id} value={items.id}> {items.name} </Select.Option> ))} </Select> ) }
|
最后在两个路由组件引入组件就行了
1 2 3 4 5 6 7 8 9 10 11
| import { Channels } from '@/components/Channels' export default function Article() { ... return( <Form> <Form.Item label="频道:" name="channel_id"> <Channels width={xxx}/> </Form.Item> </Form> ) }
|