UNPKG

vui-design

Version:

A high quality UI Toolkit based on Vue.js

118 lines (101 loc) 3.23 kB
import PropTypes from "../../utils/prop-types"; import getClassNamePrefix from "../../utils/getClassNamePrefix"; export const createProps = () => { return { classNamePrefix: PropTypes.string, data: PropTypes.object.def({}) }; }; export default { name: "vui-select-menu-item", inject: { vuiSelect: { default: undefined } }, props: createProps(), computed: { actived() { const { vuiSelect, $props: props } = this; const { state: vuiSelectState } = vuiSelect; let actived = false; if (vuiSelectState.activedMenuItem) { actived = vuiSelectState.activedMenuItem.value === props.data.value; } return actived; }, selected() { const { vuiSelect, $props: props } = this; const { $props: vuiSelectProps, state: vuiSelectState } = vuiSelect; let selected = false; if (vuiSelectProps.multiple) { if (vuiSelectState.value && vuiSelectState.value.length > 0) { selected = vuiSelectState.value.findIndex(item => item.value === props.data.value) > -1; } } else { if (vuiSelectState.value) { selected = vuiSelectState.value.value === props.data.value; } } return selected; }, disabled() { const { $props: props } = this; return props.data.disabled; } }, methods: { handleMouseenter(e) { const { $props: props } = this; if (this.disabled) { return; } this.$emit("mouseenter", props.data); }, handleClick(e) { const { $props: props } = this; if (this.disabled) { return; } this.$emit("click", props.data); } }, render(h) { const { $props: props } = this; const { handleMouseenter, handleClick } = this; // class const classNamePrefix = getClassNamePrefix(props.classNamePrefix, "item"); let classes = {}; classes.el = { [`${classNamePrefix}`]: true, [`${classNamePrefix}-level-${props.data.level}`]: true, [`${classNamePrefix}-actived`]: this.actived, [`${classNamePrefix}-selected`]: this.selected, [`${classNamePrefix}-disabled`]: this.disabled }; classes.elContent = `${classNamePrefix}-content`; classes.elIcon = `${classNamePrefix}-icon`; // render let children = []; children.push( <div class={classes.elContent}> {props.data.children || props.data.label || props.data.value} </div> ); if (props.data.type === "keyword") { children.push( <div class={classes.elIcon}> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1024 1024"> <path d="M965.6,80h-77.3c-5.6,0-10.3,4.5-10.3,10.1v653.3H251.6v-92c-0.1-5.7-4.8-10.2-10.5-10.2c-2.3,0-4.5,0.8-6.3,2.2L51.9,784.6c-4.4,3.4-5.3,9.7-1.9,14.1c0.5,0.7,1.2,1.3,1.9,1.8l182.9,141.2c4.5,3.5,11,2.8,14.5-1.6c1.4-1.8,2.2-4,2.3-6.3v-94.7h641.9c45.5,0,82.5-36.2,82.5-80.7V90.1C975.9,84.5,971.3,79.9,965.6,80C965.6,80,965.6,80,965.6,80z" /> </svg> </div> ); } return ( <div class={classes.el} onMouseenter={handleMouseenter} onClick={handleClick}> {children} </div> ); } };