## 前言
一般来说,Ant Design提供的都是基础组件,而在我们进行业务开发的时候,会经常有多个组件组合在一起并且会被高频调用的情况,所以这时候就用到自定义组件,那么下面我们来看下如果制作一个最简单的自定义组件。
## 自定义组件制作
1. 一般自定义组件都放在components文件夹中,找到后打开目录,新建一个Demo文件夹和一个ButtonX的js文件
![](https://box.kancloud.cn/845ad5efeca544730fba2c805d1a0658_642x1808.png)
2. 我们加上最简单逻辑的代码,封装一个组件`ButtonX`,使之加载后自带点击事件
![](https://box.kancloud.cn/9cc447bef025232501111e141c7e576d_1410x730.png)
3. 我们再到一开始的Demo页面引入这个自定义组件,查看是否生效
![](https://box.kancloud.cn/490b2ef3766083aaac5adb6afca442b6_1036x688.png)
4. 打开页面发现按钮已经出现
![](https://box.kancloud.cn/98addd0461af26060f22614bee5ac2da_996x632.png)
5. 点击按钮,对应的console也出现了信息。
![](https://box.kancloud.cn/b02b828b86448924678d1ab9e30b0600_1050x1110.png)
6. 这样一来我们的第一个自定义组件就做好了。是不是很简单?但是如果自定义组件只能写成固定的加载,那么这个组件将毫无意义,所以下面我们来学习一些常用的拓展用法
<br>
## 自定义组件拓展
### 外层参数传递
1. 想要传递按钮显示文字,Demo模块代码做如下修改:
* 将代码由
~~~
<ButtonX />
~~~
更改为
~~~
<ButtonX>自定义按钮</ButtonX>
~~~
2. 同时自定义组件做如下修改:
* 将原先的
~~~
render() {
return (
<div>
<Button type="primary" onClick={this.handleSubmit}>
按钮点击
</Button>
</div>
);
}
~~~
* 改为
~~~
render() {
const { children } = this.props;
return (
<div>
<Button type="primary" onClick={this.handleSubmit}>
{children}
</Button>
</div>
);
}
~~~
* 其中的`children`则代表包含在组件标签内的值,而传递给组件的参数都在`this.props`中获取
3. 打开系统 查看效果,发现的确如我们传入的字符一致
![](https://box.kancloud.cn/36720309f1d2507b1ff31775f114ecf0_794x536.png)
<br>
### 方法传递参数
1. 现在我们需要点击按钮后打印出的值是Demo模块传递过去的值
2. 修改代码
* 将原先的
~~~
<ButtonX>自定义按钮</ButtonX>
~~~
* 改为
~~~
<ButtonX print='测试打印内容'>自定义按钮</ButtonX>
~~~
3. 自定义组件做如下修改:
* 将原先的
~~~
handleSubmit = () => {
console.log('按钮点击了');
};
render() {
const { children } = this.props;
return (
<div>
<Button type="primary" onClick={this.handleSubmit}>
{children}
</Button>
</div>
);
}
~~~
* 改为
~~~
handleSubmit = print => {
console.log(print);
};
render() {
const { children, print } = this.props;
return (
<div>
<Button type="primary" onClick={this.handleSubmit(print)}>
{children}
</Button>
</div>
);
}
~~~
4. 打开系统点击按钮测试,发现点击并没有效果
![](https://box.kancloud.cn/d98357a02d6a68e5362caffaf85c6878_1130x938.png)
5. 因为`print`是从`this.props`中获取的,再通过`this.handleSubmit(print)`传入,`this`指针会指向错误,所以需要处理一下
6. 将代码改为如下:
~~~
handleSubmit = print => {
console.log(print);
};
render() {
const { children, print } = this.props;
return (
<div>
<Button
type="primary"
onClick={() => {
this.handleSubmit(print);
}}
>
{children}
</Button>
</div>
);
}
~~~
7. 再次打开系统,发现参数传递成功
![](https://box.kancloud.cn/4096d13945d3882ab326bef499d9221c_996x936.png)
8. 最后附上两者截图以供参考
![](https://box.kancloud.cn/4d68353e27f9b27fb339aab810351b9d_1096x650.png)
![](https://box.kancloud.cn/6549f93b77f5b6279f07d28696718ea0_988x926.png)
<br>
## 结尾语
看到这,相信大家已经知道如何自定义一个最简单而又功能兼备的组件,掌握其中主要知识点,再在这基础上自行拓展,相信大家都可以写出很棒都定制型组件!