当前位置: 首页 > news >正文

自定义组件(移动端下拉多选)中使用 v-model

在这里插入图片描述
在这里插入图片描述

一、Vue 3 示例

v-model 的本质
v-model 默认绑定 modelValue 属性并监听 update:modelValue 事件。

MultipleSelect.vue

<template><van-dropdown-menu ref="menuRef"><van-dropdown-item :title="placeholder" ref="itemRef"><van-cell v-for="item in options" :key="item.value" :title="item.label" center @click="handleClick(item)"><template #right-icon><van-icon v-show="modelValue.includes(item.value)" name="success" color="rgb(0, 122, 255)" /></template></van-cell></van-dropdown-item></van-dropdown-menu>
</template>
<script setup>
const props = defineProps({modelValue: {type: Array,default: () => []},placeholder: {type: String,default: '请选择'},options: {type: Array,default: () => []}
})const emit = defineEmits(['update:modelValue'])const handleClick = (val) => {const selected = [...props.modelValue]if (selected.includes(val.value)) {selected.splice(selected.indexOf(val.value), 1)} else {selected.push(val.value)}emit('update:modelValue', selected)console.log(selected)
}
</script>

使用

<template><div class="home-page"><MultipleSelect v-model="selected" placeholder="请选择" :options="options" /></div>
</template><script setup>
import { ref, watch } from 'vue'
import MultipleSelect from '@/components/MultipleSelect.vue'const options = [{label: '北京',value: 1,},{label: '上海',value: 2,},{label: '广州',value: 3,},{label: '深圳',value: 4,},
]const selected = ref([])watch(selected, (newVal) => {console.log('选中的值', newVal)
})</script><style lang="scss" scoped>
.home-page {}
</style>

组件上的 v-model 也可以接受一个参数:

<MultipleSelect v-model:value="selected" placeholder="请选择" :options="options" />
<template><van-dropdown-menu ref="menuRef"><van-dropdown-item :title="placeholder" ref="itemRef"><van-cell v-for="item in options" :key="item.value" :title="item.label" center @click="handleClick(item)"><template #right-icon><van-icon v-show="value.includes(item.value)" name="success" color="rgb(0, 122, 255)" /></template></van-cell></van-dropdown-item></van-dropdown-menu>
</template>
<script setup>
const props = defineProps({value: {type: Array,default: () => []},placeholder: {type: String,default: '请选择'},options: {type: Array,default: () => []}
})const emit = defineEmits(['update:value'])const handleClick = (val) => {const selected = [...props.value]if (selected.includes(val.value)) {selected.splice(selected.indexOf(val.value), 1)} else {selected.push(val.value)}emit('update:value', selected)console.log(selected)
}
</script>

二、vue3.4+示例

<template><van-dropdown-menu ref="menuRef"><van-dropdown-item :title="placeholder" ref="itemRef"><van-cell v-for="item in options" :key="item.value" :title="item.label" center @click="handleClick(item)"><template #right-icon><van-icon v-show="model.includes(item.value)" name="success" color="rgb(0, 122, 255)" /></template></van-cell></van-dropdown-item></van-dropdown-menu>
</template>
<script setup>
/*** defineModel 是一个便利宏。编译器将其展开为以下内容:一个名为 modelValue 的 prop,本地 ref 的值与其同步;一个名为 update:modelValue 的事件,当本地 ref 的值发生变更时触发。*/
const model = defineModel({ default: () => [] })
const props = defineProps({placeholder: {type: String,default: '请选择'},options: {type: Array,default: () => []}
})const handleClick = (val) => {const selected = [...model.value]if (selected.includes(val.value)) {selected.splice(selected.indexOf(val.value), 1)} else {selected.push(val.value)}// 直接赋值给 model.valuemodel.value = selectedconsole.log(selected)
}
</script><style lang="scss" scoped></style>
<MultipleSelect v-model="selected" placeholder="请选择" :options="options" />

组件上的 v-model 也可以接受一个参数:

<MultipleSelect v-model:value="selected" placeholder="请选择" :options="options" />
<template><van-dropdown-menu ref="menuRef"><van-dropdown-item :title="placeholder" ref="itemRef"><van-cell v-for="item in options" :key="item.value" :title="item.label" center @click="handleClick(item)"><template #right-icon><van-icon v-show="value.includes(item.value)" name="success" color="rgb(0, 122, 255)" /></template></van-cell></van-dropdown-item></van-dropdown-menu>
</template>
<script setup>
/*** defineModel 是一个便利宏。编译器将其展开为以下内容:一个名为 modelValue 的 prop,本地 ref 的值与其同步;一个名为 update:modelValue 的事件,当本地 ref 的值发生变更时触发。*/
const value = defineModel({ default: () => [] })
const props = defineProps({placeholder: {type: String,default: '请选择'},options: {type: Array,default: () => []}
})const handleClick = (val) => {const selected = [...value.value]if (selected.includes(val.value)) {selected.splice(selected.indexOf(val.value), 1)} else {selected.push(val.value)}// 直接赋值给 value.valuevalue.value = selectedconsole.log(selected)
}
</script><style lang="scss" scoped></style>

