基于elementUI二次封装下拉框学年组件selecte组件(体验v-model给自身双数据绑定和给组件双数据绑定)
需求:
1、封装一个下拉框组件,选择学年
2、学年list默认是组件自带,如果父组件传值了用父组件传来的
3、默认选中当前年份
step:
1、components中定义SchoolYear.vue
/** * props: * yearList // select数据 格式: [{text, value, checked}] * isSelected // 是否选中checked: true * v-model // 同步数据 v-model='selected' 等价于 :selectedYear="selected" @yearChange='selected=$event' 将当前选中的值同步到父组件中的schoolYear */ <template> <!-- <el-select :value="currentYear" @change="handleChange"> <el-option v-for="item in tempYearList" :key="item.value" :label="`${item.text}学年`" :value="item.value" /> </el-select> --> <!-- 如果要用v-model替代:value="currentYear" @change="handleChange",需要watch监听currentYear值的变化触发到父组件中selected值同步改变 --> <el-select v-model="currentYear"> <el-option v-for="item in tempYearList" :key="item.value" :label="`${item.text}学年`" :value="item.value" /> </el-select> </template> <script> export default { model: { event: 'yearChange' }, props: { yearList: Array, isSelected: { type: Boolean, default: false } }, data() { return { currentYear: '', tempYearList: [] } }, watch: { currentYear: { handler(newVal) { this.$emit('yearChange', newVal) } } }, created() { this.yearList && this.yearList.length ? this.setYearList(this.yearList) : this.setYearList([ { checked: false, text: '2022', value: 2022 }, { checked: true, text: '2021', value: 2021 }, { checked: false, text: '2020', value: 2020 } ]) }, methods: { setYearList(data) { this.tempYearList = data const { isSelected } = this const yearsArr = data.filter((n) => n.checked) const { length } = yearsArr if (length && isSelected) { const [{ value }] = yearsArr this.currentYear = value // this.handleChange(value) } } // handleChange(val) { // this.$emit('yearChange', val) // this.currentYear = val // } } } </script>
在该组件中,v-model='currentYear'是:value="currentYear" @change="handleChange"的语法糖
2、引入并使用
data() { return { selected: '' } }, methods: { handleSubmit() { console.log('已选年份', this.selected) } }
<SchoolYear v-model="selected" isSelected></SchoolYear> <!-- <SchoolYear @yearChange='selected=$event' isSelected></SchoolYear> --> <button @click="handleSubmit">点击</button>
在父组件调用该子组件时,使用v-model="selected",其实是:selectedYear="selected" @yearChange='selected=$event'的语法糖,在SchoolYear.vue中需要定义model: { prop: 'selectedYear', event: 'yearChange' }。SchoolYear.vue中没有用到父组件传来的selectedYear,所以model中的prop我就省略了。
3、效果:
分类:
vue
, element-ui
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结