function vModel(self, dataObject, defaultValue) {
  dataObject.props.value = defaultValue;

  dataObject.on.input = (val) => {
    self.$emit('input', val);
  };
}

const componentChild = {};
/**
 * 将./slots中的文件挂载到对象componentChild上
 * 文件名为key，对应JSON配置中的__config__.tag
 * 文件内容为value，解析JSON配置中的__slot__
 */
const slotsFiles = require.context('./slots', true, /\.js$/);
const keys = slotsFiles.keys() || [];
keys.forEach((key) => {
  const tag = key.replace(/^\.\/(.*)\.\w+$/, '$1');
  const value = slotsFiles(key).default;
  componentChild[tag] = value;
});

export default {
  render(h) {
    const dataObject = {
      attrs: {},
      props: {},
      on: {},
      style: {},
    };
    const confClone = JSON.parse(JSON.stringify(this.conf));
    const children = [];

    const childObjs = componentChild[confClone.__config__.tag];
    if (childObjs) {
      Object.keys(childObjs).forEach((key) => {
        const childFunc = childObjs[key];
        if (confClone.__slot__ && confClone.__slot__[key]) {
          children.push(childFunc(h, confClone, key));
        }
      });
    }

    Object.keys(confClone).forEach((key) => {
      const val = confClone[key];
      if (key === '__vModel__') {
        vModel(this, dataObject, confClone.__config__.defaultValue);
      } else if (dataObject[key]) {
        dataObject[key] = { ...dataObject[key], ...val };
      } else {
        dataObject.attrs[key] = val;
      }
    });
    delete dataObject.attrs.__config__;
    delete dataObject.attrs.__slot__;
    return h(this.conf.__config__.tag, dataObject, children);
  },
  props: ['conf'],
};
