element-plus
Version:
A Component Library for Vue3.0
83 lines (76 loc) • 2.56 kB
JavaScript
import { defineComponent, ref, watch, onUnmounted, provide, openBlock, createBlock, renderSlot } from 'vue';
import mitt from 'mitt';
import { UPDATE_MODEL_EVENT, CHANGE_EVENT } from '../utils/constants';
var script = defineComponent({
name: 'ElCollapse',
props: {
accordion: Boolean,
modelValue: {
type: [Array, String, Number],
default: () => [],
},
},
emits: [UPDATE_MODEL_EVENT, CHANGE_EVENT],
setup(props, { emit }) {
const activeNames = ref([].concat(props.modelValue));
const collapseMitt = mitt();
const setActiveNames = _activeNames => {
activeNames.value = [].concat(_activeNames);
const value = props.accordion ? activeNames.value[0] : activeNames.value;
emit(UPDATE_MODEL_EVENT, value);
emit(CHANGE_EVENT, value);
};
const handleItemClick = name => {
if (props.accordion) {
setActiveNames((activeNames.value[0] || activeNames.value[0] === 0) &&
activeNames.value[0] === name
? ''
: name);
}
else {
let _activeNames = activeNames.value.slice(0);
const index = _activeNames.indexOf(name);
if (index > -1) {
_activeNames.splice(index, 1);
}
else {
_activeNames.push(name);
}
setActiveNames(_activeNames);
}
};
watch(() => props.modelValue, () => {
activeNames.value = [].concat(props.modelValue);
});
collapseMitt.on('item-click', handleItemClick);
onUnmounted(() => {
collapseMitt.all.clear();
});
provide('collapse', {
activeNames,
collapseMitt,
});
return {
activeNames,
setActiveNames,
handleItemClick,
};
},
});
const _hoisted_1 = {
class: "el-collapse",
role: "tablist",
"aria-multiselectable": "true"
};
function render(_ctx, _cache, $props, $setup, $data, $options) {
return (openBlock(), createBlock("div", _hoisted_1, [
renderSlot(_ctx.$slots, "default")
]))
}
script.render = render;
script.__file = "packages/collapse/src/collapse.vue";
script.install = (app) => {
app.component(script.name, script);
};
const _Collapse = script;
export default _Collapse;