三、vue2示例

<template><van-dropdown-menu ref="menuRef"><van-dropdown-item :title="placeholder" ref="itemRef"><van-cell v-for="item in options" :key="item.value" :title="item.label" center @click="handleClick(item)"><template #right-icon><van-icon v-show="value.includes(item.value)" name="success" color="rgb(0, 122, 255)" /></template></van-cell></van-dropdown-item></van-dropdown-menu>
</template><script>
export default {props: {value: {type: Array,default: () => []},placeholder: {type: String,default: '请选择'},options: {type: Array,default: () => []}},data() {return {}},methods: {handleClick(val) {const selected = [...this.value]if (selected.includes(val.value)) {selected.splice(selected.indexOf(val.value), 1)} else {selected.push(val.value)}this.$emit('update:value', selected)console.log(selected)}}
}</script>
<template><div class="home-page"><MultipleSelect v-model:value="selected" placeholder="请选择" :options="options" /></div>
</template><script>
import MultipleSelect from '@/components/MultipleSelect.vue'
export default {components: {MultipleSelect},data() {return {options: [{label: '北京',value: 1,},{label: '上海',value: 2,},{label: '广州',value: 3,},{label: '深圳',value: 4,},],selected: []}},watch: {selected(newVal) {console.log('选中的值', newVal)}}}</script><style lang="scss" scoped>
.home-page {width: 100%;height: 100%;
}
</style>

下拉多选2

<template><van-field readonly clickable name="picker" v-model="fieldValue" :label="label" :placeholder="placeholder"input-align="right" is-link @click="popupVisible = true" /><!-- <van-popup v-model:show="popupVisible" position="bottom" :style="{ height: '30%' }"><van-cell v-for="item in options" :key="item.value" :title="item.label" center @click="handleClick(item)"><template #right-icon><van-icon v-show="modelValue.includes(item.value)" name="success" color="rgb(0, 122, 255)" /></template>
</van-cell>
</van-popup> --><van-popup v-model:show="popupVisible" round position="bottom" closeable class="custom-popup"><van-cell-group class="list"><van-cell v-for="item in options" :key="item.value" :title="item.label" center @click="handleClick(item)"><template #right-icon><van-icon v-show="modelValue.includes(item.value)" name="success" color="rgb(0, 122, 255)" /></template></van-cell></van-cell-group></van-popup>
</template>
<script setup>
import { ref } from 'vue'
const props = defineProps({modelValue: {type: Array,default: () => []},label: {type: String,default: ''},placeholder: {type: String,default: '请选择'},options: {type: Array,default: () => []}
})const emit = defineEmits(['update:modelValue'])const fieldValue = ref('')
const popupVisible = ref(false)const handleClick = (val) => {const selected = [...props.modelValue]if (selected.includes(val.value)) {selected.splice(selected.indexOf(val.value), 1)} else {selected.push(val.value)}emit('update:modelValue', selected)let selectedText = []props.options.forEach((item) => {if (selected.includes(item.value)) {selectedText.push(item.label)}})fieldValue.value = selectedText.join('、')console.log(selected)
}
</script><style>
.custom-popup {padding: 52px 0 16px 0;.list {max-height: 70vh;overflow-y: auto;-webkit-overflow-scrolling: touch;}
}
</style>
<MultipleSelect2 v-model="selected" placeholder="请选择" :options="options" label="所属城市" />
http://www.dtcms.com/a/520870.html

相关文章:

  • Android 14 系统启动流程深度解析:AVB流程
  • 阳春做网站0735郴州招聘信息网
  • 营销型网站建设申请域名网站翻页动画效果
  • NGINX架构特点和实现原理
  • 基于单片机的两路PWM信号输出及频率占空比相位差调节系统
  • uniapp三端影视源码苹果cms自动采集电影视频网站源码前端源码带VIP
  • 算法学习笔记-贪心算法总结
  • 山东省建设工程招标中心网站旅游网站前台怎么做
  • 常见神经网络
  • 公司网站ICP怎么备案呢网站维护界面
  • 建一个在线商城网站重庆做学校网站公司
  • HNSW算法实战:用分层图索引替换k-NN暴力搜索
  • 做公司网站的费用计入什么科目做三网站
  • 优秀集团网站部署个人网站
  • 大模型命名标识全解析:系统梳理与深度解读
  • 网站做关键词库的作用软件开发流程图名称
  • 无锡新区建设局网站温州专业营销网站费用
  • 数据结构——红黑树
  • 找北京赛车网站开发东营市做网站的公司
  • Agentic 组织-人和智能体协作的组织形态
  • 扩散模型与PINN融合的六大创新方向
  • pyside中多线程编程案例模型
  • 怎么做整蛊网站wordpress注册rest
  • 网站开通微信支付收费免费的ppt模板下载软件
  • 快速开发工具网站长沙网页制作设计
  • wordpress 搬站长沙企业seo服务
  • [人工智能-大模型-54]:模型层技术 - 数据结构+算法 = 程序
  • PHP调试,宝塔xdebug+vscode
  • 直接做的视频网站制作网站品牌公司
  • 【TypeScript】TypeScript 内置的工具类型(十四)