美文网首页优美编程让前端飞Web前端之路
我坑我自己-vuecli3.0 + TS中应用HOC

我坑我自己-vuecli3.0 + TS中应用HOC

作者: 小遁哥 | 来源:发表于2019-10-22 20:02 被阅读0次

    FlexWrapper.vue 代码如下

    <template>
      <TagConvert :tag="$attrs.tag" class="FlexWrapper">
        <slot></slot>
      </TagConvert>
    </template>
    
    <script lang="ts">
    import { Component, Vue, Prop } from "vue-property-decorator";
    import TagConvert from "@/components/TagConvert/TagConvert";
    @Component({
      components: {
        TagConvert,
      },
    })
    export default class FlexWrapper extends Vue {}
    </script>
    
    <style lang="less">
    /*
      .FlexWrapper 来源于 sf-atom-css
    */
    </style>    
    

    这样的组件还有FloatWrapper、InlineBlockWrapper、TextWrapper、TableWrapper 。

    他们的区别就在于 名字,于是乎我只要新建一个FloatWrapper.vue 把代码黏贴过来,Ctrl+D 选中FlexWrapper,Ctrl+Shift+l选中全部匹配,替换,大功告成!

    image

    然而当我复制到TextWrapper 突然想起了 react中的HOC,于是我新增了文件

    LayoutHOC.ts

    import Vue from "vue";
    import TagConvert from "@/components/TagConvert/TagConvert";
    
    export default (argName: string) =>
      Vue.extend({
        components: {
          TagConvert,
        },
        render(createElement, context) {
          return createElement(
            TagConvert,
            {
              attrs: {
                class: argName,
                tag: argName,
                
              },
            },
            this.$slots.default,
          );
        },
      });
    
    

    index.ts

    import LayoutHOC from "./LayoutHOC";
    export const TextWrapper = LayoutHOC("TextWrapper");
    

    然后就报错了

    Unknown custom element: <TableWrapper> - did you register the component correctly? For recursive components, make sure to provide the "name" option.

    然而在App.vue中我是注册了这个组件的

    import {
      TextWrapper,
    
      TableWrapper,
    } from "@/components/Layout";
    @Component({
      components: {
        TextWrapper,
      },
    })
    

    就这样我按照上述逻辑排查了半天,你能想到的蠢方法我都试过,然后开始了愉快的注释代码阶段。

    原来是tag: argName 这行代码有问题,TagConvert的功能大致如下

    <TagConvert  tag="p">123</TagConvert>
    

    转换为

    <p>123<p>
    

    tag: argName 使得去创建了一个TextWrapper的内部组件和App.vue那里的并不是一个...

    修改好后

    export const TextWrapper = LayoutHOC("TextWrapper");
    export const FlexWrapper = LayoutHOC("FlexWrapper");
    export const FloatWrapper = LayoutHOC("FloatWrapper");
    export const InlineBlockWrapper = LayoutHOC("InlineBlockWrapper");
    export const TableWrapper = LayoutHOC("TableWrapper");
    

    简洁多了

    相关文章

      网友评论

        本文标题:我坑我自己-vuecli3.0 + TS中应用HOC

        本文链接:https://www.haomeiwen.com/subject/cdztvctx.html