antd Switch文档 https://ant.design/components/switch-cn

Switches

默认显示,开关 image.pngimage.png

  1. import React, { useState, useEffect } from "react";
  2. import { func, bool, array } from "prop-types";
  3. import { Switch } from "antd";
  4. import { isFunction, isArray, merge } from "lodash-es";
  5. // export const SwitchRef = forwardRef(Switches);
  6. const defaultOptions = ['开', '关'];
  7. /**
  8. * props.options
  9. * ['开启', '关闭']
  10. * ['1', '0'],
  11. * [<CheckOutlined />, <CloseOutlined />]
  12. */
  13. Switches.propTypes = {
  14. value: bool,
  15. onChange: func,
  16. options: array,
  17. };
  18. function Switches(props) {
  19. const { options, value, onChange, ...rest } = props;
  20. // 选中的内容,非选中时的内容
  21. const [checkedChildren, unCheckedChildren] = isArray(options) ?
  22. merge(defaultOptions,options) : defaultOptions;
  23. // useImperativeHandle(ref, () => form);
  24. const [checked, setChecked] = useState(value);
  25. useEffect(() => {
  26. if (value === checked) return;
  27. setChecked(value ?? false)
  28. }, [value])
  29. // Switch onChange
  30. function handleChange(checked: boolean, e: Event) {
  31. setChecked(checked);
  32. if (!isFunction(onChange)) return;
  33. onChange(checked, e);
  34. }
  35. return (
  36. <Switch
  37. {...rest}
  38. checkedChildren={checkedChildren}
  39. unCheckedChildren={unCheckedChildren}
  40. checked={checked}
  41. onChange={handleChange}
  42. />
  43. );
  44. }
  45. export default Switches;

FormItem

  1. import { Switches } from '@/components'
  2. <Form.Item
  3. label='状态'
  4. name='status'
  5. valuePropName='checked' // default 'value',针对表单
  6. >
  7. <Switches />
  8. </Form.Item>

Segmented

image.png

  1. import React, { useState, useEffect } from "react";
  2. import { func, bool, string, number, oneOfType, array } from "prop-types";
  3. import { Segmented } from "antd";
  4. import { isFunction, isArray } from "lodash-es";
  5. const defaultOptions = [
  6. { label: '开', value: true },
  7. { label: '关', value: false },
  8. ];
  9. Segment.propTypes = {
  10. value: oneOfType([bool, number, string]),
  11. onChange: func,
  12. options: array,
  13. };
  14. Segment.defaultProps = {
  15. options: defaultOptions
  16. }
  17. function Segment(props) {
  18. const { options, value, onChange, ...rest } = props;
  19. const [checked, setChecked] = useState(value);
  20. useEffect(() => {
  21. if (value === checked) return;
  22. setChecked(value ?? false)
  23. }, [value])
  24. function handleChange(checked: boolean) {
  25. setChecked(checked);
  26. if (!isFunction(onChange)) return;
  27. onChange(checked);
  28. }
  29. return (
  30. <Segmented
  31. {...rest}
  32. options={isArray(options) ? options : []}
  33. onChange={handleChange}
  34. />
  35. );
  36. }
  37. export default Segment;

Switch和 Checkbox的区别

Switch & Checkbox Toggle的正确用法 http://jellyjelly.co/archives/343

  • Switch 大部分用于系统上的状态变化,Toggle 则用于应用内前后关系的变化
  • 前后关系的变化只会影响当前界面的操作,而系统状态的变化是全局性的,在任何时候都能生效
  • 常见的错误例子:在搜索过滤器里使用了 Switch 来对选项进行操作。为什么错?搜索过滤的设置只影响于搜索页面内的变化,不适用于整个应用

image.png

  • 点击 Switch 后能有即时的反馈是用户的预期反馈,但是在搜索过滤页这里,当做出选择后,直到按下确认或者保存按钮,过滤器才会生效,显然这不符合 Switch 的使用场景。

image.png

Switch的使用场景

  1. 影响系统或者应用的全局状态
  2. 两种不同状态的变化,而不是对立的、互斥的变化;需要表示开关状态/两种状态之间的切换时
  3. 激活某种状态,而不是执行一个操作

Switch 和 checkbox 的区别是,切换 switch 会直接触发状态改变,而 checkbox 一般用于状态标记,需要和提交操作配合