![c3d1bb15783cf0b0e1eab7953d3cd918.png](https://i-blog.csdnimg.cn/blog_migrate/08aaba9028c2ad667f35024828d451e1.jpeg)
开发一个React
开关切换组件
这是一篇译文: 原文地址:Build a React Switch Toggle Component 本文源代码: https:// github.com/wangkaiwd/re act-hooks-TS-practice
![98f1d3fe1aab3106732d8261ce29c074.png](https://i-blog.csdnimg.cn/blog_migrate/b4a8ac30098ba79c45ce534267381b49.jpeg)
学习如何使用原生HTML
的复选框来开发一个React
开关组件,在这个过程你将会学到许多React
复选框相关的知识。
下面是IOS
向世界推出的UI
组件,人们把它称之为Switch
或者Toggle
。
![5f8772beb48f67674ac96403aeefcb52.gif](https://i-blog.csdnimg.cn/blog_migrate/061821e49464d75667e95c8990e2fe47.gif)
我们在开发什么
在IOS
推出Switch
之前,网页中的布尔输入只有复选框。复选框当然依旧可以在今天继续使用,但是switch
根据现实生活中真实的开关改进了复选框。
switch
给人真实的感觉。相比于点击复选框,switch
的点击效果就像你在真实的使用一个开关一样。
因此,在这篇教程中,我们将会基于原生的HTML
复选输入框来开发一个新的React
Switch
组件。此外,我们也会添加一些CSS
样式,来让简单、古老的复选框变成一个时髦漂亮的Switch
。
编写Switch
的HTML
结构
每当我创建一个新的React
组件的时候,我会先建立一个初步令人满意的HTML
和CSS
结构,然后再去编写JavaScript
代码。
创建一个Switch.js
的新文件,为它添加如下代码:
![cffd9749dd244749f11bd78841af7e52.png](https://i-blog.csdnimg.cn/blog_migrate/98911a9a7791f1c67d837ecc8417f9b5.jpeg)
你这时候如果在编辑器中完成了这段代码,由于我们使用了原生复选框来作为React Switch
组件的基础,你将会看到一个简单的复选框。
提示:
这里我们没有必要再重新发明一个轮子。毕竟,开关是展示布尔值的另一种方式,而复选框原本就是用来处理布尔值的输入框。
用CSS
来美化组件
在组件文件的同一目录下建立Switch.css
文件,加入下面的CSS
代码,大概看一下每个类的用途。我不打算在这篇教程中去探索CSS
,文章的重点是JavaScript
和React
。
![fa93b6d13f62b05b275c9f6dfac93a90.png](https://i-blog.csdnimg.cn/blog_migrate/4c00698c3f29da3d3ac3da87cf7cec1c.jpeg)
使用Switch
组件
要在React
中使用Switch
组件,我们还需要最后一步:在其它组件中import
Switch
组件并且在组件中声明:
![1787119f838889f4e6ab9caf9201fb92.png](https://i-blog.csdnimg.cn/blog_migrate/d3f2c3fe82eb2db4da8332f4da85e23a.jpeg)
保存文件后,可以看到在浏览器中我们已经将一个简单的复选框转换成了一个看上去相当漂亮的Switch
输入框:
![88cd8b0241fbf7b498b5983efaea7370.gif](https://i-blog.csdnimg.cn/blog_migrate/d1370ed0ac51be40bd344b63d6e6800e.gif)
通过props
来接收事件和属性
尽管我们的Switch
组件可能看起来很实用,但其实Switch
组件并没有正真的改变它的value
值。
这是因为我们的组件缺少了俩个重要的属性:checked
onChange
checked
属性存储了input
的当前value
值。在我们的组件中,他可能是true
或false
。
每当我们切换Switch
组件时都会触发onChange
事件,我们将会通过onChange
来改变Switch
组件的value
值。
在编写代码之前,我们需要了解一下无状态组件和有状态组件。一个无状态组件也叫做哑巴组件,它不能控制它自己的状态,因此,需要另外一个组件来记录当前组件的状态。
我们的Switch
组件将会是一个无状态组件,它需要父组件通过props
来为它传递属性。
打开Switch.js
并且进行如下修改:
![67d6a09fa75ef2d04e2c7a72124626fe.png](https://i-blog.csdnimg.cn/blog_migrate/f298b13ca569cf65cd8d707c9efdd952.jpeg)
代码相比于之前有2个新增内容:checked
: 通过父组件传入的checked
来控制是否选中 onChange
: 通过父组件传入的onChange
来更改组件的checked
属性
最后,打开父组件(我使用的是App.tsx
)并且修改组件的使用方式:
![7f9bc92981fc6732e5cee0c6dd8413c9.png](https://i-blog.csdnimg.cn/blog_migrate/c00770433116c8fcf9a93cd60c6002df.jpeg)
注意,现在父组件的状态来自于useState hooks
。这意味着这个组件将要向下把传递状态给我们的Switch
组件的checked
属性。
我们也在onChange
函数中向下传递了设置函数setChecked
。这样,在Switch
组件进行切换改变value
值的时候,他将会调用父组件传下来的onChange
函数
切换时改变背景色
如果你完成了上边的代码,会发现Switch
组件在切换状态的时候视觉UI
上并没有什么不同。
由于我们能够使用Switch
组件中通过父组件props
传递下来的checked
属性,所以我们只需要对代码做一个很简单的改动就可以改变Switch
组件的背景色。
修改Switch.tsx
组件中的label
元素,代码如下:
![1c20193d5cc4b46811e14821128db6e5.png](https://i-blog.csdnimg.cn/blog_migrate/4db525f0649f9d2e1d91582870c96bb3.jpeg)
保存组件,切换到你的浏览器页面你会看到一个完整工作的Switch
组件。当Switch
组件激活的时候会变成绿色,而当它关闭的时候会变为灰色。
到这里,我们已经拥有了一个完整功能的React
Switch
组件,它可以切换、更改value
值并且会在激活的时候变为绿色。
如果你想要知道如何能够指定激活颜色来扩展我们的Switch
组件,那么请继续往下阅读。
指定切换颜色
开发一个灵活的React
组件并且能够让它应用于多种不同的场景是一个特别好的编程实践。例如,我们可能将会在下面的情况使用Switch
组件: 在登录表单中,告诉网站要记住你的用户认证信息 在一个设置页面 * 在模态框中用来删除用户账户
这些只是3个简单的例子,网页中还有数不尽的Switch
组件的应用场景。
现在有一个问题,我们的Switch
组件在激活的时候只能显示绿色。假设我们在模态框中删除用户账户时想要让激活颜色变成红色来更好的提醒用用户该怎么办呢?
让我们为Switch
组件添加另外一个属性checkedColor
来进行控制激活额颜色:
![f2e5327ecca03cdd34e9642b02b48a27.png](https://i-blog.csdnimg.cn/blog_migrate/d41474999cd8a47156af9fbd27e89fc0.jpeg)
checkedColor
是一个16进制的字符串。保存代码后,跳转到父组件并为声明的Switch
组件添加一个新的checkedColor
属性:
![0483be8f9f6e0c344cffd940b8f8d313.png](https://i-blog.csdnimg.cn/blog_migrate/d9b59c6ff591ca29c42d476a652226ed.jpeg)
现在我们已经得到了一个灵活的、模块化的Switch
组件。