UNPKG

element-plus

Version:

A Component Library for Vue3.0

73 lines (66 loc) 1.93 kB
import useStore, { Store } from './index' import debounce from 'lodash/debounce' import { Table } from '../table/defaults' import { TableProps } from '../table/defaults' import { watch } from 'vue' const InitialStateMap = { rowKey: 'rowKey', defaultExpandAll: 'defaultExpandAll', selectOnIndeterminate: 'selectOnIndeterminate', indent: 'indent', lazy: 'lazy', data: 'data', ['treeProps.hasChildren']: { key: 'lazyColumnIdentifier', default: 'hasChildren', }, ['treeProps.children']: { key: 'childrenColumnName', default: 'children', }, } export function createStore<T>(table: Table<T>, props: TableProps<T>) { if (!table) { throw new Error('Table is required.') } const store = useStore<T>() // fix https://github.com/ElemeFE/element/issues/14075 // related pr https://github.com/ElemeFE/element/pull/14146 store.toggleAllSelection = debounce(store._toggleAllSelection, 10) Object.keys(InitialStateMap).forEach(key => { handleValue(getArrKeysValue(props, key), key, store) }) proxyTableProps(store, props) return store } function proxyTableProps<T>(store: Store<T>, props: TableProps<T>) { Object.keys(InitialStateMap).forEach(key => { watch( () => getArrKeysValue(props, key), value => { handleValue(value, key, store) }, ) }) } function handleValue<T>(value, propsKey: string, store: Store<T>) { let newVal = value let storeKey = InitialStateMap[propsKey] if (typeof InitialStateMap[propsKey] === 'object') { storeKey = storeKey.key newVal = newVal || InitialStateMap[propsKey].default } store.states[storeKey].value = newVal } function getArrKeysValue<T>(props: TableProps<T>, keys: string) { if (keys.includes('.')) { const keyList = keys.split('.') let value = props keyList.forEach(key => { value = value[key] }) return value } else { return props[keys] } }