Vue组件化

2020-03-29  本文已影响0人  羊驼驼驼驼
Vue.png

前言

在工作中经常会用到Vue,包括也会用到很多重要的点例如组件化等等,现在也想对于之前的应用和学习做一个小小的总结~后期也会不定期的更新

组件化

一、组件通信

组件化的重中之重就是组件之间的通信,怎么进行传值可以高效方便的完成功能开发

二、插槽

插槽语法是Vue实现的内容分发API,用于复合组件开发。内容分发简单来说就是内容要在子组件中使用,但是要通过父组件将内容传递进来。

 // comp1
 <div>
   <slot></slot>
 </div>
 // parent
 <Comp1>Hello</Comp1>
 // 将内容分发到子组件指定位置
 // comp2
 <div>
   <slot></slot>
   <slot name="content"></slot>
 </div>
 // parent
 <Comp2>
   // 默认插槽用default做参数
   <template v-slot:default>匿名插槽</template>
   // 具名插槽用插槽名做参数
   <template v-slot:content>内容...</template>
 </Comp2>

数据在子组件中,但是要在插槽中使用

 // comp3
 <div>
   <slot :foo="foo"></slot>
 </div>
 // parent
 <Comp3>
   // 把v-slot的值指定为作用域上下文对象
   <template v-slot:default="slotProps">
     来自子组件中的数据{{ slotProps.foo }}
   </template>
   // 解构赋值写法
   <template v-slot:default="{foo}">
     来自子组件中的数据{{ foo }}
   </template>
 </Comp3>

上面是对Vue组件化包括组件通信以及插槽的一些介绍,接下来要通过几个在工作中常用的实例来实践一下

一、表单组件

通用表单组件,参考element表单分析我们需要实现哪些组件:

  1. KForm (指定数据、校验规则->便于管理,统一传参)
  2. KFormItem (执行校验、显示错误信息)
  3. KInput (维护数据)

四、弹窗组件

五、递归组件

递归组件是可以在它们自己模板中调用自身的组件,主要是针对树形结构的数据进行展示,在工作中的应用场景也是很多的

<template>
  <div>
    <div @click="toggle" :style="{ paddingLeft: (level-1)+'em' }">
      <label>
        {{ model.name }}
      </label>
      <span v-if="isFolder">[{{ open ?  '-' : '+' }}]</span>
    </div>
    <div v-show="open" v-if="isFolder">
      <Node 
        class="item" 
        v-for="model in model.children" 
        :model="model"
        :key="model.name"
        :level="level + 1"
      ></Node>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'Node',
    props: {
      model: Object,
      level: {
        type: Number,
        default: 0
      }
    },
    data() {
      return {
        open: false
      }
    },
    computed: {
      isFolder: function() {
          return this.model.children && this.model.children.length
      }
    },
    methods: {
      toggle: function() { 
        if(this.isFolder) {
            this.open = !this.open
        }
      }
    }

  }
</script>
<template>
  <div class="tree">
    <Node v-for="item in date" :key="item.name" :model="item"></Node>
  </div>
</template>

<script>
import Node from './Node'
export default {
  name: 'Tree',
  props: {
    data: {
      type: Array,
      required: true
    }
  },
  components: {
    Node
  }
}
</script>

<style>
.tree {
  text-align: left;
}
</style>
<template>
  <div>
    <Node :data="treeData"></Node>
  </div>
</template>

<script>
  import Node from '@/components/Tree'
  export default {
    components: {
      Node
    },
    data() {
      return {
        treeData: [
          {
            name: '水果',
            children:[
              {
                name: '南方水果',
                children: [
                  ...
                ]
              },
              {
                name: '北方水果'
              },
            ]
          },
          {
            name: '蔬菜'
          }
        ]
      }
    }
  }
</script>
以上是对组件化小小的总结,后期也会不断的更新,其中可能有纰漏或者有写错单词的情况,大家也可以帮忙指出来,共同学习共同进步~
苏大强上线
上一篇 下一篇

猜你喜欢

热点阅读