fix: get options props
parent
41129be9b6
commit
f4c1c4569d
|
@ -1,14 +1,12 @@
|
||||||
import isPlainObject from 'lodash/isPlainObject';
|
import isPlainObject from 'lodash/isPlainObject';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { isVNode } from 'vue';
|
import { isVNode } from 'vue';
|
||||||
|
import { camelize, hyphenate, isOn, resolvePropValue } from './util';
|
||||||
// function getType(fn) {
|
// function getType(fn) {
|
||||||
// const match = fn && fn.toString().match(/^\s*function (\w+)/);
|
// const match = fn && fn.toString().match(/^\s*function (\w+)/);
|
||||||
// return match ? match[1] : '';
|
// return match ? match[1] : '';
|
||||||
// }
|
// }
|
||||||
|
|
||||||
const onRE = /^on[^a-z]/;
|
|
||||||
export const isOn = key => onRE.test(key);
|
|
||||||
|
|
||||||
const splitAttrs = attrs => {
|
const splitAttrs = attrs => {
|
||||||
const allAttrs = Object.keys(attrs);
|
const allAttrs = Object.keys(attrs);
|
||||||
const eventAttrs = {};
|
const eventAttrs = {};
|
||||||
|
@ -25,10 +23,6 @@ const splitAttrs = attrs => {
|
||||||
}
|
}
|
||||||
return { onEvents, events: eventAttrs, extraAttrs };
|
return { onEvents, events: eventAttrs, extraAttrs };
|
||||||
};
|
};
|
||||||
const camelizeRE = /-(\w)/g;
|
|
||||||
const camelize = str => {
|
|
||||||
return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));
|
|
||||||
};
|
|
||||||
const parseStyleText = (cssText = '', camel) => {
|
const parseStyleText = (cssText = '', camel) => {
|
||||||
const res = {};
|
const res = {};
|
||||||
const listDelimiter = /;(?![^(]*\))/g;
|
const listDelimiter = /;(?![^(]*\))/g;
|
||||||
|
@ -101,17 +95,19 @@ const getOptionProps = instance => {
|
||||||
const props = instance.$.vnode.props || {};
|
const props = instance.$.vnode.props || {};
|
||||||
Object.keys(instance.$props).forEach(k => {
|
Object.keys(instance.$props).forEach(k => {
|
||||||
const v = instance.$props[k];
|
const v = instance.$props[k];
|
||||||
if (v !== undefined || k in props) {
|
const hyphenateKey = hyphenate(k);
|
||||||
res[k] = k in props ? props[k] : v;
|
if (v !== undefined || hyphenateKey in props) {
|
||||||
|
res[k] = v; // 直接取 $props[k]
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if (isVNode(instance) && typeof instance.type === 'object') {
|
} else if (isVNode(instance) && typeof instance.type === 'object') {
|
||||||
const props = instance.props || {};
|
const props = instance.props || {};
|
||||||
const allProps = instance.type.props;
|
const options = instance.type.props;
|
||||||
Object.keys(allProps).forEach(k => {
|
Object.keys(options).forEach(k => {
|
||||||
const v = allProps[k].default;
|
const hyphenateKey = hyphenate(k);
|
||||||
if (v !== undefined || k in props) {
|
const v = resolvePropValue(options, props, k, props[hyphenateKey], hyphenateKey);
|
||||||
res[k] = k in props ? props[k] : v;
|
if (v !== undefined || hyphenateKey in props) {
|
||||||
|
res[k] = v;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
const isFunction = val => typeof val === 'function';
|
||||||
|
const onRE = /^on[^a-z]/;
|
||||||
|
const isOn = key => onRE.test(key);
|
||||||
|
|
||||||
|
const cacheStringFunction = fn => {
|
||||||
|
const cache = Object.create(null);
|
||||||
|
return str => {
|
||||||
|
const hit = cache[str];
|
||||||
|
return hit || (cache[str] = fn(str));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
const camelizeRE = /-(\w)/g;
|
||||||
|
const camelize = cacheStringFunction(str => {
|
||||||
|
return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));
|
||||||
|
});
|
||||||
|
|
||||||
|
const hyphenateRE = /\B([A-Z])/g;
|
||||||
|
const hyphenate = cacheStringFunction(str => {
|
||||||
|
return str.replace(hyphenateRE, '-$1').toLowerCase();
|
||||||
|
});
|
||||||
|
|
||||||
|
const capitalize = cacheStringFunction(str => {
|
||||||
|
return str.charAt(0).toUpperCase() + str.slice(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||||
|
const hasOwn = (val, key) => hasOwnProperty.call(val, key);
|
||||||
|
|
||||||
|
// change from vue sourcecode
|
||||||
|
function resolvePropValue(options, props, key, value, hyphenateKey) {
|
||||||
|
const opt = options[key];
|
||||||
|
if (opt != null) {
|
||||||
|
const hasDefault = hasOwn(opt, 'default');
|
||||||
|
// default values
|
||||||
|
if (hasDefault && value === undefined) {
|
||||||
|
const defaultValue = opt.default;
|
||||||
|
value = opt.type !== Function && isFunction(defaultValue) ? defaultValue() : defaultValue;
|
||||||
|
}
|
||||||
|
// boolean casting
|
||||||
|
if (opt[0 /* shouldCast */]) {
|
||||||
|
if (!hasOwn(props, hyphenateKey) && !hasDefault) {
|
||||||
|
value = false;
|
||||||
|
} else if (opt[1 /* shouldCastTrue */] && (value === '' || value === hyphenateKey)) {
|
||||||
|
value = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { isOn, cacheStringFunction, camelize, hyphenate, capitalize, resolvePropValue };
|
Loading…
Reference in New Issue