vant tabs上非第一个tab时,弹出层popup弹出失败问题解决

问题描述:

项目中使用vant tabs组件,在非第一个tab上使用了popup弹出框,弹框失效

原始代码:

<van-popup v-model="isShowDate" position="bottom" :close-on-click-overlay="false">

问题排查:在别的界面测试没有问题能弹出

解决方案:

第一步:挂载添加get-container="#app"

<van-popup v-model="isShowDate" position="bottom" get-container="#app" :close-on-click-overlay="false">

第二步:测试了很多遍,别的界面都没有问题,去掉:close-on-click-overlay="false",弹框出现

<van-popup v-model="isShowDate" position="bottom" get-container="#app">

总结:

花费两个多小时解决这个弹出层问题,其实问题很简单,还是得多看文档和了解底层逻辑。

好的,我会根据您的要求来为您编写一个不需要后端和API校园二手交易平台的首页和商品发布页面,以下是代码实现。 首先,我们需要安装`vant`和`vue-router`,您可以通过以下命令进行安装: ``` npm install vant vue-router -S ``` 接下来,我们创建一个`Home`组件作为首页的界面,代码如下: ```vue <template> <div class="home"> <van-search placeholder="搜索" v-model="search" /> <van-tabs v-model="active" type="line"> <van-tab v-for="(tab, index) in tabs" :key="index" :title="tab.title"> <van-list :finished="finished"> <van-cell v-for="(item, index) in list" :key="index" :title="item.title" :label="item.price" :thumb="item.image" :is-link="true" @click="goToDetail(item)" /> <van-list-item v-if="loading" slot="loading">加载中...</van-list-item> </van-list> </van-tab> </van-tabs> </div> </template> <script> import { reactive, toRefs, onMounted } from 'vue' import { Tab, List, Cell, Search, Tabs, ListItem } from 'vant' import { getGoodsList } from '@/api/goods' export default { name: 'Home', components: { Tab, List, Cell, Search, Tabs, ListItem }, setup() { const state = reactive({ search: '', active: 0, tabs: [ { title: '全部' }, { title: '电子数码' }, { title: '书籍教材' }, { title: '服装鞋包' }, { title: '生活用品' }, { title: '其他' } ], list: [], page: 1, limit: 10, finished: false, loading: false }) const fetchList = async () => { state.loading = true const res = await getGoodsList({ page: state.page, limit: state.limit, category: state.active === 0 ? undefined : state.active }) state.list = [...state.list, ...res.data] state.loading = false state.page += 1 state.finished = res.data.length < state.limit } const goToDetail = (item) => { console.log(item) } onMounted(() => { fetchList() }) return { ...toRefs(state), fetchList, goToDetail } } } </script> <style scoped> .home { padding: 10px; } </style> ``` 在`Home`组件中,我们使用了`vant`提供的`Search`、`Tabs`、`List`和`Cell`组件来实现页面的布局和显示商品列表。其中,`Search`组件用来实现搜索功能,`Tabs`组件用来实现商品分类切换,`List`组件用来展示商品列表,`Cell`组件用来展示每个商品的信息。我们还使用了`reactive`函数和`toRefs`函数来实现响应式数据的定义和导出。 在`Home`组件中,我们还定义了`fetchList`函数来获取商品列表数据,并且使用了`onMounted`钩子函数来在组件挂载后自动获取商品列表数据。我们还定义了`goToDetail`函数来跳转到商品详情页面,具体实现可以根据您的需要进行修改。 接下来,我们创建一个`Publish`组件作为商品发布页面的界面,代码如下: ```vue <template> <div class="publish"> <van-field label="商品名称" v-model="name" /> <van-field label="商品价格" v-model="price" type="number" /> <van-field label="商品分类" v-model="category" placeholder="请选择" :readonly="true" @click="showPopup" /> <van-popup v-model="show" position="bottom"> <van-picker :columns="categories" @confirm="onConfirm" @cancel="onCancel" /> </van-popup> <van-field label="商品描述" v-model="description" type="textarea" rows="4" /> <van-uploader :after-read="afterRead" :max-count="3" :preview-image="true" /> <van-button type="primary" block @click="submit">发布商品</van-button> </div> </template> <script> import { reactive, toRefs } from 'vue' import { Field, Popup, Picker, Uploader, Button } from 'vant' import { createGoods } from '@/api/goods' export default { name: 'Publish', components: { Field, Popup, Picker, Uploader, Button }, setup() { const state = reactive({ name: '', price: '', category: '', categories: [ { text: '电子数码', value: 1 }, { text: '书籍教材', value: 2 }, { text: '服装鞋包', value: 3 }, { text: '生活用品', value: 4 }, { text: '其他', value: 5 } ], show: false, description: '', images: [] }) const showPopup = () => { state.show = true } const onConfirm = (value) => { state.category = state.categories[value[0] - 1].text state.show = false } const onCancel = () => { state.show = false } const afterRead = (file) => { state.images.push(file) } const submit = async () => { const formData = new FormData() formData.append('name', state.name) formData.append('price', state.price) formData.append('category', state.category) formData.append('description', state.description) state.images.forEach((image, index) => { formData.append(`image${index}`, image.file) }) await createGoods(formData) window.history.back() } return { ...toRefs(state), showPopup, onConfirm, onCancel, afterRead, submit } } } </script> <style scoped> .publish { padding: 10px; } </style> ``` 在`Publish`组件中,我们使用了`vant`提供的`Field`、`Popup`、`Picker`、`Uploader`和`Button`组件来实现页面的布局和实现商品发布功能。其中,`Field`组件用来实现输入框的功能,`Popup`组件和`Picker`组件用来实现商品分类的选择功能,`Uploader`组件用来实现图片上传功能,`Button`组件用来实现提交按钮的功能。我们还使用了`reactive`函数和`toRefs`函数来实现响应式数据的定义和导出。 在`Publish`组件中,我们定义了`showPopup`函数、`onConfirm`函数和`onCancel`函数来实现商品分类选择功能,`afterRead`函数来实现图片上传功能,`submit`函数来实现商品发布功能。具体实现可以根据您的需要进行修改。 最后,我们需要在`router/index.js`文件中定义路由规则,代码如下: ```js import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue' import Publish from '../views/Publish.vue' const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/publish', name: 'Publish', component: Publish } ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes }) export default router ``` 现在,我们已经完成了不需要后端和API校园二手交易平台的首页和商品发布页面的界面和功能实现。接下来,您可以根据您的需要进行样式的美化和功能的完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值