关于构成vue组件元素的思考

在我们开发中,我经常需要对页面功能进行不同的拆分,可以分为容器组件和展示组件。容器组件包含一个或多个展示组件。

一个展示组件包含了模板、脚本以及样式的代码。常见的封装:

1、用户改变数据源使页面呈现不同的状态。

<div>
    <my-component data="我是父组件传入子组件的数据"></my-component>
</div>

2、自定义封装,开放一部分slot给父组件,可以使其定制化。

<div>
    <my-component data="我是父组件传入子组件的数据">
        <template slot="customize">
            <span>这是定制化的数据</span>
        </template>
    </my-component>
</div>

 myComponent 组件中

<div class="container">
    <span>{{ data }}</span>
    <slot name="customize"></slot>
<div>

由此我们可以总结一个组件构成的三要素:prop、slot、event

1、prop可以配置组件有哪些功能,props最好用对象写法,可以针对每个属性值进行默认赋值、设置类型和类型判断。

比如我们封装一个button组件,定义了两个属性:尺寸 size 和 是否禁用 disabled。其中 size 使用 validator 进行了值的自定义验证,也就是说,从父级传入的 size,它的值必须是指定的 small、large、default 中的一个,默认值是 default。

<template>
  <button :class="'i-button-size' + size" :disabled="disabled"></button>
</template>
<script>
  // 判断参数是否是其中之一
  function oneOf (value, validList) {
    for (let i = 0; i < validList.length; i++) {
      if (value === validList[i]) {
        return true;
      }
    }
    return false;
  }

  export default {
    props: {
      size: {
        validator (value) {
          return oneOf(value, ['small', 'large', 'default']);
        },
        default: 'default'
      },
      disabled: {
        type: Boolean,
        default: false
      }
    }
  }
</script>

父组件使用

<i-button size="large" id="btn1" class="btn-submit"></i-button>
<i-button disabled></i-button>

2、slot插槽,比如我们想给button组件添加icon和文字,就可以使用slot进行配置,将上面button改造一下

<button :class="'i-button-size' + size" :disabled="disabled">
   <slot name="icon"></slot>
   <slot></slot>
 </button>

父组件使用

 
<i-button>
  <i slot="icon">我是图标</i>
  按钮
</i-button>

3、event自定义事件

<button :class="'i-button-size' + size" :disabled="disabled" @click="handleClick">
   <slot name="icon"></slot>
   <slot></slot>
</button>

//methods里面添加
handleClick (event) {
   this.$emit('on-click', event);
}

父组件使用

<i-button @on-click="handleClick">
  <i slot="icon">我是图标</i>
  按钮
</i-button>

我们也可以在父组件直接添加点击事件,使用native修饰符区分原生事件和自定义事件。

<i-button @click.native="handleClick">
  <i slot="icon">我是图标</i>
  按钮
</i-button>

掌握了 Vue.js 组件的这三个 API 后,剩下的便是程序的设计。在组件开发中,最难的环节应当是解耦组件的交互逻辑,尽量把复杂的逻辑分发到不同的子组件中,然后彼此建立联系,在这其中,计算属性(computed)和混合(mixins)是两个重要的技术点,合理利用,就能发挥出 Vue.js 语言的最大特点:把状态(数据)的维护交给 Vue.js 处理,我们只专注在交互上。

 

参考:掘金小册vue组件精讲

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值