Vue3项目实战 实现电商移动端地址管理的效果

地址管理案例实现

使用JSON-server增删改

● 新增axios.post('http://localhost:3000/address', 地址对象)

● 编辑axios.patch(`http://localhost:3000/address/${id}`, 需要修改的地址对象)

● 删除:axios.delete(`http://localhost:3000/address/${id}`)

● 查找

○ axios.get('http://localhost:300/address') 获取所有地址数据

○ axios.get(`http://localhost:3000/address/${id}`) 获取这个id对应详情

○ axios.get('http://localhost:300/address', { params: {id, name} }) 按照条件进行查询。模糊查询需要对象key上面加上_like比如姓名模糊搜索 { name_like: '' }

使用VantUIForm表单

● 渲染一个Form表单渲染同时做好双向绑定v-model能够方便快捷获取表单数据

○ Form表单结构

const onSubmit = (values) => {
    values就是当前的表单值
    比如保存数据:
    axios.post('http://localhost:3000/address', values)
}
<van-form @submit="onSubmit">
     <van-field />
     <van-field />
     <van-button round block type="primary" native-type="submit">
      提交
    </van-button>
</van-from>

■ 外层vant-form几个表单就有几个van-field

■ van-form一般都有一个提交按钮提交按钮点击时候触发van-formsubmit事件事件回调函数对应的参数就是Form表单的值

■ 注意form表单按钮只有配置native-typesubmit这个按钮被点击才能触发Form表单submit事件

○ Form表单如何回显数据

const form = reactive({
    name: '',
    age: ''
})

<van-form @submit="onSubmit">
    <van-field
      v-model="form.name"
      name="name"
      label="姓名" />
    <van-field
      v-model="form.age"
      name="age"
      label="年龄"
      placeholder="用户名"  />
</van-form>

// 获取详情然后回显
const res = await axios.get(`http://localhost:3000/address/${id}`)
form.age = res.data.age
form.name = res.data.name

某个地址设置默认

【一般全局只能一个地址默认

● 某个地址设置默认方法

cosnt setDefault = async (id, flag) => {
    await axios.patch(`http://localhost:3000/address/${id}`, { isDefault: flag }
}

● 考虑全局只有一个默认,这样设置

// 把已经是默认的设置为非默认,然后再把自己设置为默认
const setSingleDefault = async (id) => {
    const res = await axios.get('http://localhost:300/address', { params: {isDefault: true} }) 
    // 当前默认地址的id
    if (res.data.length > 0) {
        const currentDefaultId = res.data[0].id
        await setDefault(currentDefaultId, false)
    }
    await setDefault(id, true)
}

新增编辑公用一个组件

1.  新增编辑都是独立路由页面都有独立地址比如新增 /add编辑 /edit

2.  编辑需要带上数据id如果动态路由模式/edit/:id

3.  不同地址进入到同一个页面组件可以这样判断

<script setup>
const route = useRoute()
const { id } = route.params
const onSave = async () => {
    if (id) {
        // 如果URL参数上有id,说明当前是编辑
        await axios.patch(`http://localhost:3000/address/${id}`, form)
    } else {
        await axios.post('http://localhost:3000/address', form)
    }
}
onMounted(async () => {
    if (id) {
        // 编辑时,需要先回显数据
        const res = await axios.get(`http://localhost:3000/address/${id}`) 
        form.name = res.data.name
        form.age = res.data.age
    }
})
<script>

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值