Checkbox.js 1.88 KB
import template from "./Checkbox.html";
import style from "antd/lib/checkbox/style/index.css";

class Checkbox {
    useModules = ["esNgAntd"];

    require = ["^?antdForm", "^?antdFormItem"];

    state = {
        checked: this.props.checked || this.props.defaultChecked || false,
        disabled: false,
        type: "checkbox",
    };

    constructor($element, $attrs, $controllers) {
        let [antdForm, antdFormItem] = $controllers;

        esNgAntd.createStyle("ant-checkbox", style);

        // 上下文
        if (antdForm) {
            this.antdForm = antdForm.getContext();
            this.antdForm.state.formItems.push($scope);
        }
        if (antdFormItem) {
            this.antdFormItem = antdFormItem.getContext();
        }
    }

    componentDidUpdate(prevProps) {
        if (prevProps.checked !== this.props.checked) {
            if (newVal !== undefined) {
                this.state.checked = ["true", "checked", true].includes(newVal)
                    ? true
                    : false;
            }
        }
        if (prevProps.disabled !== this.props.disabled) {
            if (newVal !== undefined) {
                this.state.disabled = ["true", "disabled", true].includes(
                    newVal
                )
                    ? true
                    : false;
            }
        }
    }

    handleClick($event) {
        if (this.state.disabled) {
            return;
        }
        this.state.checked = !this.state.checked;
        this.props.onChange({ event: $event });
    }

    setValue(value) {
        if (value) {
            this.state.checked = value;
        } else {
            this.state.checked = false;
        }
    }

    render() {
        return template;
    }
}

Checkbox.propTypes = {
    defaultChecked: PropTypes.boolean,
    checked: PropTypes.string,
    disabled: PropTypes.string,
    onChange: PropTypes.function,
};