【组件封装】-【vue组件设计经验技巧】

思想

一、样式的思考:组件里写哪些样式?应该注意什么?
二、template的思考:slot还是组件里写好?
三、行为的思考:父组件定义还是子组件定义?如果在父组件中定义,那么组件的可扩展性就好了,但是会写很多代码,如果在子组件中定义,那么使用组件的人很方便但是不好扩展
四、props的思考:到底哪些东西作为props哪些东西作为组件本身的data

样式编写建议

一、容器的基本样式,内部内容的基本样式
二、尽量使用低权值,即使用标签名来定义样式(标签名的权值是最低的,为1),这样做的好处是,如果父组件想修改样式,直接给标签加class即可
三、定义一些内置类
自定义searchBar组件:

<template>
    <div class="search-wrap">
        <slot></slot>
        <button class="search-button">搜索</button>
        <button class="reset-button">重置</button>
    </div>
</template>
<script>
    export default{
     
     
        name:"search",
        props:{
     
     
            msg:String
        },
        mounted() {
     
     
            
        },
        methods: {
     
     
            search(){
     
     

            }
        },
    }
</script>
<style scoped>
.search-wrap{
     
     
    width: 600px;
    display: flex;
    box-shadow: 2px 3px 4px #9f9b9b;
    padding: 20px;
}
.search-item{
     
     
    margin-right: 15px;
}

/* 父组件传进来的内容中肯定有input标签,要给input标签低权值的样式,所以使用input标签名来添加样式,此时他的样式权值是1 */
input{
     
     

}
/* 如果用下面这种方法给input标签添加样式,那么当父组件想修改样式时,就需要用important,因为类名选择器的样式权值为10,所以下面这种写法的权值为11
.search-wrap input{
}
*/

/* 预置一些类名 */
mini-wrap{
     
     
	wisth: 200px;
}

button{
     
     
    border: none;
    color: white;
    padding: 4px 15px;
    cursor: pointer;
}

.search-wrap .search-button{
     
     
    background-color: rgb(23,23,185);
}
</style>

父组件使用:

<searchBar>
	<div class="search-item">
		<label></label>
		<input class="search-input"/>
	</div>
	<!-- 如果想使用小一点的搜索框 -->
	<div class="mini-wrap">
		<label>姓名</label>
		<input class="search-input"/>
	</div>
</searchBar>

template建议

一、基本原则:内容固定就写死不确定的部分使用slot传入,此外还要考虑数据传递的问题,如果把数据写死,之后传出去会不会比较麻烦
二、如果平衡一点,可以这样:父组件传了slot,子组件就用slot,没有传就用默认的。如果全部写死,组件的便捷

### 封装季度选择组件的实现 在 antd-vue 1.7.8 中,可以通过扩展 `DatePicker` 组件封装一个季度选择组件。以下是一个完整的实现示例: #### 实现步骤 1. **引入基础组件**:使用 `DatePicker` 的 `picker="quarter"` 属性来实现季度选择功能。 2. **封装为独立组件**:将季度选择逻辑封装到一个 Vue 组件中,并通过 `v-model` 提供双向绑定支持。 3. **样式与功能扩展**:确保组件样式正确加载,并提供必要的功能扩展。 以下是代码示例: ```vue <template> <a-date-picker v-model="currentValue" :placeholder="placeholder" :disabled="disabled" :allowClear="allowClear" picker="quarter" @change="handleChange" /> </template> <script> export default { name: "QuarterPicker", props: { value: { type: [String, Date], default: undefined, }, placeholder: { type: String, default: "请选择季度", }, disabled: { type: Boolean, default: false, }, allowClear: { type: Boolean, default: true, }, }, data() { return { currentValue: this.value, }; }, watch: { value(newVal) { this.currentValue = newVal; }, currentValue(newVal) { this.$emit("input", newVal); }, }, methods: { handleChange(date, dateString) { this.currentValue = date; this.$emit("change", date, dateString); }, }, }; </script> <style scoped> /* 可根据需要添加自定义样式 */ </style> ``` #### 使用示例 在父组件中使用封装好的 `QuarterPicker` 组件: ```vue <template> <div> <quarter-picker v-model="selectedQuarter" placeholder="请选择季度" @change="handleQuarterChange" /> </div> </template> <script> import QuarterPicker from "./components/QuarterPicker.vue"; export default { components: { QuarterPicker, }, data() { return { selectedQuarter: undefined, }; }, methods: { handleQuarterChange(date, dateString) { console.log("Selected Quarter:", date, dateString); }, }, }; </script> ``` ### 关键点说明 1. **`picker="quarter"`**:这是 antd-vue 提供的内置属性,用于指定日期选择器的行为为季度选择模式[^1]。 2. **双向绑定**:通过 `v-model` 和 `watch` 实现父子组件之间的数据同步。 3. **事件处理**:通过 `@change` 监听用户选择的变化,并触发回调函数。 ### 注意事项 - 确保已正确安装并引入 antd-vue 样式文件[^2]。 - 如果需要扩展更多功能(如禁用某些季度),可以参考 antd-vue 的官方文档进行进一步定制。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值