用vue3和vant写一个不需要后端和api校园二手交易平台的首页,以及商品发布页面,要求俩个页面存在联动
时间: 2024-04-21 14:27:19 浏览: 168
好的,我会根据您的要求来为您编写一个不需要后端和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校园二手交易平台的首页和商品发布页面的界面和功能实现。接下来,您可以根据您的需要进行样式的美化和功能的完善。
阅读全文