在开发过程中,我们经常会使用各种ui组件,有的时候需要二次封装,或者修改样式,以方便重复使用

以element举例:

<template>
    <el-input v-model="_value" />
</template>

<script>
export default {
    props: {
        value: {
            type: String,
            default: ''
        }
    },
    computed: {
        _value: {
            get() {
                return this.value;
            },
            set(val) {
                this.$emit('input', val);
            }
        }
    }
// 其他额外的方法或操作
}
</script>

<style>
</style>

另外一种方式,则是通过render方法,将外部所有的参数原样传递过去

<script>
export default {
  name: `BaseInput`,
  functional: true,
  render(createElement, context) {
    return createElement(
      `el-input`,
      {
        ...context.data,
        props: {
          ...context.props
        },
        class: (context.data.staticClass || "") + " base_input",
        style: {
          width: context.props.width,
          ...context.data.staticStyle
        }
      },
      [
        context.slots().default //  also pass default slot to child
      ]
    );
  }
};
</script>

<style scoped>
.base_input >>> .el-input__inner {
  line-height: 39px;
  border: none;
  border-bottom: 1px solid rgba(68, 84, 105, 0.2);
  border-radius: 0;
  font-size: 16px;
  font-family: "Poppins";
  font-weight: 400;
  padding: 0;
  color: rgba(68, 84, 105, 1);
}
.base_input >>> .el-input__inner:focus {
  border-bottom: 1px solid rgba(68, 84, 105, 1);
}
</style>
[context.slots().default]部分,可以修改为context.children,就可以传递所有的slot
如果需要继承具名插槽
const _slots = context.slots();

 _slots.footer
          ? createElement(_slots.footer[0].tag, { slot: 'footer' }, _slots.footer[0].children)
          : null

放在default后面即可,但是无法直接使用获取到的具名插槽,原因依旧不知道



ps:但是遇到过一个奇怪的问题,在封装ElImage的时候,slot传递失败,最后使用context.parent.$createElement进行创建元素才成功,原因不知道